diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 882acf789d..fc3f2852fc 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -6,15 +6,15 @@
#deathride58
/modular_citadel/ @deathride58
-/code/citadel/ @deathride58
#LetterJay
/modular_citadel/code/modules/client/loadout/__donator.dm @LetterJay
#Poojawa
-/code/modules/vore @Poojawa
-/code/citadel/dogborgstuff.dmm @Poojawa
+/modular_citadel/code/modules/vore @Poojawa
+/code/game/objects/items/devices/dogborg_sleeper.dm @Poojawa
+/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @Poojawa
/tgui/ @Poojawa
/modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm @Poojawa
/modular_citadel/code/game/objects/ids.dm @Poojawa
diff --git a/.gitignore b/.gitignore
index b1cb02811c..626ef179a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -198,3 +198,4 @@ tools/MapAtmosFixer/MapAtmosFixer/obj/x86/Debug/MapAtmosFixer.csproj.CoreCompile
#GitHub Atom
.atom-build.json
+cfg/admin.txt
diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
new file mode 100644
index 0000000000..87f890e0d5
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
@@ -0,0 +1,503 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/r_wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"c" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"d" = (
+/turf/closed/wall/r_wall/rust,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"e" = (
+/obj/machinery/defibrillator_mount/loaded,
+/turf/closed/wall/r_wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"f" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"g" = (
+/obj/structure/table,
+/obj/item/device/flashlight/lamp,
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"h" = (
+/obj/structure/table,
+/obj/item/pen,
+/obj/item/paper/fluff/ruins/exp_cloning/log,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"i" = (
+/obj/machinery/dna_scannernew,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"j" = (
+/obj/machinery/computer/prototype_cloning,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/item/paper/fluff/ruins/exp_cloning/manual,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"k" = (
+/obj/machinery/clonepod/experimental,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"l" = (
+/obj/effect/decal/cleanable/vomit/old,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"m" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"n" = (
+/obj/structure/sign/nanotrasen,
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"o" = (
+/obj/machinery/vending/snack/teal,
+/turf/open/floor/plasteel/airless/floorgrime,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"p" = (
+/turf/open/floor/plasteel/airless/floorgrime,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"q" = (
+/obj/structure/sign/directions/science{
+ dir = 8
+ },
+/turf/closed/wall/r_wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"r" = (
+/obj/effect/decal/remains/human,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"s" = (
+/obj/machinery/iv_drip,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"t" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/medical,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"u" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"v" = (
+/turf/open/floor/plasteel/whiteblue/corner{
+ dir = 4
+ },
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"w" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/plasteel/whiteblue/side{
+ dir = 1
+ },
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"x" = (
+/turf/open/floor/plasteel/whiteblue/side{
+ dir = 1
+ },
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"y" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/plasteel/whiteblue,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"z" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/whiteblue/corner{
+ dir = 1
+ },
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"A" = (
+/obj/structure/sign/departments/science,
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"B" = (
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"C" = (
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"D" = (
+/obj/structure/chair/comfy{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"E" = (
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"F" = (
+/obj/machinery/door/airlock/research/glass,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"G" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"H" = (
+/obj/machinery/door/airlock/research/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"I" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"J" = (
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"K" = (
+/obj/machinery/door/airlock/research/glass,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"L" = (
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg1"
+ },
+/area/space/nearstation)
+"M" = (
+/obj/structure/fluff/broken_flooring{
+ name = "broken plating";
+ icon_state = "plating";
+ dir = 8
+ },
+/turf/template_noop,
+/area/space/nearstation)
+"N" = (
+/obj/item/book/random/triple,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"O" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/bookcase/random/fiction,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"P" = (
+/obj/structure/table/glass,
+/obj/machinery/light,
+/obj/structure/bedsheetbin,
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"Q" = (
+/obj/structure/table/glass,
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"R" = (
+/obj/structure/table/glass,
+/obj/item/storage/firstaid/regular,
+/obj/item/device/healthanalyzer{
+ desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject.";
+ name = "prototype health analyzer"
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"S" = (
+/obj/structure/table/glass,
+/obj/item/storage/box/syringes,
+/turf/open/floor/plasteel/white,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"T" = (
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/ancient_shuttle)
+"U" = (
+/turf/open/floor/plating/airless{
+ icon_state = "platingdmg2"
+ },
+/area/space/nearstation)
+"V" = (
+/turf/closed/wall/r_wall/rust,
+/area/space/nearstation)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+c
+r
+D
+N
+c
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+c
+s
+E
+E
+c
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+d
+t
+E
+O
+d
+a
+a
+"}
+(7,1,1) = {"
+a
+a
+d
+b
+F
+d
+d
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+a
+b
+G
+b
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+a
+d
+d
+H
+b
+b
+a
+a
+"}
+(10,1,1) = {"
+a
+b
+b
+u
+I
+I
+c
+a
+a
+"}
+(11,1,1) = {"
+a
+c
+g
+v
+J
+J
+c
+a
+a
+"}
+(12,1,1) = {"
+a
+c
+h
+w
+J
+J
+d
+a
+a
+"}
+(13,1,1) = {"
+a
+d
+i
+x
+J
+P
+b
+a
+a
+"}
+(14,1,1) = {"
+a
+b
+j
+y
+J
+Q
+c
+a
+a
+"}
+(15,1,1) = {"
+a
+b
+k
+x
+J
+R
+c
+a
+a
+"}
+(16,1,1) = {"
+a
+e
+l
+x
+J
+S
+d
+a
+a
+"}
+(17,1,1) = {"
+a
+d
+m
+z
+J
+J
+d
+a
+a
+"}
+(18,1,1) = {"
+a
+d
+n
+A
+K
+T
+b
+a
+a
+"}
+(19,1,1) = {"
+a
+f
+o
+B
+p
+C
+V
+a
+a
+"}
+(20,1,1) = {"
+a
+f
+p
+p
+C
+U
+M
+a
+a
+"}
+(21,1,1) = {"
+a
+d
+q
+C
+L
+M
+a
+a
+a
+"}
+(22,1,1) = {"
+a
+a
+b
+f
+M
+a
+a
+a
+a
+"}
+(23,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/cit_map_files/BoxStation/BoxStation.dmm b/_maps/cit_map_files/BoxStation/BoxStation.dmm
index 11646eaa1a..279f479f10 100644
--- a/_maps/cit_map_files/BoxStation/BoxStation.dmm
+++ b/_maps/cit_map_files/BoxStation/BoxStation.dmm
@@ -78,7 +78,7 @@
/obj/item/device/plant_analyzer,
/obj/machinery/camera{
c_tag = "Prison Common Room";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/green/side{
dir = 5
@@ -243,7 +243,7 @@
/obj/structure/lattice,
/obj/structure/grille,
/turf/open/space,
-/area/space/nearstation)
+/area/space)
"aaU" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plasteel/floorgrime,
@@ -758,8 +758,7 @@
},
/obj/machinery/camera{
c_tag = "Head of Security's Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/recharger{
pixel_y = 4
@@ -817,7 +816,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 3";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/obj/item/device/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
@@ -848,7 +847,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 2";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/obj/item/device/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
@@ -870,7 +869,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 1";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/obj/item/device/radio/intercom{
desc = "Talk through this. It looks like it has been modified to not broadcast.";
@@ -933,7 +932,6 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/turf_decal/bot{
dir = 2
},
@@ -1605,7 +1603,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -1644,7 +1642,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -1652,7 +1650,7 @@
},
/obj/machinery/camera{
c_tag = "Prison Hallway";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/red/side{
dir = 1
@@ -1801,8 +1799,7 @@
"aeC" = (
/obj/machinery/camera{
c_tag = "Security Escape Pod";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/security/main)
@@ -2441,10 +2438,6 @@
},
/turf/open/floor/plating,
/area/security/main)
-"agd" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"agf" = (
/obj/structure/table,
/obj/item/stack/sheet/metal,
@@ -3441,8 +3434,7 @@
"aiq" = (
/obj/machinery/camera{
c_tag = "Security Office";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/computer/secure_data{
dir = 1
@@ -3865,7 +3857,7 @@
},
/obj/machinery/computer/security{
name = "Labor Camp Monitoring";
- network = list("Labor")
+ network = list("labor")
},
/turf/open/floor/plasteel,
/area/security/processing)
@@ -4580,15 +4572,13 @@
/area/engine/atmos)
"aln" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2";
- shuttledocked = 1
+ req_access_txt = "2"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/dark,
/area/security/processing)
"alp" = (
/turf/open/floor/plating,
@@ -5356,7 +5346,7 @@
/area/maintenance/fore/secondary)
"anE" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
req_access_txt = "13"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -5395,17 +5385,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port/fore)
-"anN" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
- name = "Labor Camp Shuttle Airlock";
- shuttledocked = 1
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/processing)
"anO" = (
/obj/docking_port/stationary{
dir = 8;
@@ -7388,7 +7367,7 @@
/obj/machinery/camera{
c_tag = "Auxillary Mining Base";
dir = 8;
- network = list("SS13","AuxBase")
+ network = list("ss13","auxbase")
},
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
@@ -7673,8 +7652,7 @@
/obj/structure/table/wood,
/obj/machinery/camera{
c_tag = "Law Office";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/item/paper_bin{
pixel_x = -3;
@@ -7685,7 +7663,7 @@
desc = "Used for watching Prison Wing holding areas.";
dir = 1;
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = -27
},
/turf/open/floor/wood,
@@ -8915,7 +8893,7 @@
desc = "Used for the Auxillary Mining Base.";
dir = 8;
name = "Auxillary Base Monitor";
- network = list("AuxBase");
+ network = list("auxbase");
pixel_x = 28
},
/turf/open/floor/plasteel/yellow/side{
@@ -10504,8 +10482,7 @@
"aBh" = (
/obj/machinery/camera{
c_tag = "EVA Maintenance";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light/small{
dir = 4
@@ -10973,8 +10950,7 @@
"aCp" = (
/obj/machinery/camera{
c_tag = "Arrivals North";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/cable{
icon_state = "1-2"
@@ -11963,8 +11939,7 @@
"aER" = (
/obj/machinery/camera{
c_tag = "Gateway";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/table,
/obj/structure/sign/warning/biohazard{
@@ -12319,8 +12294,7 @@
"aFO" = (
/obj/machinery/camera{
c_tag = "Garden";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/airalarm{
dir = 8;
@@ -12435,7 +12409,7 @@
/obj/machinery/camera/motion{
c_tag = "Vault";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/light,
/turf/open/floor/plasteel/vault/corner{
@@ -12933,8 +12907,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel Office";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
@@ -13432,8 +13405,7 @@
/obj/structure/chair/office/dark,
/obj/machinery/camera{
c_tag = "Library North";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -15079,8 +15051,7 @@
"aMM" = (
/obj/machinery/camera{
c_tag = "Chapel North";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
@@ -16856,8 +16827,7 @@
"aRP" = (
/obj/machinery/camera{
c_tag = "Library South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/wood,
/area/library)
@@ -16972,8 +16942,7 @@
"aSf" = (
/obj/machinery/camera{
c_tag = "Arrivals Hallway";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
@@ -17276,8 +17245,7 @@
},
/obj/machinery/camera{
c_tag = "Bar";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/table,
/obj/machinery/chem_dispenser/drinks,
@@ -17465,8 +17433,7 @@
},
/obj/machinery/camera{
c_tag = "Locker Room East";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light{
dir = 4
@@ -17607,7 +17574,7 @@
/area/bridge)
"aUd" = (
/obj/machinery/computer/security/mining{
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/turf/open/floor/plasteel/brown{
dir = 6
@@ -17626,8 +17593,7 @@
},
/obj/machinery/camera{
c_tag = "Bar West";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
@@ -17756,8 +17722,7 @@
"aUy" = (
/obj/machinery/camera{
c_tag = "Vacant Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/wood,
/area/security/vacantoffice)
@@ -17843,8 +17808,7 @@
"aUM" = (
/obj/machinery/camera{
c_tag = "Arrivals Bay 2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
@@ -18006,8 +17970,7 @@
},
/obj/machinery/camera{
c_tag = "Fore Primary Hallway";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/red/corner{
@@ -18336,8 +18299,7 @@
"aVV" = (
/obj/machinery/camera{
c_tag = "Chapel South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
@@ -19613,8 +19575,7 @@
"aYT" = (
/obj/machinery/camera{
c_tag = "Hydroponics South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel,
@@ -19739,8 +19700,7 @@
"aZm" = (
/obj/machinery/camera{
c_tag = "Escape Arm Airlocks";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -20486,8 +20446,7 @@
"bbr" = (
/obj/machinery/camera{
c_tag = "Locker Room South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -20554,8 +20513,7 @@
"bbA" = (
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway 2";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/white/corner{
dir = 1
@@ -20846,8 +20804,7 @@
"bcr" = (
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
@@ -20884,8 +20841,7 @@
"bcx" = (
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway 5";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
@@ -21155,8 +21111,7 @@
"bdn" = (
/obj/machinery/camera{
c_tag = "Central Hallway East";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/disposalpipe/segment,
/obj/machinery/status_display{
@@ -22443,8 +22398,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo Delivery Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/requests_console{
department = "Cargo Bay";
@@ -22628,8 +22582,7 @@
"bhc" = (
/obj/machinery/camera{
c_tag = "Chemistry";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/firealarm{
dir = 2;
@@ -22668,8 +22621,7 @@
"bhj" = (
/obj/machinery/camera{
c_tag = "Security Post - Medbay";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/requests_console{
department = "Security";
@@ -23335,7 +23287,7 @@
/obj/machinery/camera{
c_tag = "Robotics Lab";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/button/door{
dir = 2;
@@ -23377,8 +23329,7 @@
"biS" = (
/obj/machinery/camera{
c_tag = "Research Division Access";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/sink{
dir = 4;
@@ -23417,7 +23368,7 @@
/obj/machinery/camera{
c_tag = "Research and Development";
dir = 2;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_x = 22
},
/obj/machinery/button/door{
@@ -23657,8 +23608,7 @@
"bjy" = (
/obj/machinery/camera{
c_tag = "Gravity Generator Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -23858,8 +23808,7 @@
"bkb" = (
/obj/machinery/camera{
c_tag = "Medbay Morgue";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/airalarm{
dir = 8;
@@ -24384,8 +24333,7 @@
/obj/structure/table/reinforced,
/obj/machinery/camera{
c_tag = "Medbay Foyer";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/cell_charger,
/turf/open/floor/plasteel/white,
@@ -25488,7 +25436,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/obj/machinery/disposal/bin,
@@ -26785,8 +26733,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay West";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -27065,7 +27012,7 @@
/obj/machinery/camera{
c_tag = "Experimentor Lab";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/item/hand_labeler,
/obj/item/stack/packageWrap,
@@ -27194,8 +27141,7 @@
/obj/item/device/multitool,
/obj/machinery/camera{
c_tag = "Cargo Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel,
/area/quartermaster/office)
@@ -27473,7 +27419,6 @@
/obj/machinery/camera{
c_tag = "Medbay East";
dir = 8;
- network = list("SS13");
pixel_y = -22
},
/turf/open/floor/plasteel/white,
@@ -27654,7 +27599,7 @@
/obj/machinery/camera{
c_tag = "Robotics Lab - South";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
@@ -27935,8 +27880,7 @@
"btA" = (
/obj/machinery/camera{
c_tag = "Research Division West";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -28796,7 +28740,7 @@
/obj/machinery/camera{
c_tag = "Genetics Research";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/firealarm{
dir = 1;
@@ -28831,7 +28775,6 @@
/obj/machinery/camera{
c_tag = "Genetics Access";
dir = 8;
- network = list("SS13");
pixel_y = -22
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -29065,8 +29008,7 @@
"bwf" = (
/obj/machinery/camera{
c_tag = "Cargo Bay Entrance";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/brown/corner{
@@ -29288,8 +29230,7 @@
/obj/structure/table/glass,
/obj/machinery/camera{
c_tag = "Medbay Cryogenics";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/item/reagent_containers/glass/beaker/cryoxadone,
/obj/item/reagent_containers/glass/beaker/cryoxadone,
@@ -29307,8 +29248,7 @@
"bwL" = (
/obj/machinery/camera{
c_tag = "Genetics Cloning";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/table,
/obj/machinery/firealarm{
@@ -29563,7 +29503,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office.";
name = "Research Monitor";
- network = list("RD","MiniSat");
+ network = list("rd","minisat");
pixel_y = 2
},
/obj/structure/table,
@@ -30206,7 +30146,7 @@
},
/obj/machinery/computer/security/mining{
dir = 8;
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -30503,7 +30443,7 @@
/obj/machinery/camera{
c_tag = "Server Room";
dir = 2;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_x = 22
},
/obj/machinery/power/apc{
@@ -30558,7 +30498,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons from the safety of your own office.";
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = 2
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -30879,8 +30819,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay Treatment Center";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel,
/area/medical/sleeper)
@@ -30983,7 +30922,7 @@
/obj/machinery/camera{
c_tag = "Security Post - Science";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/newscaster{
pixel_x = -30
@@ -31100,7 +31039,7 @@
"bAS" = (
/obj/machinery/computer/security/mining{
dir = 4;
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/obj/machinery/camera{
c_tag = "Quartermaster's Office";
@@ -31671,7 +31610,7 @@
/obj/machinery/camera{
c_tag = "Research Director's Office";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/item/device/radio/intercom{
name = "Station Intercom (General)";
@@ -31708,7 +31647,7 @@
/obj/machinery/camera{
c_tag = "Experimentor Lab Chamber";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/light,
/obj/structure/sign/warning/nosmoking{
@@ -31915,8 +31854,7 @@
/obj/structure/closet/secure_closet/medical3,
/obj/machinery/camera{
c_tag = "Medbay Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
@@ -31998,8 +31936,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay South";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -32291,8 +32228,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay Recovery Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/iv_drip,
/turf/open/floor/plasteel/white,
@@ -32538,7 +32474,6 @@
/obj/machinery/camera{
c_tag = "Chief Medical Office";
dir = 8;
- network = list("SS13");
pixel_y = -22
},
/turf/open/floor/plasteel/barber,
@@ -32550,7 +32485,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Test Chamber";
dir = 2;
- network = list("Xeno","RD")
+ network = list("xeno","rd")
},
/obj/machinery/light{
dir = 1
@@ -32641,7 +32576,7 @@
/obj/machinery/camera{
c_tag = "Toxins Lab West";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -32751,12 +32686,11 @@
/area/maintenance/port/fore)
"bEK" = (
/obj/machinery/computer/security/mining{
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/obj/machinery/camera{
c_tag = "Mining Dock";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
@@ -33293,7 +33227,7 @@
/turf/open/floor/plating,
/area/science/mixing)
"bGd" = (
-/obj/machinery/doppler_array{
+/obj/machinery/doppler_array/research/science{
dir = 4
},
/obj/effect/turf_decal/bot{
@@ -33737,7 +33671,7 @@
/obj/machinery/camera{
c_tag = "Toxins Storage";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/floorgrime,
/area/science/storage)
@@ -33872,7 +33806,7 @@
dir = 8;
layer = 4;
name = "Test Chamber Telescreen";
- network = list("Toxins");
+ network = list("toxins");
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -33991,8 +33925,7 @@
"bHL" = (
/obj/machinery/camera{
c_tag = "Research Division South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/door/firedoor/heavy,
/turf/open/floor/plasteel/white/side{
@@ -34036,8 +33969,7 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/camera{
c_tag = "Aft Primary Hallway 2";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/caution/corner{
@@ -34134,7 +34066,6 @@
/obj/machinery/camera{
c_tag = "Surgery Operating";
dir = 1;
- network = list("SS13");
pixel_x = 22
},
/obj/machinery/light,
@@ -34512,13 +34443,6 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"bIP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair/comfy/black,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"bIQ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -35522,7 +35446,7 @@
"bKY" = (
/obj/machinery/computer/security/telescreen{
name = "Test Chamber Monitor";
- network = list("Xeno");
+ network = list("xeno");
pixel_y = 2
},
/obj/structure/table/reinforced,
@@ -35686,7 +35610,7 @@
invuln = 1;
light = null;
name = "Hardened Bomb-Test Camera";
- network = list("Toxins");
+ network = list("toxins");
use_power = 0
},
/obj/item/target/alien/anchored,
@@ -36533,7 +36457,7 @@
/obj/machinery/camera{
c_tag = "Toxins Lab East";
dir = 8;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_y = -22
},
/obj/effect/turf_decal/stripes/line{
@@ -36663,8 +36587,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics Monitoring";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/light{
dir = 4
@@ -36683,8 +36606,7 @@
"bNT" = (
/obj/machinery/camera{
c_tag = "Atmospherics North West";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light{
dir = 8
@@ -36833,8 +36755,7 @@
/obj/structure/closet/emcloset,
/obj/machinery/camera{
c_tag = "Virology Airlock";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -37370,7 +37291,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/chair/comfy/black,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"bPz" = (
@@ -37397,15 +37317,13 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPA" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/table/glass,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPB" = (
@@ -37495,10 +37413,10 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPI" = (
-/obj/structure/reagent_dispensers/watertank,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPJ" = (
@@ -37750,8 +37668,7 @@
"bQq" = (
/obj/machinery/camera{
c_tag = "Security Post - Engineering";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/item/device/radio/intercom{
dir = 4;
@@ -37924,7 +37841,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology North";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -37961,7 +37878,7 @@
/obj/machinery/camera{
c_tag = "Testing Lab North";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel,
/area/science/misc_lab)
@@ -38009,7 +37926,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 2;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = 28
},
/obj/item/device/integrated_circuit_printer,
@@ -38134,7 +38051,7 @@
dir = 8;
layer = 4;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("singularity");
pixel_x = 30
},
/turf/open/floor/plasteel/red/side{
@@ -38437,6 +38354,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bRZ" = (
@@ -38560,8 +38480,7 @@
/obj/structure/closet/emcloset,
/obj/machinery/camera{
c_tag = "Telecomms Monitoring";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -38903,7 +38822,7 @@
/obj/item/crowbar,
/obj/machinery/computer/security/telescreen{
name = "Test Chamber Monitor";
- network = list("Test");
+ network = list("test");
pixel_y = -30
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
@@ -39941,8 +39860,7 @@
"bVN" = (
/obj/machinery/camera{
c_tag = "Atmospherics Access";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light{
dir = 8
@@ -40144,6 +40062,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bWn" = (
@@ -40367,8 +40288,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics West";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/cable{
icon_state = "1-2"
@@ -40397,9 +40317,6 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWV" = (
@@ -40640,11 +40557,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/science/circuit)
-"bXu" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"bXv" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -40828,8 +40740,7 @@
"bXV" = (
/obj/machinery/camera{
c_tag = "Atmospherics East";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -41237,7 +41148,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology South";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
@@ -41625,6 +41536,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bZX" = (
@@ -41881,8 +41795,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics Central";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/components/binary/pump{
dir = 0;
@@ -42184,8 +42097,7 @@
"cbl" = (
/obj/machinery/camera{
c_tag = "Telecomms Server Room";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/dark/telecomms/mainframe,
/area/tcommsat/server)
@@ -42267,7 +42179,6 @@
/obj/machinery/camera{
c_tag = "Aft Primary Hallway 1";
dir = 8;
- network = list("SS13");
pixel_y = -22
},
/turf/open/floor/plasteel/yellow/corner{
@@ -42499,7 +42410,7 @@
/obj/machinery/camera{
c_tag = "Testing Chamber";
dir = 1;
- network = list("Test","RD")
+ network = list("test","rd")
},
/obj/machinery/light,
/turf/open/floor/engine,
@@ -42537,7 +42448,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 1;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = -28
},
/obj/item/device/integrated_circuit_printer,
@@ -42870,14 +42781,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"ccP" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"ccQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"ccR" = (
/obj/machinery/portable_atmospherics/pump,
/obj/effect/turf_decal/bot{
@@ -43473,8 +43376,7 @@
"cex" = (
/obj/machinery/camera{
c_tag = "Atmospherics South West";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -43784,20 +43686,6 @@
/obj/item/caution,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cfr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 2;
- external_pressure_bound = 140;
- pressure_checks = 0;
- name = "killroom vent"
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology Kill Room";
- dir = 4;
- network = list("SS13","RD")
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cfs" = (
/obj/machinery/door/airlock/maintenance/abandoned{
name = "Air Supply Maintenance";
@@ -43835,15 +43723,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating/airless,
/area/maintenance/solars/port/aft)
-"cfy" = (
-/obj/structure/rack,
-/obj/item/clothing/shoes/winterboots,
-/obj/item/clothing/suit/hooded/wintercoat,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cfz" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -43895,16 +43774,6 @@
dir = 5
},
/area/crew_quarters/heads/chief)
-"cfI" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/yellow/side{
- dir = 4
- },
-/area/engine/engineering)
"cfJ" = (
/obj/machinery/light/small{
dir = 1
@@ -44089,9 +43958,6 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"cgi" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cgj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/barricade/wooden,
@@ -44100,18 +43966,19 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cgk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/biohazard,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cgl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 2;
- external_pressure_bound = 120;
- name = "killroom vent"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/open/floor/circuit/killroom,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/engine,
/area/science/xenobiology)
"cgm" = (
/obj/structure/cable{
@@ -44122,17 +43989,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cgn" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- target_temperature = 80;
- dir = 2;
- on = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cgo" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -44207,13 +44063,13 @@
/area/engine/engineering)
"cgw" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgy" = (
/obj/machinery/light/small{
@@ -44283,32 +44139,22 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cgI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
"cgJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cgL" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgO" = (
/obj/structure/rack,
@@ -44322,17 +44168,6 @@
dir = 5
},
/area/crew_quarters/heads/chief)
-"cgQ" = (
-/obj/machinery/camera{
- c_tag = "Engineering East";
- dir = 8;
- network = list("SS13")
- },
-/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/plasteel/yellow/corner{
- dir = 4
- },
-/area/engine/engineering)
"cgR" = (
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -44531,13 +44366,6 @@
},
/turf/open/floor/plasteel/floorgrime,
/area/maintenance/disposal/incinerator)
-"cho" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"chp" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -44547,43 +44375,22 @@
},
/turf/closed/wall,
/area/maintenance/starboard/aft)
-"chq" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"chr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Kill Chamber";
+"chs" = (
+/obj/machinery/door/window/northleft{
+ base_state = "right";
+ dir = 8;
+ icon_state = "right";
+ name = "Containment Pen";
req_access_txt = "55"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"chs" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cht" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
},
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"chu" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
+/turf/open/floor/engine,
/area/science/xenobiology)
"chv" = (
/obj/structure/cable{
@@ -44693,25 +44500,24 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"chF" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/landmark/start/station_engineer,
+/obj/structure/chair/office/dark{
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chG" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chH" = (
/obj/structure/closet/firecloset,
@@ -44809,35 +44615,15 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"chV" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/tank/internals/emergency_oxygen/engi{
- pixel_x = 5
- },
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/glasses/meson/engine,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"chX" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/turf/open/floor/engine,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chY" = (
/obj/machinery/shieldgen,
@@ -44921,24 +44707,6 @@
"cig" = (
/turf/closed/wall,
/area/engine/engineering)
-"cii" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/suit/radiation,
-/obj/item/clothing/head/radiation,
-/obj/item/clothing/glasses/meson,
-/obj/item/device/geiger_counter,
-/obj/item/device/geiger_counter,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cij" = (
/obj/machinery/modular_computer/console/preset/engineering,
/obj/structure/cable{
@@ -44976,15 +44744,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
-"cip" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"ciq" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -44994,13 +44753,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/heads/chief)
-"cir" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
"cis" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
@@ -45128,7 +44880,7 @@
/obj/machinery/camera{
c_tag = "Turbine Chamber";
dir = 4;
- network = list("Turbine")
+ network = list("turbine")
},
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
@@ -45141,14 +44893,18 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"ciO" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/engineering_singularity_safety{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/item/book/manual/wiki/engineering_guide,
+/obj/item/book/manual/engineering_particle_accelerator{
+ pixel_x = -3;
+ pixel_y = -3
},
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"ciP" = (
/obj/structure/cable{
@@ -45286,17 +45042,10 @@
},
/obj/machinery/camera{
c_tag = "Chief Engineer's Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/vault,
/area/crew_quarters/heads/chief)
-"cjh" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"cji" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -45335,8 +45084,7 @@
"cjl" = (
/obj/machinery/camera{
c_tag = "Engineering MiniSat Access";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -45432,18 +45180,6 @@
/obj/item/cigbutt/roach,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cjB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/pen,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cjC" = (
/obj/structure/grille,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -45515,8 +45251,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering Secure Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/engine/engineering)
@@ -45531,7 +45266,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 6
+ },
/area/engine/engineering)
"cjP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -45552,7 +45289,7 @@
req_access = null;
req_access_txt = "10;13"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/engineering)
"cjS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -45574,7 +45311,7 @@
desc = "Used for watching the RD's goons from the safety of your own office.";
dir = 4;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_x = -24
},
/turf/open/floor/plasteel/vault,
@@ -45719,11 +45456,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/aft)
-"ckn" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cko" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
@@ -46197,8 +45929,7 @@
/obj/structure/chair/stool,
/obj/machinery/camera{
c_tag = "Aft Starboard Solar Control";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
@@ -46759,8 +46490,7 @@
},
/obj/machinery/camera{
c_tag = "SMES Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/dark,
@@ -46788,8 +46518,7 @@
"cnt" = (
/obj/machinery/camera{
c_tag = "Engineering West";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/cable{
icon_state = "1-2"
@@ -46805,16 +46534,11 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cnx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/structure/chair/sofa/left{
+ icon_state = "sofaend_left";
dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cny" = (
/obj/effect/landmark/start/station_engineer,
@@ -46999,8 +46723,7 @@
},
/obj/machinery/camera{
c_tag = "SMES Access";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -47049,15 +46772,12 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cnZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"coa" = (
@@ -47071,25 +46791,32 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cob" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"coc" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
+/obj/structure/table,
+/obj/item/electronics/airlock,
+/obj/item/electronics/airlock,
+/obj/item/electronics/apc,
+/obj/item/stock_parts/cell/high/plus,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/engine,
+/obj/item/stack/cable_coil,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cop" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
@@ -47258,38 +46985,27 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"coK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"coL" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coM" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
+/obj/structure/chair/office/dark,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"coL" = (
+/obj/structure/chair/office/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"coS" = (
/obj/structure/rack,
@@ -47455,50 +47171,37 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cpt" = (
-/obj/structure/table,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
+/area/engine/engineering)
+"cpu" = (
+/obj/item/book/manual/wiki/engineering_hacking{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/book/manual/wiki/engineering_construction,
/obj/item/clothing/gloves/color/yellow,
-/obj/item/storage/toolbox/electrical{
- pixel_y = 5
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/table/glass,
+/obj/item/device/flashlight,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cpx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/closet/radiation,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cpu" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cpv" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cpx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cpy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
+/obj/structure/sign/warning/radiation/rad_area,
+/turf/closed/wall/r_wall,
/area/engine/engineering)
"cpA" = (
/obj/structure/chair/office/dark{
@@ -47513,19 +47216,17 @@
/turf/open/floor/plasteel,
/area/bridge)
"cpD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/closet/secure_closet/engineering_welding,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cpE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cpG" = (
/obj/structure/table/optable,
@@ -47660,8 +47361,7 @@
"cpV" = (
/obj/machinery/camera{
c_tag = "Engineering Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/rnd/protolathe/department/engineering,
/turf/open/floor/plasteel,
@@ -47683,133 +47383,72 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cpZ" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_y = 5
- },
-/obj/item/device/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/obj/item/device/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"cqa" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cqb" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"cqc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+"cqb" = (
+/obj/structure/chair/sofa/right{
+ icon_state = "sofaend_right";
+ dir = 4
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cqd" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/structure/closet/radiation,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqe" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cqf" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"cqg" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Gas to Filter";
- on = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
- },
/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 1;
- network = list("SS13","Engine");
+ c_tag = "Engineering Center";
+ dir = 2;
+ network = list("ss13","engine");
pixel_x = 23
},
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
+/obj/machinery/light{
dir = 1
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqi" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqj" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_y = -24;
- req_access_txt = "10"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cql" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
+"cqh" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cqm" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+"cqi" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cqj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"cqn" = (
/obj/structure/grille,
@@ -47827,8 +47466,7 @@
"cqp" = (
/obj/machinery/camera{
c_tag = "Engineering Escape Pod";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/engine/engineering)
@@ -47906,54 +47544,39 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cqA" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access = null;
- req_access_txt = "10;13"
+"cqC" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cqD" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plating,
/area/engine/engineering)
-"cqB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cqE" = (
+/obj/structure/particle_accelerator/end_cap,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cqF" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
-"cqC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqD" = (
-/obj/structure/sign/warning/radiation,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cqE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cqF" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"cqG" = (
/obj/structure/rack,
/obj/item/storage/box/rubbershot{
@@ -48041,70 +47664,49 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cqS" = (
-/obj/machinery/light/small{
- dir = 8
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
},
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plating,
/area/engine/engineering)
"cqT" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cqU" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = 25;
+ req_access_txt = "11"
},
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cqY" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/engineering)
"cqZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cra" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Gas to Filter"
- },
-/obj/machinery/airalarm/engine{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"crb" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- icon_state = "pump_map";
- name = "Gas to Chamber"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"crc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
+/obj/structure/particle_accelerator/fuel_chamber,
+/turf/open/floor/plating,
/area/engine/engineering)
-"crd" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
+"cra" = (
+/obj/machinery/particle_accelerator/control_box,
+/obj/structure/cable/yellow,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crb" = (
+/obj/effect/landmark/start/station_engineer,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crc" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Starboard Fore";
+ dir = 2;
+ network = list("engine")
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"crh" = (
/obj/effect/turf_decal/stripes/line{
@@ -48167,40 +47769,38 @@
/turf/open/floor/plating,
/area/engine/engineering)
"crs" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = -7
},
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = -7
+ },
+/obj/item/crowbar,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"crt" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/structure/particle_accelerator/power_box,
+/turf/open/floor/plating,
+/area/engine/engineering)
"cru" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"crv" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/item/screwdriver,
+/turf/open/floor/plating,
+/area/engine/engineering)
"crw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
/area/engine/engineering)
"cry" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -48288,43 +47888,34 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/aft)
-"crH" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
"crI" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"crJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"crK" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/turf/closed/wall/r_wall,
+/obj/structure/chair/stool,
+/turf/open/floor/plating,
/area/engine/engineering)
-"crL" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
+"crJ" = (
+/obj/machinery/light/small{
+ dir = 8;
+ light_color = "#fff4bc"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"crM" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#fff4bc"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/plating,
/area/engine/engineering)
"crP" = (
/obj/machinery/light,
@@ -48337,25 +47928,12 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
-"crT" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"crU" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
"crV" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"crW" = (
/obj/machinery/light/small{
@@ -48375,38 +47953,29 @@
/obj/structure/transit_tube,
/turf/open/floor/plating,
/area/engine/engineering)
-"crZ" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"csa" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csb" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csc" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/space,
/area/maintenance/aft)
"csd" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cse" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csg" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -48425,17 +47994,10 @@
},
/turf/open/space,
/area/space/nearstation)
-"csj" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"csk" = (
/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/closed/wall/r_wall,
+/area/science/xenobiology)
"csl" = (
/obj/structure/transit_tube/curved{
dir = 4
@@ -48462,7 +48024,7 @@
desc = "Used for watching the turbine vent.";
dir = 1;
name = "turbine vent monitor";
- network = list("Turbine");
+ network = list("turbine");
pixel_y = -29
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
@@ -48492,26 +48054,22 @@
/turf/open/floor/plasteel/floorgrime,
/area/maintenance/disposal/incinerator)
"css" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
-"csu" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"csv" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csx" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csy" = (
/obj/structure/table,
/obj/item/weldingtool,
@@ -48520,19 +48078,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"csA" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
"csD" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -48544,24 +48089,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/aft)
-"csH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"csI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"csM" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
@@ -48579,27 +48106,9 @@
/area/ai_monitored/turret_protected/aisat_interior)
"csP" = (
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 1
},
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"csR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -48696,7 +48205,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Pod Access";
dir = 1;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -48978,7 +48487,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Teleporter";
dir = 1;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -49033,7 +48542,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat Foyer";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
@@ -49213,7 +48722,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Atmospherics";
dir = 4;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/airalarm{
@@ -49253,7 +48762,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Antechamber";
dir = 4;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/turretid{
@@ -49342,7 +48851,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Service Bay";
dir = 8;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/airalarm{
@@ -49772,7 +49281,7 @@
/obj/machinery/camera{
c_tag = "MiniSat External NorthWest";
dir = 8;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/turf/open/space,
@@ -49819,7 +49328,7 @@
/obj/machinery/camera{
c_tag = "MiniSat External NorthEast";
dir = 4;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/turf/open/space,
@@ -49835,7 +49344,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat Core Hallway";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/firealarm{
dir = 8;
@@ -50213,7 +49722,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat AI Chamber North";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
@@ -50336,7 +49845,7 @@
/area/shuttle/pod_1)
"cxG" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
name = "Escape Pod Three";
req_access_txt = "0"
},
@@ -50346,15 +49855,21 @@
/turf/open/floor/plating,
/area/security/main)
"cxJ" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 8;
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security/glass{
name = "Labor Camp Shuttle Airlock";
req_access_txt = "2"
},
+/obj/machinery/button/door{
+ id = "prison release";
+ name = "Labor Camp Shuttle Lockdown";
+ pixel_y = -25;
+ req_access_txt = "2"
+ },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/dark,
/area/security/processing)
"cxN" = (
/obj/structure/cable{
@@ -50370,16 +49885,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
-"cxP" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 8;
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
"cxR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/spawner/structure/window/reinforced,
@@ -50629,18 +50134,14 @@
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat_interior)
-"czE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"czF" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"czG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -50722,11 +50223,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
-"czQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"czR" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -50874,97 +50370,40 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cAl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cAm" = (
+/obj/item/wirecutters,
/obj/structure/cable/yellow{
- icon_state = "1-4"
+ icon_state = "2-8"
},
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cAo" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAm" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cAo" = (
-/obj/structure/cable{
+/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAp" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Cooling Loop to Gas";
- on = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAq" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAr" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Gas to Mix";
- on = 0
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAs" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAt" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAu" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 4;
- state = 2
- },
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAy" = (
/obj/structure/closet/secure_closet/freezer/kitchen/maintenance,
@@ -51079,9 +50518,17 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"cAP" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = 25;
+ req_access_txt = "11"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"cAQ" = (
/obj/structure/chair,
/turf/open/floor/plating,
@@ -51147,7 +50594,7 @@
/obj/machinery/camera{
c_tag = "MiniSat External SouthWest";
dir = 8;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/turf/open/space,
@@ -51182,7 +50629,7 @@
/obj/machinery/camera{
c_tag = "MiniSat External SouthEast";
dir = 4;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/turf/open/space,
@@ -51212,7 +50659,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat AI Chamber South";
dir = 2;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
@@ -51244,7 +50691,7 @@
/obj/machinery/camera{
c_tag = "MiniSat External South";
dir = 2;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/turf/open/space,
@@ -51290,8 +50737,7 @@
"cBn" = (
/obj/machinery/camera{
c_tag = "Locker Room Toilets";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/freezer,
@@ -51496,10 +50942,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cBS" = (
/obj/structure/cable{
@@ -51675,89 +51118,6 @@
},
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
-"cCB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCC" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCD" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine";
- on = 0
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCE" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCF" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cCG" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCH" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCI" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCP" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCQ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCS" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"cCT" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -51777,77 +51137,33 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/closet/radiation,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cDh" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/device/flashlight,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/item/pipe_dispenser,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDi" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/suit/radiation,
-/obj/item/clothing/head/radiation,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDj" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -51864,90 +51180,39 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDo" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/item/pen,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
+/obj/item/paper_bin{
+ layer = 2.9
+ },
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cDt" = (
+/obj/structure/table,
+/obj/item/twohanded/rcl/pre_loaded,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cDw" = (
+/obj/structure/closet/secure_closet/engineering_electrical,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDp" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDr" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDs" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDv" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDw" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cDx" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/chair/sofa{
+ icon_state = "sofamiddle";
+ dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Atmos to Loop";
- on = 0
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDz" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
+/obj/structure/table,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDB" = (
@@ -51957,102 +51222,23 @@
/obj/effect/landmark/start/station_engineer,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDC" = (
-/obj/item/wrench,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDD" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External Gas to Loop"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"cDF" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External Gas to Loop"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDG" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDH" = (
-/obj/structure/rack,
-/obj/item/clothing/mask/gas{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas{
- pixel_x = -3;
- pixel_y = -3
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDI" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/turf/open/floor/plasteel/yellow/side{
dir = 4
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDL" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cDN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall,
-/area/engine/engineering)
-"cDY" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+"cDO" = (
+/obj/effect/turf_decal/stripes/line{
dir = 9
},
-/turf/open/space,
+/turf/open/floor/plating/airless,
/area/space/nearstation)
"cDZ" = (
/obj/structure/cable{
@@ -52062,824 +51248,139 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cEa" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cEd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Port";
- dir = 4;
- network = list("SS13","Engine")
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
-"cEe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEf" = (
-/obj/machinery/ai_status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cEg" = (
-/obj/machinery/status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cEh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 8;
- network = list("SS13","Engine")
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEk" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cEl" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"cEm" = (
/obj/machinery/vending/autodrobe,
/turf/open/floor/wood,
/area/maintenance/bar)
-"cEr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cEs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Gas to Cooling Loop";
- on = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEt" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEu" = (
-/obj/machinery/camera{
- c_tag = "Supermatter Chamber";
- dir = 2;
- network = list("Engine");
- pixel_x = 23
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEv" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEw" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEx" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEy" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEz" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEA" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Gas";
- on = 0
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cED" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEE" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"cEK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cEL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEM" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/item/tank/internals/plasma,
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cET" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/oil,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEW" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cFb" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
-/turf/open/floor/engine,
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cFc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cEv" = (
/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- icon_state = "pump_map";
- name = "Cooling Loop Bypass"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFe" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cFh" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cFj" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
+ icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/turf/open/floor/plating,
-/area/engine/supermatter)
-"cFk" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Mix Bypass"
- },
-/turf/open/floor/engine,
/area/engine/engineering)
-"cFm" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"cFn" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+"cEw" = (
+/obj/structure/particle_accelerator/particle_emitter/left,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cEx" = (
+/obj/structure/particle_accelerator/particle_emitter/right,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cEy" = (
+/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/turf/open/space,
-/area/space/nearstation)
-"cFo" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"cFu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cFw" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cFy" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+"cEK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/floor/engine,
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access = null;
+ req_access_txt = "10;13"
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
-"cFz" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+"cFb" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Port Fore";
+ dir = 2;
+ network = list("engine")
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cFA" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel/dark,
+"cFn" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFI" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFJ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFK" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/machinery/field/generator{
+ anchored = 1;
+ state = 2
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFN" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Aft";
- dir = 2;
- network = list("SS13","Engine");
- pixel_x = 23
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cFP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFT" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"cFU" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGd" = (
-/obj/structure/closet/crate/bin,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGe" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGf" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8;
- filter_type = "n2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGg" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGh" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGj" = (
-/obj/structure/table,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGk" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGl" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGt" = (
-/obj/structure/closet/wardrobe/engineering_yellow,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGu" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGx" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/obj/machinery/meter,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/components/binary/valve/digital{
- dir = 4;
- name = "Output Release";
- open = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGE" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGH" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGI" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Laser Room";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGK" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cGR" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGT" = (
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGU" = (
-/obj/structure/reflector/double/anchored{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGV" = (
-/obj/structure/reflector/box/anchored{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGZ" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1;
- volume_rate = 200
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cHa" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHc" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHd" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHe" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHg" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHj" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/machinery/power/emitter/anchored{
dir = 8;
state = 2
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHn" = (
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-4"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cHo" = (
-/obj/structure/reflector/single/anchored{
- dir = 9
+"cGh" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHp" = (
-/obj/structure/reflector/single/anchored{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHr" = (
-/obj/structure/cable{
+/obj/structure/cable/yellow{
icon_state = "1-8"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGr" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGE" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"cGV" = (
+/obj/machinery/the_singularitygen/tesla,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"cGZ" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cHD" = (
/obj/structure/cable{
@@ -53218,8 +51719,13 @@
/turf/open/floor/plating,
/area/security/brig)
"cMm" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cMC" = (
/obj/machinery/computer/security/telescreen{
@@ -53227,7 +51733,7 @@
dir = 8;
layer = 4;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("singularity");
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -53238,15 +51744,24 @@
},
/area/engine/engineering)
"cMD" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cMH" = (
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cMN" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plating,
-/area/engine/supermatter)
+/area/engine/engineering)
+"cMH" = (
+/obj/structure/particle_accelerator/particle_emitter/center,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cMN" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cMQ" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -53454,6 +51969,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"cQZ" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cSz" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53479,41 +52000,23 @@
/turf/open/floor/plasteel/dark/telecomms/mainframe,
/area/tcommsat/server)
"cSG" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plating,
+/area/engine/engineering)
"cSH" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
},
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cSI" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSJ" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"cSK" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"cSL" = (
/obj/machinery/button/door{
id = "atmos";
@@ -53823,18 +52326,6 @@
},
/turf/open/floor/plating,
/area/science/xenobiology)
-"cTY" = (
-/obj/structure/sign/poster/official/safety_internals{
- pixel_x = -32
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"cTZ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"cVb" = (
/turf/closed/wall,
/area/hallway/secondary/service)
@@ -53944,6 +52435,13 @@
},
/turf/open/floor/plating,
/area/security/brig)
+"ejb" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
"ejX" = (
/obj/machinery/light{
dir = 1
@@ -53999,6 +52497,13 @@
icon_state = "wood-broken5"
},
/area/maintenance/bar)
+"eHD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"eRz" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -54014,6 +52519,11 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"fdi" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"fgi" = (
/turf/closed/wall,
/area/crew_quarters/cryopod)
@@ -54029,6 +52539,26 @@
/obj/machinery/bookbinder,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"fmO" = (
+/obj/structure/window/reinforced,
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "xenobio7";
+ name = "Containment Blast Doors";
+ pixel_y = 4;
+ req_access_txt = "55"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"fmW" = (
/obj/effect/turf_decal/loading_area/white,
/obj/effect/turf_decal/stripes/white/corner{
@@ -54057,9 +52587,16 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
-"fsQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
+"fFB" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/engine/engineering)
"fIx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -54124,6 +52661,9 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/showroomfloor,
/area/space)
+"gre" = (
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"gtB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54227,18 +52767,61 @@
/obj/structure/closet/bombcloset/security,
/turf/open/floor/plasteel/showroomfloor,
/area/space)
+"hmW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"hyz" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/effect/turf_decal/bot{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"hCi" = (
/obj/structure/lattice,
/turf/open/space/basic,
/area/space)
+"hDa" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"hMa" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access = null;
+ req_access_txt = "10;13"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"hQd" = (
+/turf/open/space/basic,
+/area/engine/engineering)
"hSW" = (
/turf/open/floor/plasteel/red/side,
/area/security/brig)
-"ijc" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+"ieW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"ilg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood{
@@ -54255,6 +52838,14 @@
/obj/machinery/droneDispenser,
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
+"iqO" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Port Aft";
+ dir = 1;
+ network = list("engine")
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"itG" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
@@ -54330,7 +52921,7 @@
/obj/machinery/camera{
c_tag = "Circuitry Lab";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel,
/area/science/circuit)
@@ -54368,6 +52959,10 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
+"jyX" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
"jAD" = (
/obj/structure/grille,
/turf/open/floor/plating/airless,
@@ -54412,15 +53007,6 @@
dir = 9
},
/area/security/brig)
-"jMY" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil{
- pixel_x = 3;
- pixel_y = -7
- },
-/obj/item/stack/cable_coil,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"jSO" = (
/obj/machinery/light{
dir = 4
@@ -54439,6 +53025,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"jZh" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"khb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -54449,7 +53042,7 @@
/area/hallway/secondary/service)
"khB" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
req_access_txt = "13"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -54519,6 +53112,12 @@
icon_state = "wood-broken7"
},
/area/maintenance/bar)
+"kNw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"kPd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
@@ -54534,13 +53133,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
-"kQq" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"kSb" = (
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -54707,27 +53299,56 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
-"mBv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "Output to Waste"
- },
-/turf/open/floor/engine,
+"mzz" = (
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"mHd" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/maintenance/bar)
+"mHe" = (
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/engine,
+/area/science/xenobiology)
+"mLm" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"mMg" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"mNi" = (
/obj/machinery/light_switch{
pixel_x = -20
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"mQs" = (
+/obj/machinery/power/emitter/anchored{
+ dir = 4;
+ state = 2
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"mRe" = (
/obj/machinery/light{
dir = 8
@@ -54741,6 +53362,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/maintenance/fore/secondary)
+"mWO" = (
+/turf/open/floor/plating/airless,
+/area/space)
"mXj" = (
/turf/open/floor/plasteel/showroomfloor,
/area/space)
@@ -54750,10 +53374,6 @@
"nnM" = (
/turf/closed/wall/r_wall,
/area/security/armory)
-"noK" = (
-/obj/structure/girder,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"nsq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54762,6 +53382,26 @@
dir = 8
},
/area/security/brig)
+"nvr" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "xenobio0";
+ name = "Containment Blast Doors";
+ pixel_y = 4;
+ req_access_txt = "55"
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"nwx" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -54787,10 +53427,6 @@
},
/turf/open/floor/plasteel/floorgrime,
/area/security/brig)
-"nzh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"nAv" = (
/obj/structure/table,
/obj/item/grenade/barrier{
@@ -54862,6 +53498,13 @@
/obj/item/device/electropack/shockcollar,
/turf/open/floor/plating,
/area/maintenance/bar)
+"oaS" = (
+/obj/effect/landmark/start/station_engineer,
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"obC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -54932,10 +53575,19 @@
dir = 10
},
/area/security/brig)
-"oDF" = (
-/obj/machinery/light,
+"oAQ" = (
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
+"oHi" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"oHU" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -54959,6 +53611,21 @@
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"oUs" = (
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = -25;
+ req_access_txt = "11"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"oZl" = (
/turf/open/floor/plasteel/purple/side{
tag = "icon-purple (NORTH)";
@@ -55002,6 +53669,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"pmD" = (
+/turf/open/space/basic,
+/area/space/nearstation)
"pzG" = (
/obj/structure/sign/poster/random{
pixel_x = -32
@@ -55168,6 +53838,14 @@
/obj/item/device/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
+"riY" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Starboard Aft";
+ dir = 1;
+ network = list("engine")
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"rmX" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/beer,
@@ -55210,11 +53888,22 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"rNn" = (
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"rWu" = (
/turf/open/floor/wood{
icon_state = "wood-broken6"
},
/area/maintenance/bar)
+"rZV" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"saK" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -55227,6 +53916,20 @@
/obj/item/gun/energy/laser/practice,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"spp" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/bot{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"srd" = (
/turf/open/floor/plasteel/red/corner{
dir = 4
@@ -55249,6 +53952,31 @@
/obj/item/shovel/spade,
/turf/open/floor/plasteel/hydrofloor,
/area/hallway/secondary/service)
+"syV" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
+"sAz" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"sGJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood{
@@ -55315,6 +54043,12 @@
/obj/structure/chair/office/light,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"sWi" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"sXy" = (
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
@@ -55378,6 +54112,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/space/nearstation)
+"tHc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"tMl" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/showroomfloor,
@@ -55408,21 +54148,14 @@
/obj/item/storage/box/drinkingglasses,
/turf/open/floor/wood,
/area/maintenance/bar)
-"udp" = (
-/obj/item/crowbar/large,
-/obj/structure/rack,
-/obj/item/device/flashlight,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"uhH" = (
-/obj/item/wrench,
-/obj/item/weldingtool,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
+"ugZ" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
},
-/obj/structure/rack,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"ujc" = (
/obj/machinery/vending/cigarette,
@@ -55462,7 +54195,7 @@
/obj/item/screwdriver,
/obj/machinery/camera{
c_tag = "Circuitry Lab North";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
@@ -55480,6 +54213,20 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"uuA" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -2
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"uvc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
@@ -55487,6 +54234,12 @@
"uvy" = (
/turf/closed/wall/r_wall,
/area/space)
+"uAt" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/yellow/side,
+/area/engine/engineering)
"uMX" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -55566,6 +54319,12 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
+"vie" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"vxh" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance{
@@ -55596,6 +54355,13 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"vHQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"vNJ" = (
/obj/machinery/vending/clothing,
/turf/open/floor/wood,
@@ -55819,6 +54585,22 @@
/obj/effect/spawner/lootdrop/grille_or_trash,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"xJs" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"xMh" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xTa" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -55847,6 +54629,14 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"yam" = (
+/obj/effect/landmark/start/atmospheric_technician,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"yck" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/space)
"ycu" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -55871,6 +54661,9 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/security/armory)
+"ymd" = (
+/turf/open/floor/plasteel/dark,
+/area/security/processing)
(1,1,1) = {"
aaa
@@ -78826,10 +77619,10 @@ abc
abc
afu
abc
-aaa
-aaa
-aaa
-aaa
+abc
+abc
+abc
+abc
aaa
aaa
aaa
@@ -79095,7 +77888,7 @@ aln
aiU
aaa
aiU
-anN
+aln
aiU
aaa
aaa
@@ -79203,8 +77996,8 @@ aaa
aaa
aaa
aaa
-aaT
-aaT
+aaa
+aaa
aaa
aaa
aaa
@@ -79348,11 +78141,11 @@ aaf
aaf
aaf
aiU
-alp
+ymd
aiU
aaa
aiU
-alp
+ymd
aiU
aaf
aaf
@@ -79448,21 +78241,21 @@ cjJ
aaa
aaa
crn
-aaf
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-aaf
-ctv
-aaT
-aaT
aaa
aaa
aaa
@@ -79609,7 +78402,7 @@ cxJ
aiU
aiT
aiU
-cxP
+cxJ
aiU
aiV
aiT
@@ -79705,21 +78498,21 @@ cjJ
aaa
aaa
crn
-aaf
-aaT
-ctv
-ctv
-ctv
-ctv
-ctv
-ctv
-ctv
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-aaf
-ctv
-ctv
-aaT
aaa
aaa
aaa
@@ -79962,20 +78755,20 @@ cjJ
aaf
aaf
cig
-aaf
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaf
-aaf
-aaf
-aaf
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80220,17 +79013,17 @@ ccw
ccw
ccw
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaa
-aaf
aaa
aaa
aaa
-aaf
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80477,19 +79270,19 @@ cqw
cqO
crp
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaa
-aaf
aaa
aaa
aaa
-aaT
-aaT
-aaT
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80733,20 +79526,20 @@ cgR
cgR
cqN
cro
-cEl
-cEE
-cEl
-cFm
-csx
-cFm
-cFm
-csx
-csv
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
-aaT
-ctv
-aaT
aaa
aaa
aaa
@@ -80990,20 +79783,20 @@ ciN
cji
cDZ
crr
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -81243,24 +80036,24 @@ ccw
cfL
coH
cBO
-cgR
+cnv
cDB
cqP
crq
-crZ
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
-aaT
-ctv
-aaT
aaa
aaa
aaa
@@ -81504,21 +80297,21 @@ cgR
cqx
cqR
crp
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
-aaa
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+hCi
aaa
aaa
aaa
@@ -81761,25 +80554,25 @@ cpX
cqz
cqQ
ccw
-crH
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
+pmD
aaa
aaa
-aaT
-ctv
-aaT
+uvy
+uvy
+uvy
aaa
aaa
aaa
aaa
aaa
+uvy
+uvy
+uvy
+hCi
+hCi
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -82018,24 +80811,24 @@ clJ
cig
cig
ccw
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
-aaa
+pmD
+pmD
+uvy
+uvy
+uvy
+uvy
+uvy
aaa
aaa
aaa
+uvy
+uvy
+uvy
+uvy
+uvy
+hCi
+hCi
+hCi
aaa
aaa
aaa
@@ -82269,30 +81062,30 @@ ccw
ccw
ccw
cnZ
-coH
+oHi
+cpt
+cpt
cpt
-cpZ
-cig
cqS
ccw
-crH
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
-aaa
-aaa
-aaT
-ctv
-aaT
-aaa
-aaa
-aaf
-aaa
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+cpy
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -82528,28 +81321,28 @@ cnt
cob
coL
cDo
+oaS
cgR
-cqA
cqT
-csg
+ccw
crJ
-crU
+ccw
csb
cFn
css
+cFn
csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-aaT
-aaT
-gXs
-aaf
-aaf
-aaf
+ccw
+ccw
+ccw
+cGE
+cFn
+jZh
+mzz
+mzz
+ccw
+uvy
+yck
aaa
aaa
aaa
@@ -82786,27 +81579,27 @@ cgw
coK
cpu
cMm
-ccw
-ccw
-ccw
+ckH
+uAt
+hMa
crK
cEK
csa
-csj
-csa
-csa
+gre
+mQs
+gre
cGr
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+vHQ
+hDa
+vHQ
+mLm
+gre
+mQs
+gre
+gre
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -83039,31 +81832,31 @@ ckG
clJ
cmF
cgR
-cgI
+cnZ
chF
ciO
-cqc
-cqc
-cqc
-cEd
-cEr
-cEL
+oaS
+cgR
+cqT
+ccw
+cig
+ccw
cFb
-cFu
+gre
cFI
-cGd
-cGs
-cGr
+gre
+gre
+gre
+gre
+gre
+gre
+gre
+cFI
+gre
+iqO
ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-aaa
-eRz
-aaT
-eRz
+uvy
+fdi
aaa
aaa
aaa
@@ -83296,30 +82089,30 @@ cTa
ceZ
clQ
cgR
-cgx
-coM
-cpv
-cqb
-cqb
-cqb
-cqb
+cnZ
+oHi
+cgR
+cgR
+cgR
+cqT
+fFB
cEs
-cqb
-cqb
+gre
+rNn
cAp
-cqb
+xJs
cAo
-cGt
-cgx
-jMY
-csd
-cHa
-csd
-uhH
+xJs
+cAo
+xJs
+cAo
+xJs
+cQZ
+gre
+gre
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -83554,29 +82347,29 @@ cTd
ckF
ckF
cgK
-cDg
-cDp
-cqe
-cqB
-cqB
-cEe
+oHi
+cgR
+cgR
+cgR
+cqT
+fFB
csP
-cAl
-cFc
+gre
+gre
cAq
-cFJ
+mWO
cSH
-cGu
-cGH
-fsQ
-fsQ
-cGR
-csd
-csd
+mWO
+cSH
+mWO
+cSH
+mWO
+cSH
+mWO
+gre
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -83814,26 +82607,26 @@ cgJ
chG
cpx
cqd
-cDC
+cjc
cqU
-cEf
-cEt
-cEM
-csA
-cEg
+fFB
+csP
+gre
+rNn
+cAq
cFK
-cGe
-cGv
-cGI
-cGS
-cHb
-cHg
-cHn
-oDF
+aoV
+aoV
+cFK
+gXs
+aaa
+aoV
+aoV
+cFK
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaf
aaa
@@ -84067,30 +82860,30 @@ cig
cig
cTf
cgR
-ccw
+cnZ
cDh
cpy
-cDv
-cDD
-cqU
-cMD
-cEu
-cEz
-cEz
-cMD
-cFL
-cGf
-kQq
-cMm
-ciZ
-cHc
-cAu
-cAu
-ciZ
ccw
+hyz
+ccw
+ccw
+cqY
+cqY
+cqY
+cAq
+aoV
+aoV
+aoV
+hCi
+aaf
aaa
-aaT
-ctv
+aoV
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84324,30 +83117,30 @@ ckI
clJ
cmL
cBO
+cnZ
+cDh
ccw
-chV
-cpx
cqf
cqD
-cMD
+oUs
crs
cEv
-cEv
-cFe
-cMD
-cFM
-czE
-kQq
-ccw
-cGT
-csd
-csd
-csd
-csd
-ccw
+ugZ
+cqY
+cAq
+aoV
+aoV
+aaa
+aaa
aaf
-aaT
-ctv
+aaa
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84581,30 +83374,30 @@ ckK
clJ
cmL
cgR
-cgL
+cnZ
chX
-cpx
+spp
cqh
cqF
cra
crI
cEw
-cEw
-cEw
-cFw
-cFN
-csH
-csR
-cMm
-cGU
-csd
-csd
-cHo
-csd
-ccw
+ejb
+cqY
+cAq
aaa
-aaT
-ctv
+aaa
+aaa
+cDO
+cGU
+sWi
+aaa
+hCi
+cFK
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84838,30 +83631,30 @@ ckI
clJ
cmL
cnv
-cMm
-chX
-cpx
+cnZ
+eHD
+ccw
cqg
cqE
cqZ
crt
cMH
cAm
-cMH
+mMg
cMN
-cFO
-cSI
-cSI
-cMm
+gXs
+aaf
+aaf
+kNw
cGV
-csd
-cGV
-noK
-csd
+tHc
+aaf
+aaf
+gXs
+mWO
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -85095,30 +83888,30 @@ cfb
ccw
cmN
cgR
-cgL
-chX
-cpx
+cnZ
+eHD
+hyz
cqj
cSG
crb
cru
cEx
-cEx
-cEx
-cAP
-cFP
-csI
-cAt
-cMm
-csd
-csd
-csd
-cHp
-csd
+oAQ
+cqY
+cAq
+cFK
+hCi
+aaa
+hmW
+sAz
+ieW
+aaa
+aaa
+aaa
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -85352,30 +84145,30 @@ cfb
clM
cfz
cgR
+cnZ
+eHD
ccw
-cii
-cpx
cqi
cMD
cAP
-crv
-cEy
-cEy
-cFh
cMD
-cFM
-czE
-kQq
-ccw
-cGT
-csd
-csd
-csd
-csd
-ccw
+cMD
+cEy
+cqY
+cAq
+aoV
+aoV
+aaa
+aaa
aaf
-aaT
-ctv
+aaa
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -85609,30 +84402,30 @@ cfb
cfa
cje
cgR
+cnZ
+eHD
+cpy
ccw
-cDi
-cDr
-cDw
-cDE
-cEa
-cMD
-cEz
-cEz
-cEz
-cMD
-cFR
-cSJ
-kQq
-cMm
-ciZ
-cHd
-cHj
-cHd
-ciZ
+hyz
ccw
+ccw
+cqY
+cqY
+cqY
+cAq
+aoV
+aoV
aaa
-aaT
-ctv
+aaa
+aaf
+hCi
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -85866,30 +84659,30 @@ ckL
cmF
cje
cgR
-cMm
-chX
+cnZ
+cjS
cpD
cDw
cDF
cEa
-cEg
-cEA
-cET
-cFj
-cEf
-cFS
-cGg
-mBv
-cGI
-cGS
-cHe
-cHe
-cHr
-oDF
+fFB
+csP
+gre
+rNn
+cAq
+cFK
+aoV
+aaa
+aaa
+gXs
+cFK
+aoV
+aoV
+cFK
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaf
aaa
@@ -86123,30 +84916,30 @@ ceq
clQ
cje
cgR
-cMm
-cDj
-cDs
-cql
-cDG
-cDG
-cEh
-cEB
-cEU
-cFk
-cAs
-cFT
+cnZ
+cjS
+cgR
+cgR
+cgR
+cqT
+fFB
+csP
+gre
+gre
+cAq
+mWO
cSK
-cGx
-cGK
-nzh
-nzh
-cGY
-csd
-csd
+mWO
+cSK
+mWO
+cSK
+mWO
+cSK
+mWO
+gre
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -86380,30 +85173,30 @@ ckO
ckH
cja
cny
-ccw
-cip
+cnZ
+cjS
cnx
cDx
cqb
-cqb
-cqb
-cEC
-cqb
-cqb
+cqT
+fFB
+cEs
+gre
+rNn
cAr
-cqb
+xJs
cGh
-cGC
-cey
-ijc
-csd
-cEk
-csd
-udp
+xJs
+cGh
+xJs
+cGh
+xJs
+vie
+gre
+gre
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -86637,30 +85430,30 @@ cfb
clR
cgR
cgR
-cMm
-cir
+cnZ
+cjS
cDt
cDy
cqC
+cqT
+ccw
+ccw
+ccw
crc
-cEi
-cED
-crc
-crc
-cFy
+gre
cBR
-cGi
-cGD
-cGL
+gre
+gre
+gre
+gre
+gre
+gre
+gre
+cBR
+gre
+riY
ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-aaa
-aaT
-aaT
+uvy
aaT
aaa
aaa
@@ -86898,27 +85691,27 @@ cDe
cDk
coc
cqa
-cig
-ccw
-ccw
+uuA
+uAt
+hMa
czF
+cEK
csd
-csd
-cFz
+gre
cFU
-cGj
+gre
cGE
-cGM
+vHQ
cGZ
-aag
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+vHQ
+csx
+gre
+cFU
+gre
+gre
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -87154,28 +85947,28 @@ cgU
cgU
cis
cjN
-cDz
-cDH
-cMm
-csd
-crM
-crV
-crV
-cFA
-csd
-cGk
+cgR
+cgR
+cqT
ccw
-aag
-aag
-aag
-aaf
-aaf
-aaf
-aaf
-gXs
-aaf
-aaf
-aaf
+crM
+ccw
+crV
+cFn
+xMh
+cFn
+mLm
+ccw
+ccw
+ccw
+cGr
+cFn
+rZV
+mzz
+mzz
+ccw
+uvy
+yck
aaf
aaa
aaa
@@ -87407,32 +86200,32 @@ ccw
cet
cfd
cfB
-cfI
-cgQ
+cfB
+cfB
cjS
cjN
-cqm
cgR
-crd
-cEk
-crL
-cEW
-cse
-cse
-csu
-cGl
+cgR
+cqT
ccw
-aaa
-aaa
-aaf
-aaa
-aaf
-ctv
-aaT
-aaa
-aaa
-aaf
-aaa
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+cpy
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+jyX
+uvy
+hCi
aaa
aaa
aaa
@@ -87668,28 +86461,28 @@ ccw
ccw
cDl
cjN
-cjh
-cDI
+cgR
+cgR
+cgR
+cqS
ccw
ccw
ccw
ccw
ccw
-cMm
-cMm
-cMm
ccw
-aaf
-aaf
-aaf
-aaf
-aaf
-ctv
-aaT
-aaa
-aaa
-aaf
+hQd
+pmD
+pmD
+pmD
+uvy
+uvy
+uvy
+uvy
+uvy
aaa
+yck
+hCi
aaa
aaa
aaa
@@ -87926,7 +86719,7 @@ ccw
cDm
cjP
ckF
-cDJ
+ckF
ckF
cpE
cjR
@@ -87939,13 +86732,13 @@ aaa
aaa
aaa
aaa
-ctv
-ctv
-ctv
-aaT
-aaa
-aaa
-aaa
+pmD
+uvy
+uvy
+uvy
+hCi
+hCi
+hCi
aaa
aaa
aaa
@@ -88168,7 +86961,7 @@ caE
cbA
ccy
bOd
-bOd
+yam
bQu
cfO
cgW
@@ -88190,17 +86983,17 @@ ccw
crX
cfK
aag
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaT
-aaT
-aaT
-aaT
-aaa
+hCi
+hCi
+hCi
+hCi
+hCi
+hCi
+gXs
+gXs
+gXs
+gXs
+hCi
aaa
aaa
aae
@@ -88413,7 +87206,7 @@ bIF
bOZ
bQp
bRA
-bOd
+yam
bTO
bUL
bVU
@@ -88440,7 +87233,7 @@ ccw
cpa
cjc
cqo
-cDL
+ccw
cjk
cjm
ccw
@@ -88456,7 +87249,7 @@ aaa
aaa
aaa
aaa
-eRz
+gXs
aaa
aaa
aaa
@@ -88697,7 +87490,7 @@ ccw
ccw
cpI
ccw
-cDL
+ccw
cjl
cjQ
cjV
@@ -88954,7 +87747,7 @@ cig
cpb
ciZ
cqp
-cDN
+cig
cjT
cgR
crP
@@ -89211,7 +88004,7 @@ cig
cig
czg
cig
-cDN
+cig
crh
crA
crR
@@ -89468,7 +88261,7 @@ cig
cpc
cpJ
cpc
-cDN
+cig
cqY
cqY
cqY
@@ -89701,7 +88494,7 @@ bRF
bSM
bTS
bUQ
-agd
+bWa
bUO
bVZ
bVZ
@@ -89725,7 +88518,7 @@ cig
cpd
czM
cpd
-cDN
+cig
aaa
aaa
aaa
@@ -89958,8 +88751,8 @@ bRE
bSJ
bPe
bOd
-cCB
-cCC
+bOd
+bOd
bXT
bXT
bXT
@@ -89982,7 +88775,7 @@ ccw
cpd
czL
cpd
-cDL
+ccw
aaf
aaa
aaa
@@ -90216,7 +89009,7 @@ bSM
bTU
bUS
bUS
-cCD
+bUS
bXU
bUS
bUS
@@ -90239,7 +89032,7 @@ aaa
cpd
cpM
cpd
-cCQ
+aaf
aaf
aaa
aaa
@@ -90473,7 +89266,7 @@ bSN
bTT
bUR
bWb
-cCE
+bUR
bTT
bUR
bZJ
@@ -90496,7 +89289,7 @@ aaa
aaa
czN
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -90753,7 +89546,7 @@ aaa
aaa
aaa
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -90987,7 +89780,7 @@ bSP
bPh
bQy
bRI
-cCF
+bQy
bPh
bQy
bRI
@@ -91010,7 +89803,7 @@ aaa
aaa
aaa
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -91244,16 +90037,16 @@ aaf
bRK
aaf
bVv
-cCG
-cCH
-cCI
-cCJ
-cCI
-cCH
-cCI
-cCJ
-cCI
-cCP
+aaf
+bRK
+aaf
+bVv
+aaf
+bRK
+aaf
+bVv
+aaf
+aaf
bLK
chg
bLK
@@ -91267,7 +90060,7 @@ aoV
aoV
aoV
aoV
-cCQ
+aaf
aoV
aaa
aaa
@@ -91510,7 +90303,7 @@ bPj
bQA
bPj
bOh
-cCQ
+aaf
bLK
cyG
bLK
@@ -91524,7 +90317,7 @@ aoV
aoV
aoV
aoV
-cCQ
+aaf
aoV
aaa
aaa
@@ -91767,21 +90560,21 @@ cbI
ccC
cdD
bOh
-cCG
-cCS
-cCS
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cDY
+aaf
+aah
+aah
+aaf
+aaf
+aaf
+aaf
+aaf
+aah
+aah
+aah
+aah
+aah
+aah
+aaf
aaf
aaf
aaf
@@ -97936,7 +96729,7 @@ bDb
bDb
bDb
bDb
-cNW
+bDb
cNW
cQB
czY
@@ -98189,11 +96982,11 @@ bJN
bRT
bEm
bEm
+bJN
+bRT
+bEm
+bEm
bDb
-cfr
-cho
-bDb
-aaa
cNW
cQB
czY
@@ -98432,7 +97225,7 @@ bJJ
bKY
bMi
bNo
-bIP
+bOx
bPA
bJN
bRU
@@ -98446,12 +97239,12 @@ bJN
bRU
bEm
bEm
+bJN
+bRU
+bEm
+bEm
bDb
-cgi
-chq
-ccQ
-aaa
-cOT
+cNW
cQB
czY
cOT
@@ -98703,12 +97496,12 @@ bJN
bRU
bEm
cBz
+bJN
+bRU
+bEm
+cBz
bDb
-cgi
-chq
-ccQ
-aaa
-cOT
+cNW
cQB
czY
cOT
@@ -98947,7 +97740,7 @@ bLa
bMi
bNo
bPy
-bPA
+syV
bJN
bRW
bTb
@@ -98960,11 +97753,11 @@ bJN
bZV
caV
cbS
-bDb
+bJN
cgl
chs
+mHe
bDb
-aaa
cNW
cQB
czY
@@ -99217,11 +98010,11 @@ bVi
bRV
bTa
cbR
+bVi
+bRV
+bTa
+nvr
bDb
-cgk
-chr
-bDb
-aaa
cNW
cBN
czY
@@ -99474,12 +98267,12 @@ bZa
bMi
bMi
bRZ
-cTY
-cTZ
-chu
-ccQ
-aaf
-cOT
+bZa
+bMi
+bMi
+bRZ
+bDb
+cNW
cQB
cAa
cOT
@@ -99730,13 +98523,13 @@ bUf
bTc
bRX
bTc
+bUf
+bTc
+bRX
+bTc
cbT
-ccP
-ccP
-cht
-ckn
csk
-czQ
+cko
czU
czZ
cOT
@@ -99988,12 +98781,12 @@ bZb
bRZ
bMi
bMi
-cfy
-cgn
-cjB
-ccQ
-aaf
-cOT
+bZb
+bRZ
+bMi
+bMi
+bDb
+cNW
cgm
czY
cOT
@@ -100245,11 +99038,11 @@ bVi
bZW
bTd
bUg
+bVi
+fmO
+bTd
+bUg
bDb
-bDb
-bDb
-bDb
-aaa
cNW
cgm
czY
@@ -100502,11 +99295,11 @@ bJN
bZX
caW
cbU
+bJN
+bWn
+bXg
+bYh
bDb
-aaf
-aaf
-aaa
-aaa
cNW
cgm
czY
@@ -100759,12 +99552,12 @@ bJN
bEm
bEm
bRU
+bJN
+bEm
+bEm
+bRU
bDb
-aaf
-aaa
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -101016,12 +99809,12 @@ bJN
bEm
bEm
bRU
+bJN
+bEm
+bEm
+bRU
bDb
-aaf
-aaa
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -101273,12 +100066,12 @@ bJN
bEm
bEm
bUi
+bJN
+bEm
+bEm
+bUi
bDb
-aaf
-aaf
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -101531,10 +100324,10 @@ bDb
bDb
bDb
bDb
-cNW
-cNW
-cNW
-cNW
+bDb
+bDb
+bDb
+bDb
cNW
czX
cAc
@@ -106150,7 +104943,7 @@ bTr
bTr
bTr
bTr
-bXu
+bTr
bTr
bTr
bTr
diff --git a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm
index f4821e135d..70f7862e09 100644
--- a/_maps/cit_map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/cit_map_files/Deltastation/DeltaStation2.dmm
@@ -3966,7 +3966,7 @@
/obj/machinery/camera{
c_tag = "Supermatter Engine - Fore";
name = "atmospherics camera";
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -8666,7 +8666,7 @@
/obj/machinery/camera{
c_tag = "Supermatter Chamber";
dir = 2;
- network = list("Engine")
+ network = list("engine")
},
/turf/open/floor/engine,
/area/engine/supermatter)
@@ -9182,10 +9182,6 @@
},
/turf/open/floor/circuit/green,
/area/engine/supermatter)
-"ayK" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
"ayL" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 4
@@ -9245,7 +9241,7 @@
c_tag = "Supermatter Engine - Starboard";
dir = 8;
name = "atmospherics camera";
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/obj/structure/cable{
icon_state = "1-2"
@@ -9646,7 +9642,7 @@
c_tag = "Supermatter Engine - Port";
dir = 4;
name = "atmospherics camera";
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/components/unary/thermomachine/heater{
@@ -11684,7 +11680,7 @@
/obj/machinery/camera{
c_tag = "Supermatter Engine - Aft";
name = "atmospherics camera";
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -12900,7 +12896,7 @@
c_tag = "Prison - Garden";
dir = 2;
name = "prison camera";
- network = list("SS13","prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/neutral/side{
dir = 1
@@ -17780,7 +17776,7 @@
c_tag = "Prison - Relaxation Area";
dir = 1;
name = "prison camera";
- network = list("SS13","prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plating,
/area/security/prison)
@@ -19590,7 +19586,7 @@
c_tag = "Prison - Cell 3";
dir = 2;
name = "prison camera";
- network = list("SS13","prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plating{
icon_state = "panelscorched"
@@ -19630,7 +19626,7 @@
c_tag = "Prison - Cell 2";
dir = 2;
name = "prison camera";
- network = list("SS13","prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -19662,7 +19658,7 @@
c_tag = "Prison - Cell 1";
dir = 2;
name = "prison camera";
- network = list("SS13","prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -29378,7 +29374,7 @@
"bpg" = (
/obj/machinery/computer/security{
name = "Labor Camp Monitoring";
- network = list("Labor")
+ network = list("labor")
},
/obj/item/device/radio/intercom{
name = "Station Intercom";
@@ -29694,7 +29690,7 @@
c_tag = "AI Satellite - Fore";
dir = 1;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -32973,7 +32969,7 @@
/obj/machinery/camera/motion{
c_tag = "AI Chamber - Fore";
name = "motion-sensitive ai camera";
- network = list("AI")
+ network = list("ai")
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel/dark,
@@ -33462,8 +33458,7 @@
"bxe" = (
/obj/machinery/camera/motion{
c_tag = "Vault";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -33589,7 +33584,7 @@
c_tag = "AI Satellite - Fore Port";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -33649,7 +33644,7 @@
c_tag = "AI Satellite - Fore Starboard";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -35403,7 +35398,7 @@
dir = 4;
layer = 4;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("engine");
pixel_x = -24
},
/turf/open/floor/plasteel/caution{
@@ -35744,7 +35739,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office.";
name = "Research Monitor";
- network = list("RD","Sat");
+ network = list("rd","minisat");
pixel_y = 2
},
/turf/open/floor/plasteel/dark,
@@ -41547,7 +41542,7 @@
c_tag = "Telecomms - Monitoring";
dir = 2;
name = "telecomms camera";
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
@@ -42033,7 +42028,7 @@
c_tag = "AI Chamber - Aft";
dir = 1;
name = "motion-sensitive ai camera";
- network = list("AI")
+ network = list("ai")
},
/turf/open/floor/plasteel/vault,
/area/ai_monitored/turret_protected/ai)
@@ -42974,7 +42969,7 @@
c_tag = "AI Satellite - Port";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -43042,7 +43037,7 @@
c_tag = "AI Satellite - Starboard";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -43954,7 +43949,7 @@
c_tag = "AI Satellite - Antechamber";
dir = 2;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault,
@@ -44798,8 +44793,7 @@
"bTl" = (
/obj/machinery/camera/motion{
c_tag = "Armoury - Exterior";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/space,
/area/space/nearstation)
@@ -44874,7 +44868,7 @@
c_tag = "AI Satellite - Maintenance";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/obj/effect/turf_decal/stripes/line,
@@ -44962,7 +44956,7 @@
c_tag = "AI Satellite - Teleporter";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -45078,7 +45072,7 @@
c_tag = "AI Satellite - Transit Tube";
dir = 2;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/obj/item/clipboard,
@@ -46442,7 +46436,7 @@
desc = "Used for watching the AI's satellite.";
dir = 4;
name = "Research Monitor";
- network = list("Sat");
+ network = list("minisat");
pixel_y = 2
},
/turf/open/floor/plasteel/vault{
@@ -46489,7 +46483,7 @@
dir = 4;
layer = 4;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("engine");
pixel_x = -30
},
/mob/living/simple_animal/parrot/Poly,
@@ -49781,7 +49775,7 @@
c_tag = "Telecomms - Chamber Port";
dir = 4;
name = "telecomms camera";
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/plasteel/vault/telecomms{
dir = 8
@@ -50225,7 +50219,7 @@
/obj/machinery/camera/motion{
c_tag = "AI - Upload";
name = "motion-sensitive ai camera";
- network = list("Sat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/vault,
/area/ai_monitored/turret_protected/ai_upload)
@@ -50253,6 +50247,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/power/emitter{
+ anchored = 1;
+ state = 2
+ },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cdE" = (
@@ -51319,8 +51317,9 @@
/obj/machinery/camera/emp_proof{
c_tag = "Containment - Fore Starboard";
dir = 8;
- network = list("Singularity")
+ network = list("singularity")
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cfC" = (
@@ -51668,7 +51667,7 @@
c_tag = "Telecomms - Chamber Starboard";
dir = 8;
name = "telecomms camera";
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/plasteel/vault/telecomms{
dir = 8
@@ -52292,7 +52291,6 @@
/turf/open/space,
/area/space/nearstation)
"chu" = (
-/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
@@ -53036,7 +53034,7 @@
/obj/machinery/camera/emp_proof{
c_tag = "Containment - Fore Port";
dir = 4;
- network = list("Singularity")
+ network = list("singularity")
},
/turf/open/space,
/area/space/nearstation)
@@ -53057,10 +53055,10 @@
"cjb" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-4"
},
/turf/open/space,
/area/space/nearstation)
@@ -53076,28 +53074,11 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cje" = (
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plating,
/area/engine/engineering)
-"cjf" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"cjg" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -53334,8 +53315,7 @@
/obj/machinery/camera/motion{
c_tag = "Bridge - Captain's Emergency Escape";
dir = 4;
- name = "command camera";
- network = list("SS13")
+ name = "command camera"
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -53663,13 +53643,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"ckx" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cky" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -53685,6 +53658,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ckA" = (
@@ -53693,35 +53667,11 @@
id = "engpa";
name = "Engineering Chamber Shutters"
},
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plating,
/area/engine/engineering)
-"ckB" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckC" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/neutral,
-/area/engine/engineering)
"ckD" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral,
@@ -54292,20 +54242,9 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"clS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"clT" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/field/generator{
- anchored = 1
+ anchored = 1;
+ state = 2
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -54318,19 +54257,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"clV" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"clW" = (
/obj/structure/rack,
/obj/item/crowbar,
@@ -54340,9 +54266,6 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"clX" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -55094,7 +55017,7 @@
c_tag = "AI Satellite - Aft Port";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -55169,7 +55092,7 @@
c_tag = "AI Satellite - Aft Starboard";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault{
@@ -55208,9 +55131,6 @@
id = "engpa";
name = "Engineering Chamber Shutters"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line{
dir = 2
},
@@ -55473,7 +55393,7 @@
c_tag = "Telecomms - Cooling Room";
dir = 8;
name = "telecomms camera";
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -55896,9 +55816,6 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -56458,6 +56375,10 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cqr" = (
+/obj/structure/particle_accelerator/particle_emitter/left{
+ icon_state = "emitter_left";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"cqs" = (
@@ -56466,6 +56387,7 @@
/area/engine/engineering)
"cqt" = (
/obj/structure/cable,
+/obj/machinery/particle_accelerator/control_box,
/turf/open/floor/plating,
/area/engine/engineering)
"cqu" = (
@@ -57027,7 +56949,7 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"crJ" = (
-/obj/item/wrench,
+/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"crK" = (
@@ -57068,7 +56990,10 @@
/turf/open/floor/plating,
/area/engine/engineering)
"crO" = (
-/obj/item/weldingtool/largetank,
+/obj/structure/particle_accelerator/fuel_chamber{
+ icon_state = "fuel_chamber";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"crP" = (
@@ -57092,7 +57017,7 @@
dir = 4;
layer = 4;
name = "Engine Containment Telescreen";
- network = list("Singularity");
+ network = list("singularity");
pixel_x = -30
},
/obj/effect/turf_decal/stripes/line{
@@ -57846,7 +57771,10 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ctp" = (
-/obj/item/wrench,
+/obj/structure/particle_accelerator/particle_emitter/right{
+ icon_state = "emitter_right";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"ctq" = (
@@ -58650,7 +58578,7 @@
/obj/machinery/camera/emp_proof{
c_tag = "Containment - Particle Accelerator";
dir = 1;
- network = list("Singularity")
+ network = list("singularity")
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
@@ -58659,9 +58587,6 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
@@ -58716,6 +58641,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cva" = (
@@ -59873,24 +59799,6 @@
dir = 4
},
/area/crew_quarters/fitness/recreation)
-"cxA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"cxB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cxD" = (
/obj/structure/rack,
/obj/item/crowbar,
@@ -60710,13 +60618,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"czp" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"czq" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -60730,33 +60631,9 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"czs" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"czt" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/neutral,
-/area/engine/engineering)
"czu" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -61344,7 +61221,7 @@
/obj/machinery/camera/emp_proof{
c_tag = "Containment - Aft Port";
dir = 4;
- network = list("Singularity")
+ network = list("singularity")
},
/turf/open/space,
/area/space/nearstation)
@@ -61358,10 +61235,10 @@
"cAI" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "4-8"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-4"
},
/turf/open/space,
/area/space/nearstation)
@@ -61373,11 +61250,7 @@
/turf/open/space,
/area/space/nearstation)
"cAK" = (
-/obj/machinery/power/rad_collector/anchored,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
@@ -62961,8 +62834,9 @@
/obj/machinery/camera/emp_proof{
c_tag = "Containment - Aft Starboard";
dir = 8;
- network = list("Singularity")
+ network = list("singularity")
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cDW" = (
@@ -63846,6 +63720,12 @@
icon_state = "0-2"
},
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/emitter{
+ anchored = 1;
+ dir = 1;
+ icon_state = "emitter";
+ state = 2
+ },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFI" = (
@@ -67620,7 +67500,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology - Cell 1";
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -67633,7 +67513,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology - Cell 2";
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -67646,15 +67526,12 @@
/obj/machinery/camera{
c_tag = "Xenobiology - Cell 3";
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
},
/area/science/xenobiology)
-"cNh" = (
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
"cNi" = (
/obj/machinery/light/small{
dir = 1
@@ -67663,9 +67540,11 @@
c_tag = "Xenobiology - Killroom Chamber";
dir = 2;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
+ },
+/turf/open/floor/plasteel/vault{
+ dir = 5
},
-/turf/open/floor/plasteel/vault/killroom,
/area/science/xenobiology)
"cNj" = (
/obj/structure/closet/crate{
@@ -68381,26 +68260,6 @@
"cON" = (
/turf/open/floor/circuit/green,
/area/science/xenobiology)
-"cOO" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 2;
- external_pressure_bound = 140;
- name = "killroom vent";
- pressure_checks = 0
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cOP" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cOQ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 2;
- external_pressure_bound = 120;
- name = "server vent"
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cOR" = (
/turf/closed/wall/r_wall,
/area/science/research)
@@ -69156,24 +69015,6 @@
dir = 1
},
/area/science/xenobiology)
-"cQw" = (
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
-"cQx" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
-"cQy" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
"cQz" = (
/obj/structure/closet/wardrobe/science_white,
/obj/machinery/light/small{
@@ -69712,7 +69553,7 @@
c_tag = "Xenobiology - Port";
dir = 2;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -69877,7 +69718,6 @@
icon_state = "0-4"
},
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/open/floor/plating,
/area/science/xenobiology)
"cSg" = (
@@ -69888,7 +69728,7 @@
icon_state = "2-8"
},
/obj/machinery/door/airlock/research/glass{
- name = "Xenobiology Kill Room";
+ name = "Xenobiology Isolation Pin";
req_access_txt = "47"
},
/obj/effect/turf_decal/stripes/line{
@@ -70678,13 +70518,19 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTR" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1;
- min_temperature = 80;
- on = 1;
- target_temperature = 80
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
},
-/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTS" = (
@@ -72180,7 +72026,7 @@
c_tag = "Xenobiology - Secure Cell";
dir = 4;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -72380,9 +72226,6 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cXm" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/machinery/status_display{
pixel_x = 32
},
@@ -72394,7 +72237,7 @@
c_tag = "Science - Fore";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner{
dir = 4
@@ -72454,7 +72297,7 @@
c_tag = "Security Post - Science";
dir = 8;
name = "security camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/red/side{
dir = 6
@@ -72505,7 +72348,7 @@
c_tag = "Science - Waiting Room";
dir = 1;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner{
dir = 8
@@ -72570,13 +72413,6 @@
dir = 8
},
/area/medical/medbay/central)
-"cXG" = (
-/obj/structure/table,
-/obj/item/folder/white,
-/turf/open/floor/plasteel/whiteblue/corner{
- dir = 8
- },
-/area/medical/medbay/central)
"cXH" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -73201,7 +73037,7 @@
c_tag = "Xenobiology - Starboard";
dir = 8;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -73381,12 +73217,11 @@
id = "chemisttop";
name = "Chemistry Lobby Shutters"
},
-/obj/machinery/door/window/southleft{
+/obj/item/folder/yellow,
+/obj/machinery/door/window/northleft{
name = "Chemistry Desk";
req_access_txt = "5; 33"
},
-/obj/item/folder/yellow,
-/obj/machinery/door/window/northleft,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/medical/medbay/central)
@@ -74963,7 +74798,7 @@
c_tag = "Science - Research Division Access";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -76222,7 +76057,7 @@
c_tag = "Science - Research and Development";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner,
/area/science/lab)
@@ -76290,7 +76125,7 @@
c_tag = "Medbay - Chemistry";
dir = 8;
name = "medbay camera";
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteyellow/corner,
/area/medical/chemistry)
@@ -76676,7 +76511,7 @@
c_tag = "Xenobiology - Cell 4";
dir = 1;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -76688,7 +76523,7 @@
c_tag = "Xenobiology - Cell 5";
dir = 1;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -76700,7 +76535,7 @@
c_tag = "Xenobiology - Cell 6";
dir = 1;
name = "xenobiology camera";
- network = list("SS13","xeno","RD")
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -76745,7 +76580,7 @@
c_tag = "Science - Port";
dir = 2;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner{
dir = 1
@@ -76812,7 +76647,7 @@
c_tag = "Science - Center";
dir = 2;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner{
dir = 1
@@ -77966,7 +77801,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 4;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_x = -28
},
/turf/open/floor/plasteel/white/corner,
@@ -78125,7 +77960,7 @@
c_tag = "Science - Experimentation Lab";
dir = 2;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -79526,7 +79361,7 @@
c_tag = "Science - Lab Access";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -81872,7 +81707,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 4;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_x = -28
},
/turf/open/floor/plasteel/white/corner{
@@ -82119,7 +81954,7 @@
c_tag = "Science - Research Director's Office";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -83970,7 +83805,7 @@
c_tag = "Science - Experimentor";
dir = 1;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -83985,7 +83820,7 @@
c_tag = "Science - Toxins Mixing Lab Fore";
dir = 4;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/escape{
dir = 8
@@ -84027,7 +83862,7 @@
c_tag = "Science - Firing Range";
dir = 4;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -84124,7 +83959,7 @@
c_tag = "Science - Aft Center";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner,
/area/science/research)
@@ -84167,7 +84002,7 @@
c_tag = "Science - Mech Bay";
dir = 1;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -87081,7 +86916,7 @@
c_tag = "Science - Research Director's Quarters";
dir = 1;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/modular_computer/console/preset/research{
dir = 1
@@ -87777,7 +87612,7 @@
c_tag = "Science - Robotics Lab";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -88615,7 +88450,7 @@
c_tag = "Science - Toxins Launch Site";
dir = 2;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -88730,7 +88565,7 @@
c_tag = "Science - Toxins Mixing Lab Aft";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -89358,7 +89193,7 @@
dir = 4;
layer = 4;
name = "Testing Site Telescreen";
- network = list("Toxins")
+ network = list("toxins")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -90187,7 +90022,7 @@
c_tag = "Science - Server Room";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/science/server)
@@ -90200,7 +90035,7 @@
c_tag = "Science - Aft";
dir = 4;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/corner{
dir = 8
@@ -90673,7 +90508,7 @@
/turf/open/floor/plating/airless,
/area/science/test_area)
"dJJ" = (
-/obj/machinery/doppler_array{
+/obj/machinery/doppler_array/research/science{
dir = 8
},
/obj/structure/extinguisher_cabinet{
@@ -90861,7 +90696,7 @@
c_tag = "Science - Toxins Secure Storage";
dir = 4;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -91663,7 +91498,7 @@
invuln = 1;
light = null;
name = "hardened testing camera";
- network = list("Toxins");
+ network = list("toxins");
start_active = 1;
use_power = 0
},
@@ -93003,7 +92838,7 @@
c_tag = "Science - Break Room";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/neutral/side{
dir = 4
@@ -100888,7 +100723,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Service Bay";
dir = 8;
- network = list("MiniSat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -100898,6 +100733,25 @@
dir = 4
},
/area/science/misc_lab)
+"fzH" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"fGq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
@@ -100916,6 +100770,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"gsR" = (
+/turf/open/space,
+/area/space)
"gKr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -101006,6 +100863,9 @@
dir = 9
},
/area/science/circuit)
+"hRG" = (
+/turf/open/space/basic,
+/area/space/nearstation)
"iQh" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -101032,7 +100892,7 @@
c_tag = "Science - Experimentation Lab";
dir = 2;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/requests_console{
department = "Circuitry Lab";
@@ -101064,6 +100924,9 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral,
/area/medical/morgue)
+"jKb" = (
+/turf/open/space,
+/area/space/nearstation)
"kwx" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/whitepurple/corner,
@@ -101089,6 +100952,9 @@
dir = 5
},
/area/crew_quarters/locker)
+"lkn" = (
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"loI" = (
/obj/machinery/autolathe,
/obj/machinery/door/window/southleft{
@@ -101104,6 +100970,10 @@
dir = 4
},
/area/science/lab)
+"lxv" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"lEl" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -101148,6 +101018,13 @@
dir = 1
},
/area/science/circuit)
+"mqk" = (
+/obj/structure/particle_accelerator/end_cap{
+ icon_state = "end_cap";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"mvm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -101159,6 +101036,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/circuit/green,
/area/science/research/abandoned)
+"nJG" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"oZC" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -101172,6 +101053,13 @@
},
/turf/open/floor/wood,
/area/bridge/showroom/corporate)
+"pfd" = (
+/obj/structure/particle_accelerator/particle_emitter/center{
+ icon_state = "emitter_center";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"pmQ" = (
/obj/structure/table/reinforced,
/obj/machinery/newscaster{
@@ -101235,6 +101123,12 @@
"saw" = (
/turf/closed/wall,
/area/science/circuit)
+"tdp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"tmi" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -101273,6 +101167,9 @@
/obj/structure/reagent_dispensers/water_cooler,
/turf/open/floor/plasteel/whitepurple/side,
/area/science/misc_lab)
+"uDN" = (
+/turf/open/floor/plating/airless,
+/area/space)
"uYS" = (
/obj/machinery/door/airlock/atmos/glass{
heat_proof = 1;
@@ -101294,6 +101191,13 @@
dir = 5
},
/area/medical/morgue)
+"vyI" = (
+/obj/machinery/status_display{
+ pixel_x = 32
+ },
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/open/floor/circuit/green,
+/area/science/xenobiology)
"wei" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -101330,6 +101234,13 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"xwB" = (
+/obj/structure/particle_accelerator/power_box{
+ icon_state = "power_box";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"xwK" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -101338,7 +101249,7 @@
c_tag = "Science - Lab Access";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/structure/sign/departments/science{
pixel_x = 32
@@ -101355,6 +101266,13 @@
},
/turf/open/floor/plasteel,
/area/science/research/abandoned)
+"xJl" = (
+/obj/structure/table,
+/obj/item/folder/white,
+/turf/open/floor/plasteel/whiteblue/corner{
+ dir = 8
+ },
+/area/medical/medbay/central)
"xMn" = (
/obj/structure/disposalpipe/trunk,
/obj/machinery/disposal/bin,
@@ -121815,14 +121733,14 @@ aaa
cja
ckw
clS
-aad
-aad
-clR
-aaa
-abj
-aad
-aad
-cxA
+jKb
+jKb
+clS
+nJG
+hRG
+jKb
+jKb
+clS
ctn
cja
aaa
@@ -122070,17 +121988,17 @@ cdC
cfA
aad
cjb
-ckx
+cky
+jKb
+gsR
+gsR
+lxv
aad
-aaa
-aaa
-abj
-aad
-abj
-aaa
-aaa
-aad
-czp
+hRG
+gsR
+gsR
+jKb
+czq
cAI
aad
cDT
@@ -122328,15 +122246,15 @@ cfA
aaa
cja
ckw
+jKb
+gsR
+hRG
+hRG
aad
-aaa
-abj
-abj
-abj
-abj
-abj
-aaa
-aad
+hRG
+hRG
+gsR
+jKb
ctn
cja
aaa
@@ -122583,19 +122501,19 @@ car
cbP
cfA
abj
-cja
-ckw
-ckw
-abj
-abj
+cjb
+cky
+hRG
+hRG
+hRG
cqo
clR
ctm
-abj
-abj
-abj
-ctn
-cja
+hRG
+lxv
+clS
+czq
+cAI
abj
cDT
cFJ
@@ -122840,19 +122758,19 @@ car
cbP
cdC
aad
-cjb
-cky
-aaa
+cja
+ckw
+nJG
+aad
aad
-abj
ckw
crJ
-ctn
-abj
+tdp
aad
-aaa
-czq
-cAI
+aad
+nJG
+ctn
+cja
aad
cdC
cFJ
@@ -123097,19 +123015,19 @@ car
cbP
cfA
abj
-cja
-ckw
-abj
-abj
-abj
+cjb
+cky
+clS
+lxv
+hRG
cqp
crK
cto
-abj
-abj
-ctn
-ctn
-cja
+hRG
+hRG
+hRG
+czq
+cAI
abj
cDT
cFJ
@@ -123356,15 +123274,15 @@ cfA
aaa
cja
ckw
+jKb
+gsR
+hRG
+hRG
aad
-aaa
-abj
-abj
-abj
-abj
-abj
-aaa
-aad
+hRG
+hRG
+gsR
+jKb
ctn
cja
aaa
@@ -123612,17 +123530,17 @@ cdC
cfA
aad
cjb
-ckx
+cky
+jKb
+gsR
+aaa
+hRG
aad
+lxv
aaa
-aaa
-abj
-aad
-abj
-aaa
-aaa
-aad
-czp
+gsR
+jKb
+czq
cAI
aad
cDU
@@ -123870,15 +123788,15 @@ cfA
aaa
cja
ckw
-clT
-aad
-aad
-abj
-aaa
-crK
-aad
-aad
-cxB
+clS
+jKb
+hRG
+hRG
+nJG
+clS
+jKb
+jKb
+clS
ctn
cja
aaa
@@ -124381,8 +124299,8 @@ car
cbT
cdG
cfB
-aaa
-aad
+uDN
+lkn
aaa
aad
cjd
@@ -124394,8 +124312,8 @@ cjd
cjd
aad
aaa
-aad
-aaa
+lkn
+uDN
cDV
cFL
cHg
@@ -124902,7 +124820,7 @@ cje
cjd
cpa
cqr
-cqr
+pfd
ctp
cuQ
cjd
@@ -125153,19 +125071,19 @@ cbV
cdJ
car
chv
-cjf
+chv
ckA
-clV
+chv
cnC
cpa
cqs
-cqr
+xwB
ctq
cuR
cnC
-cjf
-czs
-clV
+chv
+chv
+chv
chv
car
cFO
@@ -125411,7 +125329,7 @@ cdK
cfD
chw
cjg
-ckB
+chw
clW
cnD
cpb
@@ -125421,7 +125339,7 @@ ctr
cuS
cnD
cxD
-ckB
+chw
chw
chw
cDW
@@ -125668,17 +125586,17 @@ cdL
cfE
chx
cjh
-ckC
+cjn
clX
cnE
cpc
cqu
-cqr
+mqk
cts
cuT
cnE
clX
-czt
+cjn
cAL
cCs
cDX
@@ -127155,7 +127073,7 @@ atS
avb
awh
axz
-ayK
+axz
axz
aAW
axz
@@ -128526,7 +128444,7 @@ das
dcd
cMY
deX
-dgo
+fzH
dhR
lKu
tmi
@@ -132626,9 +132544,9 @@ cHA
cjp
cKl
cLI
-cNh
-cNh
-cNh
+cNd
+cNd
+cNd
cNc
cTQ
cVI
@@ -132883,9 +132801,9 @@ cHB
cjp
cKj
cLI
-cNh
-cOO
-cQw
+cNd
+cNd
+cNd
cSf
cTR
cVP
@@ -133141,8 +133059,8 @@ caE
cKm
cLI
cNi
-cOP
-cQx
+cNd
+cNd
cSg
cTS
cVQ
@@ -133397,9 +133315,9 @@ cHB
cjp
cKk
cLI
-cNh
-cOQ
-cQy
+cNd
+cNd
+cNd
cSh
cTT
cVR
@@ -133654,9 +133572,9 @@ cHA
ceb
cKk
cLI
-cNh
-cNh
-cNh
+cNd
+cNd
+cNd
cNc
cTU
cVS
@@ -133919,7 +133837,7 @@ cTV
cVT
cXm
cZb
-cXm
+vyI
dcu
ddV
cMY
@@ -141370,7 +141288,7 @@ cQT
cSE
cUt
cWj
-cXG
+xJl
cZt
dbc
dcO
diff --git a/_maps/cit_map_files/MetaStation/MetaStation.dmm b/_maps/cit_map_files/MetaStation/MetaStation.dmm
index 96021ab0f9..b158c0e3b4 100644
--- a/_maps/cit_map_files/MetaStation/MetaStation.dmm
+++ b/_maps/cit_map_files/MetaStation/MetaStation.dmm
@@ -188,7 +188,7 @@
},
/obj/machinery/camera{
c_tag = "Prison Hydroponics";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/floorgrime,
/area/security/prison)
@@ -1035,7 +1035,7 @@
/obj/machinery/camera{
c_tag = "Prison Chamber";
dir = 1;
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/floorgrime,
/area/security/prison)
@@ -1120,7 +1120,7 @@
/obj/machinery/camera{
c_tag = "Prison Sanitarium";
dir = 2;
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/whitered/side{
dir = 1
@@ -1425,7 +1425,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 3";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/floorgrime,
/area/security/prison)
@@ -1448,7 +1448,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 2";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/floorgrime,
/area/security/prison)
@@ -1480,7 +1480,7 @@
/obj/structure/bed,
/obj/machinery/camera{
c_tag = "Prison Cell 1";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/floorgrime,
/area/security/prison)
@@ -1533,8 +1533,7 @@
/obj/structure/lattice,
/obj/machinery/camera/motion{
c_tag = "Armory - External";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/space,
/area/space/nearstation)
@@ -2147,12 +2146,12 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/obj/machinery/camera{
c_tag = "Prison Hallway Port";
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/red/corner{
dir = 2
@@ -2218,7 +2217,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/turf/open/floor/plasteel/red/corner{
@@ -2295,7 +2294,7 @@
/obj/machinery/camera{
c_tag = "Prison Hallway Starboard";
dir = 2;
- network = list("SS13","Prison")
+ network = list("ss13","prison")
},
/turf/open/floor/plasteel/red/corner{
dir = 2
@@ -2399,8 +2398,7 @@
},
/obj/machinery/camera{
c_tag = "Head of Security's Office";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos)
@@ -3421,8 +3419,7 @@
pixel_y = 8
},
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
@@ -3562,8 +3559,7 @@
/obj/machinery/light,
/obj/machinery/camera/motion{
c_tag = "Armory - Internal";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/vault,
/area/ai_monitored/security/armory)
@@ -3622,7 +3618,7 @@
desc = "Used for watching certain areas.";
dir = 1;
name = "Head of Security's Monitor";
- network = list("Prison","MiniSat","tcomm");
+ network = list("prison","minisat","tcomm");
pixel_y = -30
},
/turf/open/floor/plasteel/vault,
@@ -3925,8 +3921,7 @@
/obj/machinery/light/small,
/obj/machinery/camera{
c_tag = "Security - EVA Storage";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -3991,8 +3986,7 @@
/obj/effect/landmark/blobstart,
/obj/machinery/camera{
c_tag = "Evidence Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/item/storage/secure/safe{
name = "evidence safe";
@@ -4446,7 +4440,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/turf/open/floor/plasteel/vault,
@@ -4922,8 +4916,7 @@
},
/obj/machinery/camera{
c_tag = "Security - Secure Gear Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/flasher/portable,
/obj/effect/turf_decal/bot,
@@ -5182,8 +5175,7 @@
},
/obj/machinery/camera{
c_tag = "Firing Range";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -5322,10 +5314,6 @@
"alq" = (
/turf/closed/wall,
/area/maintenance/starboard)
-"alr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"als" = (
/obj/machinery/light{
dir = 8
@@ -6050,8 +6038,7 @@
"amM" = (
/obj/machinery/camera{
c_tag = "Gravity Generator Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -6349,8 +6336,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Security - Office - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/red/side{
dir = 8
@@ -6749,8 +6735,7 @@
},
/obj/machinery/camera{
c_tag = "Brig - Infirmary";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/item/clothing/under/rank/medical/purple{
pixel_y = -4
@@ -7464,8 +7449,7 @@
},
/obj/machinery/camera{
c_tag = "Warden's Office";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/rack,
/obj/item/storage/toolbox/mechanical{
@@ -7508,8 +7492,7 @@
/obj/structure/closet/wardrobe/red,
/obj/machinery/camera{
c_tag = "Security - Gear Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
@@ -7567,8 +7550,7 @@
},
/obj/machinery/camera{
c_tag = "Security - Office - Starboard";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/red/side{
@@ -7776,8 +7758,7 @@
pixel_y = 8
},
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
@@ -7976,7 +7957,7 @@
"aqY" = (
/obj/machinery/computer/security{
name = "Labor Camp Monitoring";
- network = list("Labor")
+ network = list("labor")
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
@@ -7992,7 +7973,7 @@
desc = "Used for watching Prison Wing holding areas.";
dir = 2;
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_x = -30
},
/turf/open/floor/plasteel/showroomfloor,
@@ -9947,8 +9928,7 @@
},
/obj/machinery/camera{
c_tag = "Brig - Hallway - Entrance";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/red/corner{
dir = 4
@@ -10927,8 +10907,7 @@
/obj/machinery/light,
/obj/machinery/camera{
c_tag = "Brig - Hallway - Port";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/door_timer{
id = "Cell 1";
@@ -11100,8 +11079,7 @@
/obj/machinery/light,
/obj/machinery/camera{
c_tag = "Brig - Hallway - Starboard";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/red/corner{
dir = 2
@@ -11269,6 +11247,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"axN" = (
@@ -11372,17 +11353,21 @@
req_one_access_txt = "0"
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"axV" = (
/obj/structure/sign/warning/securearea{
pixel_y = 32
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axW" = (
/obj/structure/disposalpipe/segment,
@@ -11392,10 +11377,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axX" = (
/obj/machinery/light_switch{
@@ -11411,41 +11395,21 @@
/obj/structure/sign/warning/securearea{
pixel_y = 32
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 5
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axY" = (
/turf/closed/wall/r_wall,
/area/engine/engineering)
-"axZ" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"aya" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"ayc" = (
-/obj/structure/table/reinforced,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/clothing/mask/breath{
- pixel_x = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"aye" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
"ayf" = (
/obj/structure/closet/crate,
/obj/item/stack/sheet/glass{
@@ -11788,46 +11752,59 @@
dir = 1;
pixel_y = 2
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
/area/engine/engineering)
"ayT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"ayV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"ayW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ayX" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"aza" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+"ayX" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"aza" = (
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"azb" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
@@ -11839,13 +11816,18 @@
},
/area/security/brig)
"azd" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aze" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-22"
@@ -12231,7 +12213,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/obj/item/device/flashlight/lamp/green{
@@ -12284,6 +12266,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -12473,13 +12458,20 @@
"aAo" = (
/obj/structure/closet/secure_closet/engineering_personal,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"aAp" = (
/obj/structure/closet/secure_closet/engineering_personal,
/obj/item/clothing/suit/hooded/wintercoat/engineering,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
/area/engine/engineering)
"aAr" = (
/obj/item/device/radio/intercom{
@@ -12490,18 +12482,14 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Fore";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/closet/secure_closet/engineering_personal,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aAt" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
@@ -12515,27 +12503,21 @@
sortType = 4
},
/obj/effect/landmark/start/station_engineer,
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aAv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aAw" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"aAx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"aAz" = (
/obj/structure/table/wood,
@@ -12559,7 +12541,7 @@
id = "mining_home";
name = "mining shuttle bay";
width = 7;
- roundstart_template = /datum/map_template/shuttle/mining/box;
+ roundstart_template = /datum/map_template/shuttle/mining/box
},
/turf/open/space/basic,
/area/space)
@@ -12762,7 +12744,7 @@
id = "laborcamp_home";
name = "fore bay 1";
width = 9;
- roundstart_template = /datum/map_template/shuttle/labour/box;
+ roundstart_template = /datum/map_template/shuttle/labour/box
},
/turf/open/space/basic,
/area/space)
@@ -12782,8 +12764,7 @@
},
/obj/machinery/camera{
c_tag = "Labor Shuttle Dock";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/flasher{
id = "PRelease";
@@ -12894,8 +12875,7 @@
/obj/effect/landmark/blobstart,
/obj/machinery/camera{
c_tag = "Detective's Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
@@ -13115,8 +13095,7 @@
"aBG" = (
/obj/machinery/camera{
c_tag = "Engineering - Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/suit_storage_unit/engine,
/obj/effect/turf_decal/bot{
@@ -13156,18 +13135,14 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aBK" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBL" = (
@@ -13179,9 +13154,6 @@
},
/obj/machinery/rnd/circuit_imprinter,
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBM" = (
@@ -13191,9 +13163,6 @@
},
/obj/machinery/rnd/protolathe/department/engineering,
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBN" = (
@@ -13202,21 +13171,10 @@
dir = 1
},
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"aBQ" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aBS" = (
/obj/item/stack/ore/silver,
@@ -13230,8 +13188,7 @@
/obj/structure/reagent_dispensers/fueltank,
/obj/machinery/camera{
c_tag = "Mining Dock";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -13259,8 +13216,7 @@
},
/obj/machinery/camera{
c_tag = "Mining Office";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/mineral/equipment_vendor,
/turf/open/floor/plasteel/brown{
@@ -13336,8 +13292,7 @@
"aCg" = (
/obj/machinery/camera/motion{
c_tag = "Vault";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/light,
/obj/structure/cable/yellow{
@@ -13732,9 +13687,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aCV" = (
@@ -13744,38 +13696,29 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aCW" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"aCX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aCY" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space)
"aCZ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"aDa" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -13939,8 +13882,7 @@
},
/obj/machinery/camera{
c_tag = "Fore Primary Hallway Cells";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/red/corner{
dir = 1
@@ -14057,8 +13999,7 @@
},
/obj/machinery/camera{
c_tag = "Brig - Desk";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/item/device/radio/intercom{
freerange = 0;
@@ -14379,10 +14320,9 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aEo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -14405,31 +14345,16 @@
/obj/structure/cable/yellow{
icon_state = "2-8"
},
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aEq" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aEr" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Fore Port";
+ dir = 4;
+ network = list("singularity")
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"aEt" = (
/obj/structure/table,
@@ -14448,7 +14373,7 @@
"aEv" = (
/obj/machinery/computer/security/mining{
dir = 4;
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
@@ -14777,8 +14702,7 @@
},
/obj/machinery/camera{
c_tag = "Restrooms";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
@@ -14968,10 +14892,9 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 2
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aFw" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -14989,52 +14912,26 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aFz" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"aFA" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFB" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/rack,
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = -26;
+ req_access_txt = "11"
},
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/black,
+/obj/item/wrench,
+/obj/item/clothing/glasses/meson/engine,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFC" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aFD" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/meter,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/engine,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFE" = (
/obj/structure/table/wood,
@@ -15215,8 +15112,7 @@
},
/obj/machinery/camera{
c_tag = "Storage Wing - Security Access Door";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light/small{
dir = 8
@@ -15457,7 +15353,7 @@
desc = "Used for watching Prison Wing holding areas.";
dir = 1;
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = -30
},
/obj/item/restraints/handcuffs,
@@ -15782,10 +15678,9 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aGW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -15796,31 +15691,14 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aGY" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"aGZ" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "External Gas to Loop"
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"aHa" = (
-/obj/structure/cable/white,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aHb" = (
/obj/machinery/camera{
@@ -16225,6 +16103,9 @@
lootcount = 2;
name = "2maintenance loot spawner"
},
+/obj/machinery/light/small{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aHW" = (
@@ -16241,42 +16122,21 @@
dir = 8;
pixel_x = -24
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aHY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aHZ" = (
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/effect/turf_decal/delivery,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aIc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating,
-/area/engine/engineering)
"aIe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space,
+/area/space)
"aIf" = (
/obj/machinery/camera{
c_tag = "Auxillary Base Construction";
@@ -16352,8 +16212,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo Bay - Fore";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/sign/map/right{
desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown).";
@@ -16478,8 +16337,7 @@
"aIt" = (
/obj/machinery/camera{
c_tag = "Cargo Bay - Storage Wing Entrance";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -16544,8 +16402,7 @@
},
/obj/machinery/camera{
c_tag = "Storage Wing";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/light,
/obj/structure/cable/yellow{
@@ -16745,8 +16602,7 @@
},
/obj/machinery/camera{
c_tag = "Courtroom";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/blue/side{
dir = 1
@@ -16795,7 +16651,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/turf/open/floor/wood,
@@ -16945,8 +16801,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Secure Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plating,
/area/engine/engineering)
@@ -16958,34 +16813,13 @@
/obj/structure/table,
/obj/item/airlock_painter,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aJp" = (
-/obj/structure/table,
-/obj/effect/turf_decal/delivery,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/machinery/light{
- dir = 4
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aJu" = (
/turf/open/floor/plating,
/area/engine/engineering)
-"aJv" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"aJB" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -17432,12 +17266,6 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
-"aKA" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"aKB" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -17451,53 +17279,26 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aKF" = (
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_x = 24;
- req_access_txt = "10"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"aKG" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+/obj/structure/particle_accelerator/end_cap{
+ icon_state = "end_cap";
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"aKH" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Gas to Chamber";
- on = 0
+/obj/structure/particle_accelerator/fuel_chamber{
+ icon_state = "fuel_chamber";
+ dir = 4
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"aKI" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
+/obj/structure/particle_accelerator/power_box{
+ icon_state = "power_box";
+ dir = 4
},
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"aKL" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Mix Bypass";
- on = 0
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"aKN" = (
/obj/machinery/door/poddoor{
@@ -17792,7 +17593,7 @@
/obj/structure/table,
/obj/machinery/camera/motion{
c_tag = "AI Upload Chamber - Fore";
- network = list("SS13","RD","AIUpload")
+ network = list("ss13","rd","aiupload")
},
/obj/item/twohanded/required/kirbyplants/photosynthetic{
pixel_y = 10
@@ -17891,8 +17692,7 @@
/obj/machinery/photocopier,
/obj/machinery/camera{
c_tag = "Law Office";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/wood,
/area/lawoffice)
@@ -17962,8 +17762,7 @@
/obj/structure/disposalpipe/trunk,
/obj/machinery/camera{
c_tag = "Locker Room Starboard";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/sign/warning/pods{
pixel_y = 30
@@ -18050,12 +17849,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/engine/engineering)
-"aMc" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"aMd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -18076,62 +17869,52 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"aMg" = (
-/obj/machinery/door/firedoor,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
},
-/turf/open/floor/plating,
/area/engine/engineering)
"aMh" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"aMi" = (
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"aMi" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Gas to Filter"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aMj" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"aMk" = (
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"aMm" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/particle_accelerator/control_box,
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"aMo" = (
-/obj/structure/reflector/box/anchored{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"aMq" = (
/obj/structure/window/reinforced,
/turf/open/space,
@@ -18200,8 +17983,7 @@
/area/quartermaster/storage)
"aMA" = (
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/rack,
/obj/item/storage/toolbox/electrical{
@@ -18579,7 +18361,9 @@
maxcharge = 15000
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
+ },
/area/engine/engineering)
"aNr" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -18589,17 +18373,27 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"aNu" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Gas to Filter";
- on = 0
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Particle Accelerator";
+ dir = 1;
+ network = list("singularity")
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"aNv" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
"aNw" = (
/obj/structure/window/reinforced{
dir = 4
@@ -18772,8 +18566,7 @@
/area/quartermaster/qm)
"aNP" = (
/obj/machinery/camera/autoname{
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -19245,8 +19038,7 @@
/obj/machinery/disposal/bin,
/obj/machinery/camera{
c_tag = "Garden";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/disposalpipe/trunk{
dir = 8
@@ -19265,10 +19057,9 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aOP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -19291,26 +19082,12 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aOR" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/stripes/line{
+"aOS" = (
+/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aOS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/item/device/radio/intercom{
- freerange = 0;
- frequency = 1459;
- name = "Station Intercom (General)";
- pixel_y = 21
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space)
"aOT" = (
/obj/structure/window/reinforced{
dir = 4
@@ -19556,8 +19333,7 @@
},
/obj/machinery/camera{
c_tag = "Tool Storage";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/brown{
dir = 4
@@ -19637,8 +19413,7 @@
},
/obj/machinery/camera{
c_tag = "Fore Primary Hallway Aft";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/red/corner{
dir = 2
@@ -19838,8 +19613,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Power Monitoring";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/modular_computer/console/preset/engineering,
/turf/open/floor/plasteel/vault,
@@ -19857,41 +19631,32 @@
icon_state = "2-8"
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"aPZ" = (
/obj/machinery/vending/tool,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aQa" = (
-/obj/structure/table,
-/obj/effect/turf_decal/delivery,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
},
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aQd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/rack,
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "11"
},
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+/obj/item/storage/belt/utility,
+/obj/item/weldingtool,
+/obj/item/clothing/head/welding,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aQe" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"aQf" = (
/obj/structure/chair{
@@ -19979,8 +19744,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo Bay - Starboard";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/item/paper_bin{
pixel_x = -1;
@@ -19997,7 +19761,7 @@
"aQq" = (
/obj/machinery/computer/security/mining{
dir = 4;
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/obj/machinery/light_switch{
pixel_x = -23
@@ -20111,7 +19875,7 @@
/obj/machinery/camera/motion{
c_tag = "AI Upload Chamber - Port";
dir = 1;
- network = list("SS13","RD","AIUpload")
+ network = list("ss13","rd","aiupload")
},
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
@@ -20134,7 +19898,7 @@
/obj/machinery/camera/motion{
c_tag = "AI Upload Chamber - Starboard";
dir = 1;
- network = list("SS13","RD","AIUpload")
+ network = list("ss13","rd","aiupload")
},
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
@@ -20248,8 +20012,7 @@
},
/obj/machinery/camera{
c_tag = "Crew Quarters Entrance";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/neutral/corner{
dir = 1
@@ -20498,19 +20261,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aRo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aRp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -20522,9 +20275,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aRq" = (
@@ -20551,13 +20301,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aRv" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"aRy" = (
/turf/closed/wall/r_wall,
/area/aisat)
@@ -20974,10 +20717,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aSu" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -21006,9 +20748,7 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSx" = (
@@ -21019,36 +20759,39 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSz" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/item/pen,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
+/obj/item/paper_bin{
+ layer = 2.9
},
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aSA" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/wiki/engineering_hacking{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 5
- },
-/turf/open/floor/engine,
+/obj/item/book/manual/wiki/engineering_construction,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/obj/item/device/flashlight,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aSB" = (
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSD" = (
@@ -21366,8 +21109,7 @@
/obj/machinery/light,
/obj/machinery/camera{
c_tag = "Courtroom - Gallery";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
@@ -21458,8 +21200,7 @@
},
/obj/machinery/camera{
c_tag = "Locker Room Port";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 2
@@ -21535,10 +21276,9 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aTG" = (
/obj/structure/disposalpipe/segment{
@@ -21550,26 +21290,18 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aTH" = (
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
+/obj/machinery/light,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aTI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -21580,9 +21312,6 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
@@ -21595,31 +21324,6 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aTM" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aTN" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aTO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aTQ" = (
@@ -21655,7 +21359,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Fore Port";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/aisat)
@@ -21707,7 +21411,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Fore Starboard";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/aisat)
@@ -21757,8 +21461,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo Bay - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/conveyor{
dir = 1;
@@ -21957,7 +21660,7 @@
desc = "Used for watching the AI Upload.";
dir = 4;
name = "AI Upload Monitor";
- network = list("AIUpload");
+ network = list("aiupload");
pixel_x = -29
},
/turf/open/floor/plasteel/vault{
@@ -21983,12 +21686,12 @@
desc = "Used for watching areas on the MiniSat.";
dir = 8;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_x = 29
},
/obj/machinery/camera/motion{
c_tag = "AI Upload Foyer";
- network = list("SS13","RD","AIUpload")
+ network = list("ss13","rd","aiupload")
},
/obj/machinery/airalarm{
pixel_y = 26
@@ -22225,7 +21928,9 @@
"aUY" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
+ },
/area/engine/engineering)
"aUZ" = (
/obj/structure/disposalpipe/segment,
@@ -22236,8 +21941,8 @@
/obj/effect/turf_decal/bot{
dir = 1
},
-/turf/open/floor/plasteel{
- dir = 1
+/turf/open/floor/plasteel/yellow/side{
+ dir = 6
},
/area/engine/engineering)
"aVa" = (
@@ -22274,31 +21979,13 @@
dir = 4
},
/obj/structure/closet/secure_closet/engineering_electrical,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aVe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"aVf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"aVh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aVk" = (
/obj/structure/window/reinforced{
@@ -22334,7 +22021,7 @@
/obj/machinery/camera{
c_tag = "AI Chamber - Fore";
dir = 2;
- network = list("RD")
+ network = list("rd")
},
/obj/structure/showcase/cyborg/old{
dir = 2;
@@ -22402,8 +22089,7 @@
/obj/structure/chair,
/obj/machinery/camera{
c_tag = "Arrivals - Fore Arm - Far";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -22584,7 +22270,7 @@
},
/obj/machinery/computer/security/mining{
dir = 8;
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -22688,8 +22374,7 @@
"aWd" = (
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Fore";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/red/corner{
dir = 1
@@ -22840,8 +22525,10 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aWu" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/airlock/external{
+ name = "Escape Pod Four";
+ req_access = null;
+ req_access_txt = "32"
},
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -22929,18 +22616,16 @@
dir = 1
},
/area/engine/engineering)
-"aWH" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"aWK" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aWL" = (
/obj/machinery/ai_status_display{
pixel_x = -32
@@ -23063,8 +22748,7 @@
},
/obj/machinery/camera{
c_tag = "Arrivals - Fore Arm";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light{
dir = 4
@@ -23183,8 +22867,7 @@
/obj/structure/table/reinforced,
/obj/machinery/camera{
c_tag = "Security Post - Cargo";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/red/side,
/area/security/checkpoint/supply)
@@ -23368,8 +23051,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Fore - AI Upload";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/sign/warning/securearea{
desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'.";
@@ -23785,8 +23467,7 @@
},
/obj/machinery/camera{
c_tag = "Chief Engineer's Office";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -23841,17 +23522,20 @@
/turf/closed/wall,
/area/security/checkpoint/engineering)
"aYx" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aYy" = (
/obj/machinery/camera{
c_tag = "AI Chamber - Port";
dir = 4;
- network = list("RD")
+ network = list("rd")
},
/obj/structure/showcase/cyborg/old{
dir = 4;
@@ -23997,8 +23681,7 @@
"aYP" = (
/obj/machinery/camera{
c_tag = "Cargo Bay - Aft";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -24565,7 +24248,7 @@
/obj/machinery/camera{
c_tag = "AI Chamber - Core";
dir = 2;
- network = list("RD")
+ network = list("rd")
},
/turf/open/floor/plasteel/vault{
dir = 10
@@ -24968,8 +24651,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Fore - Port Corner";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/neutral/corner{
dir = 1
@@ -25150,8 +24832,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Fore - Courtroom";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 8
@@ -25219,8 +24900,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Fore - Starboard Corner";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/neutral/corner{
dir = 4
@@ -25464,7 +25144,7 @@
desc = "Used for monitoring the engine.";
dir = 8;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("engine");
pixel_x = 32
},
/turf/open/floor/plasteel/vault{
@@ -25503,8 +25183,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Entrance";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -25519,7 +25198,7 @@
/obj/machinery/computer/security/telescreen{
dir = 4;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_x = -29
},
/turf/open/floor/plasteel/red/side{
@@ -25577,7 +25256,7 @@
/obj/machinery/camera{
c_tag = "AI Chamber - Starboard";
dir = 8;
- network = list("RD")
+ network = list("rd")
},
/obj/structure/showcase/cyborg/old{
dir = 8;
@@ -25731,8 +25410,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo - Foyer";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/brown{
dir = 4
@@ -25842,8 +25520,7 @@
"bcr" = (
/obj/machinery/camera{
c_tag = "Auxiliary Tool Storage";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/airalarm{
dir = 8;
@@ -26062,7 +25739,7 @@
desc = "Used for monitoring the engine.";
dir = 8;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("engine");
pixel_x = 32
},
/turf/open/floor/plasteel/red/side{
@@ -26166,8 +25843,7 @@
},
/obj/machinery/camera{
c_tag = "Customs Checkpoint";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/red/side{
dir = 1
@@ -26687,7 +26363,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_y = -30
},
/turf/open/floor/plasteel/vault{
@@ -26754,8 +26430,7 @@
"bem" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/button/door{
desc = "A remote control-switch for the engineering security doors.";
@@ -26835,7 +26510,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Port Fore";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/aisat)
@@ -26876,7 +26551,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Starboard Fore";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/aisat)
@@ -27046,8 +26721,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo - Office";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/brown{
dir = 8
@@ -27117,8 +26791,7 @@
/obj/item/reagent_containers/spray/cleaner,
/obj/machinery/camera{
c_tag = "Custodial Closet";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light/small{
dir = 8
@@ -27321,8 +26994,7 @@
/obj/effect/landmark/start/captain,
/obj/machinery/camera{
c_tag = "Captain's Quarters";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
@@ -28105,8 +27777,7 @@
},
/obj/machinery/camera{
c_tag = "Bridge - Central";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/table/glass,
/turf/open/floor/plasteel/darkbrown/side{
@@ -28331,8 +28002,7 @@
},
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway - Tech Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/yellow/corner{
dir = 1
@@ -28626,7 +28296,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Space Access";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -28669,7 +28339,7 @@
/obj/machinery/camera{
c_tag = "AI Chamber - Aft";
dir = 1;
- network = list("RD")
+ network = list("rd")
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/dark,
@@ -29569,8 +29239,7 @@
},
/obj/machinery/camera{
c_tag = "Cargo - Mailroom";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/arrival{
dir = 2
@@ -29856,7 +29525,7 @@
icon_state = "2-4"
},
/obj/machinery/computer/security/mining{
- network = list("MINE","AuxBase")
+ network = list("mine","auxbase")
},
/obj/machinery/keycard_auth{
pixel_y = 24
@@ -30071,8 +29740,7 @@
},
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/caution/corner{
dir = 8
@@ -30114,8 +29782,7 @@
},
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway - Engineering";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/caution/corner{
dir = 8
@@ -30610,7 +30277,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching Prison Wing holding areas.";
name = "Prison Monitor";
- network = list("Prison");
+ network = list("prison");
pixel_y = 30
},
/turf/open/floor/wood,
@@ -30786,8 +30453,7 @@
},
/obj/machinery/camera{
c_tag = "Bridge - Starboard";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/darkblue/side{
dir = 4
@@ -31029,8 +30695,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Foyer - Starboard";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/break_room)
@@ -31226,7 +30891,7 @@
/obj/machinery/camera{
c_tag = "MiniSat - Antechamber";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -31352,8 +31017,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
c_tag = "Arrivals - Station Entrance";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -31475,8 +31139,7 @@
},
/obj/machinery/camera{
c_tag = "Port Primary Hallway - Middle";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/neutral/corner{
dir = 1
@@ -31649,8 +31312,7 @@
/obj/structure/cable/yellow,
/obj/machinery/camera{
c_tag = "Bridge - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/darkblue/side{
dir = 8
@@ -31808,8 +31470,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Starboard - Art Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/neutral/corner{
@@ -31882,8 +31543,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel,
/obj/machinery/camera{
c_tag = "Bar - Backroom";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
@@ -32095,7 +31755,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Fore";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
@@ -32110,9 +31770,6 @@
dir = 6
},
/area/security/checkpoint/customs)
-"bpu" = (
-/turf/closed/wall/r_wall,
-/area/space/nearstation)
"bpv" = (
/obj/structure/sign/warning/securearea{
pixel_y = 32
@@ -32495,8 +32152,7 @@
},
/obj/machinery/camera{
c_tag = "Arrivals - Lounge";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel/grimy,
@@ -32816,7 +32472,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_y = -29
},
/turf/open/floor/plasteel/darkblue/side{
@@ -33285,8 +32941,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering - Foyer - Port";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/structure/table/glass,
/turf/open/floor/plasteel/cafeteria{
@@ -33456,7 +33111,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior Access";
dir = 1;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/power/apc{
aidisabled = 0;
@@ -33550,7 +33205,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 4;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_x = -28
},
/turf/open/floor/plasteel/vault{
@@ -33572,7 +33227,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat Foyer";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/darkblue/corner{
dir = 8
@@ -33630,7 +33285,7 @@
/obj/machinery/computer/security/telescreen{
dir = 8;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_x = 28
},
/turf/open/floor/plasteel/vault{
@@ -33655,7 +33310,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_y = -29
},
/turf/open/floor/plasteel/dark,
@@ -33679,7 +33334,7 @@
/obj/machinery/camera/motion{
c_tag = "MiniSat Maintenance";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -33904,8 +33559,7 @@
},
/obj/machinery/camera{
c_tag = "Port Primary Hallway - Starboard";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 8
@@ -34050,8 +33704,7 @@
},
/obj/machinery/camera{
c_tag = "Bridge - Command Chair";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/carpet,
/area/bridge)
@@ -34424,7 +34077,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_y = -28
},
/turf/open/floor/plasteel/darkblue/corner,
@@ -34555,8 +34208,7 @@
},
/obj/machinery/camera{
c_tag = "Port Primary Hallway - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/port)
@@ -34870,8 +34522,7 @@
"buJ" = (
/obj/machinery/camera{
c_tag = "Captain's Office";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private)
@@ -34883,8 +34534,7 @@
},
/obj/machinery/camera{
c_tag = "Captain's Office - Emergency Escape";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating{
icon_state = "platingdmg2"
@@ -35173,8 +34823,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/machinery/camera{
c_tag = "Engineering - Transit Tube Access";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/corner{
dir = 2
@@ -35455,9 +35104,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/turf/open/floor/plating,
/area/maintenance/department/science/xenobiology)
"bvU" = (
@@ -35659,8 +35305,7 @@
},
/obj/machinery/camera{
c_tag = "Bridge - Port Access";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/darkblue/corner{
dir = 1
@@ -35699,8 +35344,7 @@
"bwv" = (
/obj/machinery/camera{
c_tag = "Council Chamber";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/light{
dir = 1
@@ -35737,8 +35381,7 @@
},
/obj/machinery/camera{
c_tag = "Bridge - Starboard Access";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/darkblue/corner,
/area/bridge)
@@ -35886,8 +35529,7 @@
"bwM" = (
/obj/machinery/camera{
c_tag = "Bar";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/machinery/requests_console{
department = "Bar";
@@ -35985,8 +35627,7 @@
},
/obj/machinery/camera{
c_tag = "Club - Fore";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
@@ -36182,8 +35823,7 @@
"bxu" = (
/obj/machinery/camera{
c_tag = "Arrivals - Middle Arm - Far";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/status_display{
pixel_y = -32
@@ -36229,8 +35869,7 @@
},
/obj/machinery/camera{
c_tag = "Arrivals - Middle Arm";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -36885,8 +36524,7 @@
pixel_y = 32
},
/obj/machinery/camera{
- c_tag = "Atmospherics - Control Room";
- network = list("SS13")
+ c_tag = "Atmospherics - Control Room"
},
/obj/machinery/computer/station_alert,
/turf/open/floor/plasteel/caution{
@@ -36954,8 +36592,7 @@
icon_state = "0-2"
},
/obj/machinery/camera{
- c_tag = "Atmospherics - Entrance";
- network = list("SS13")
+ c_tag = "Atmospherics - Entrance"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -37041,8 +36678,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
- c_tag = "Atmospherics - Distro Loop";
- network = list("SS13")
+ c_tag = "Atmospherics - Distro Loop"
},
/turf/open/floor/plasteel/caution{
dir = 1
@@ -37110,7 +36746,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Port Aft";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -37202,7 +36838,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Starboard Aft";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/turf/open/floor/plasteel/dark,
/area/aisat)
@@ -37281,8 +36917,7 @@
dir = 4
},
/obj/machinery/camera/autoname{
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
@@ -37493,7 +37128,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "MiniSat Monitor";
- network = list("MiniSat","tcomm");
+ network = list("minisat","tcomm");
pixel_y = -29
},
/obj/structure/bed/dogbed/renault,
@@ -37640,8 +37275,7 @@
},
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway - Atmospherics";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/arrival{
dir = 8
@@ -37859,8 +37493,7 @@
"bAZ" = (
/obj/machinery/camera{
c_tag = "Head of Personnel's Office";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/structure/table/wood,
/obj/item/storage/box/PDAs{
@@ -38565,7 +38198,6 @@
/obj/machinery/atmospherics/pipe/simple/purple/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/space,
/area/space/nearstation)
"bCA" = (
@@ -38670,8 +38302,7 @@
/obj/machinery/light/small,
/obj/machinery/camera{
c_tag = "Auxilary Restrooms";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/crew_quarters/toilet/auxiliary)
@@ -38948,8 +38579,7 @@
},
/obj/machinery/camera{
c_tag = "Command Hallway - Starboard";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/neutral/corner{
dir = 4
@@ -39246,7 +38876,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Server Room - Fore-Port";
dir = 2;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/tcommsat/server)
@@ -39277,7 +38907,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Server Room - Fore-Starboard";
dir = 2;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/tcommsat/server)
@@ -39376,8 +39006,7 @@
pixel_x = -32
},
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
@@ -39511,8 +39140,7 @@
},
/obj/machinery/camera{
c_tag = "Command Hallway - Port";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 8
@@ -40310,8 +39938,7 @@
"bGb" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - Mix";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/vacuum,
/area/engine/atmos)
@@ -40432,8 +40059,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Port";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/neutral/corner{
dir = 2
@@ -40565,8 +40191,7 @@
},
/obj/machinery/camera{
c_tag = "Command Hallway - Central";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/neutral/corner{
dir = 2
@@ -41349,17 +40974,13 @@
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
"bIv" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"bIw" = (
/obj/machinery/light,
/obj/machinery/camera{
c_tag = "Kitchen Hatch";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
@@ -41641,7 +41262,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Control Room";
dir = 1;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/obj/structure/table/wood,
/obj/item/pen,
@@ -42181,8 +41802,7 @@
"bKn" = (
/obj/machinery/camera{
c_tag = "Club - Aft";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = -29
@@ -42404,7 +42024,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Aft Starboard";
dir = 4;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/structure/window/reinforced{
dir = 4
@@ -42457,8 +42077,7 @@
},
/obj/machinery/camera{
c_tag = "Arrivals - Aft Arm";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/arrival{
dir = 4
@@ -42793,8 +42412,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Starboard - Kitchen";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/neutral/corner{
dir = 1
@@ -42921,8 +42539,7 @@
},
/obj/machinery/camera{
c_tag = "Telecomms - Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/dark,
/area/storage/tcom)
@@ -43002,8 +42619,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics - Central";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -43032,10 +42648,6 @@
/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bMi" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bMj" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel,
@@ -43073,8 +42685,7 @@
"bMn" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - N2O";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
@@ -43089,7 +42700,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Server Room - Aft-Port";
dir = 4;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/turf/open/floor/plasteel/dark/telecomms/mainframe,
/area/tcommsat/server)
@@ -43127,7 +42738,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Server Room - Aft-Starboard";
dir = 8;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/obj/structure/cable/yellow{
icon_state = "0-8"
@@ -43146,8 +42757,7 @@
"bMu" = (
/obj/machinery/camera{
c_tag = "Arrivals - Aft Arm - Far";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -43325,8 +42935,7 @@
/obj/item/folder,
/obj/item/folder,
/obj/machinery/camera/autoname{
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/structure/table/wood,
/obj/item/device/taperecorder,
@@ -43435,8 +43044,7 @@
"bMZ" = (
/obj/machinery/camera{
c_tag = "Teleporter Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/rack,
/obj/structure/window/reinforced{
@@ -43531,8 +43139,7 @@
/obj/item/clothing/glasses/sunglasses,
/obj/machinery/camera{
c_tag = "Corporate Showroom";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/wood,
/area/bridge/showroom/corporate)
@@ -43591,8 +43198,7 @@
},
/obj/machinery/camera{
c_tag = "Gateway - Atrium";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/turf_decal/bot{
dir = 1
@@ -43921,7 +43527,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Aft Port";
dir = 8;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/structure/window/reinforced{
dir = 8
@@ -43944,7 +43550,7 @@
/obj/machinery/camera{
c_tag = "Telecomms - Server Room - Aft";
dir = 1;
- network = list("SS13","tcomm")
+ network = list("ss13","tcomm")
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/ntnet_relay,
@@ -45605,8 +45211,7 @@
},
/obj/machinery/camera{
c_tag = "Gateway - Access";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -45686,8 +45291,7 @@
/obj/item/kitchen/rollingpin,
/obj/machinery/camera{
c_tag = "Kitchen";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/cafeteria{
dir = 2
@@ -45779,8 +45383,7 @@
},
/obj/machinery/camera{
c_tag = "Kitchen - Coldroom";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
@@ -45843,8 +45446,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light{
dir = 8
@@ -45901,8 +45503,7 @@
"bSl" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - Toxins";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/plasma,
/area/engine/atmos)
@@ -46366,8 +45967,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics - Starboard";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -46402,10 +46002,10 @@
/turf/closed/wall,
/area/maintenance/solars/port/aft)
"bTq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bTr" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -46453,8 +46053,7 @@
pixel_y = -24
},
/obj/machinery/camera/autoname{
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/structure/table/wood,
/turf/open/floor/wood,
@@ -46982,8 +46581,12 @@
},
/area/maintenance/starboard)
"bUw" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel/dark,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plating,
/area/engine/engineering)
"bUx" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -47470,7 +47073,6 @@
/turf/closed/wall,
/area/hallway/secondary/service)
"bVA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock{
name = "Service Hall";
req_access_txt = "null";
@@ -47619,8 +47221,7 @@
},
/obj/machinery/camera{
c_tag = "Aft Port Solar Maintenance";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
@@ -47801,8 +47402,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Aft-Port Corner";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 8
@@ -48018,8 +47618,7 @@
},
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Aft-Starboard Corner";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/neutral/corner{
dir = 2
@@ -48233,6 +47832,9 @@
/obj/structure/cable/yellow{
icon_state = "2-4"
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"bXc" = (
@@ -48405,8 +48007,7 @@
"bXs" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - CO2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/co2,
/area/engine/atmos)
@@ -48561,8 +48162,7 @@
"bXQ" = (
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Aft-Port";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/blue/corner{
dir = 8
@@ -48600,8 +48200,7 @@
"bXW" = (
/obj/machinery/camera{
c_tag = "Central Primary Hallway - Aft-Starboard";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/purple/corner{
dir = 2
@@ -48669,8 +48268,7 @@
/area/hallway/primary/central)
"bYe" = (
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/item/book/manual/hydroponics_pod_people,
/obj/item/paper/guides/jobs/hydroponics,
@@ -48737,8 +48335,7 @@
dir = 4
},
/obj/machinery/camera/autoname{
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/table/glass,
/obj/effect/turf_decal/stripes/line{
@@ -48843,8 +48440,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics - Port-Aft";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/caution{
dir = 8
@@ -49125,7 +48721,7 @@
/obj/machinery/camera{
c_tag = "Security Post - Medbay";
dir = 2;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/red/side{
dir = 1
@@ -49831,7 +49427,7 @@
/obj/machinery/camera{
c_tag = "Research Division - Lobby";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/side{
dir = 1
@@ -50547,7 +50143,7 @@
/obj/machinery/camera{
c_tag = "Medbay Storage";
dir = 8;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/closet/crate/freezer/surplus_limbs,
@@ -50573,7 +50169,7 @@
desc = "Used for monitoring medbay to ensure patient safety.";
dir = 1;
name = "Medbay Monitor";
- network = list("Medbay");
+ network = list("medbay");
pixel_y = -29
},
/obj/item/device/radio/intercom{
@@ -50755,7 +50351,7 @@
desc = "Used for watching the RD's goons from the safety of his office.";
dir = 8;
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_x = 28;
pixel_y = 2
},
@@ -50789,8 +50385,7 @@
/obj/item/paper/guides/jobs/hydroponics,
/obj/machinery/camera{
c_tag = "Hydroponics - Foyer";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/item/device/radio/intercom{
pixel_y = -25
@@ -51093,8 +50688,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics - Starboard Aft";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
@@ -51539,7 +51133,7 @@
/obj/machinery/camera{
c_tag = "Security Post - Research Division";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/red/side{
dir = 4
@@ -51908,7 +51502,7 @@
/obj/machinery/camera{
c_tag = "Medbay Foyer";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/side{
dir = 2
@@ -53294,7 +52888,7 @@
/obj/machinery/camera{
c_tag = "Experimentation Lab - Test Chamber";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/light{
dir = 1
@@ -53413,7 +53007,7 @@
/obj/machinery/camera{
c_tag = "MiniSat Exterior - Aft";
dir = 2;
- network = list("MiniSat")
+ network = list("minisat")
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
@@ -53662,7 +53256,7 @@
/obj/machinery/camera{
c_tag = "Medbay Hallway Fore";
dir = 2;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/corner{
dir = 4
@@ -53890,7 +53484,7 @@
/obj/machinery/camera{
c_tag = "Research Division - Airlock";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -54041,8 +53635,7 @@
"cje" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - N2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
@@ -54056,8 +53649,7 @@
"cjh" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - O2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/o2,
/area/engine/atmos)
@@ -54072,8 +53664,7 @@
"cjk" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank - Air";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/engine/air,
/area/engine/atmos)
@@ -54234,7 +53825,7 @@
/obj/machinery/camera{
c_tag = "Medbay Sleepers";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/side{
dir = 10
@@ -55119,8 +54710,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Aft Primary Hallway - Fore";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/firealarm{
dir = 4;
@@ -55305,7 +54895,7 @@
/obj/machinery/camera{
c_tag = "Research Division - Break Room";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/cafeteria{
dir = 5
@@ -55667,7 +55257,7 @@
/obj/machinery/camera{
c_tag = "Research and Development";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/light_switch{
pixel_x = 27
@@ -56199,7 +55789,7 @@
/obj/machinery/camera{
c_tag = "Chemistry";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/machinery/light{
dir = 8
@@ -56394,7 +55984,7 @@
/obj/machinery/camera{
c_tag = "Research Division Hallway - Central";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/research)
@@ -56781,7 +56371,7 @@
/obj/machinery/camera{
c_tag = "CMO's Office";
dir = 8;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/barber{
dir = 8
@@ -57306,23 +56896,23 @@
},
/area/maintenance/port/aft)
"cpR" = (
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = -26;
+ req_access_txt = "11"
+ },
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 10
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Port";
- dir = 8;
- network = list("SS13","Engine")
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/machinery/airalarm/engine{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"cpS" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -57816,7 +57406,7 @@
/obj/machinery/camera{
c_tag = "Research Division Hallway - Starboard";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/research)
@@ -57901,7 +57491,7 @@
/obj/machinery/camera{
c_tag = "Experimentation Lab";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/light,
/turf/open/floor/plasteel/white,
@@ -58089,7 +57679,7 @@
/obj/machinery/camera{
c_tag = "Medbay Cryo";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/item/screwdriver{
pixel_y = 6
@@ -58524,7 +58114,7 @@
/obj/machinery/camera{
c_tag = "Medbay Surgery";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/white,
/area/medical/surgery)
@@ -58587,7 +58177,7 @@
/obj/machinery/camera{
c_tag = "Medbay Recovery Room";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/side{
dir = 2
@@ -58611,7 +58201,7 @@
/obj/machinery/camera{
c_tag = "Medbay Hallway Central";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/corner{
dir = 8
@@ -58735,7 +58325,7 @@
desc = "Used for monitoring medbay to ensure patient safety.";
dir = 8;
name = "Medbay Monitor";
- network = list("Medbay");
+ network = list("medbay");
pixel_x = 29
},
/obj/item/device/radio/intercom{
@@ -59004,7 +58594,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons from the safety of his office.";
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = 2
},
/obj/structure/table/reinforced,
@@ -59127,7 +58717,7 @@
active_power_usage = 0;
c_tag = "Turbine Vent";
dir = 4;
- network = list("Turbine");
+ network = list("turbine");
use_power = 0
},
/turf/open/space,
@@ -59971,7 +59561,7 @@
/obj/machinery/camera{
c_tag = "Toxins Storage";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -60177,7 +59767,7 @@
/obj/machinery/camera{
c_tag = "Genetics Lab";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue,
/area/medical/genetics)
@@ -60717,7 +60307,7 @@
/obj/machinery/camera{
c_tag = "Genetics Desk";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/structure/table/glass,
/turf/open/floor/plasteel/blue/side{
@@ -60802,7 +60392,7 @@
/obj/machinery/camera{
c_tag = "Research Division Hallway - Mech Bay";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/airalarm{
dir = 4;
@@ -60879,7 +60469,7 @@
/obj/machinery/camera{
c_tag = "Research Director's Office";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/light,
/turf/open/floor/plasteel/cafeteria{
@@ -61242,7 +60832,7 @@
/obj/machinery/camera{
c_tag = "Mech Bay";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/circuit/green,
/area/science/robotics/mechbay)
@@ -61253,7 +60843,7 @@
/obj/machinery/camera{
c_tag = "Research Testing Range";
dir = 8;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_y = -22
},
/obj/machinery/airalarm{
@@ -61670,7 +61260,7 @@
/obj/machinery/camera{
c_tag = "Toxins - Lab";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/portable_atmospherics/canister,
@@ -61856,7 +61446,7 @@
/obj/machinery/camera{
c_tag = "Genetics Cloning Lab";
dir = 8;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whiteblue/side{
dir = 6
@@ -62443,8 +62033,7 @@
},
/obj/machinery/camera{
c_tag = "Aft Primary Hallway - Middle";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -62799,7 +62388,7 @@
dir = 8;
layer = 4;
name = "Test Chamber Telescreen";
- network = list("Toxins");
+ network = list("toxins");
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -63237,7 +62826,7 @@
dir = 8;
layer = 4;
name = "Test Chamber Telescreen";
- network = list("Toxins");
+ network = list("toxins");
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -63328,7 +62917,7 @@
/obj/machinery/camera{
c_tag = "Medbay Break Room";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/cafeteria{
dir = 5
@@ -63715,7 +63304,7 @@
/obj/machinery/camera{
c_tag = "Medbay Hallway Aft";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/white/side{
dir = 5
@@ -63899,7 +63488,7 @@
/obj/machinery/camera{
c_tag = "Robotics - Fore";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -64060,7 +63649,7 @@
light = null;
luminosity = 3;
name = "Hardened Bomb-Test Camera";
- network = list("Toxins");
+ network = list("toxins");
use_power = 0
},
/obj/item/target/alien/anchored,
@@ -64978,7 +64567,7 @@
/obj/machinery/camera{
c_tag = "Research Division Hallway - Robotics";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/research)
@@ -65047,7 +64636,7 @@
/obj/machinery/camera{
c_tag = "Toxins - Mixing Area";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -65107,7 +64696,7 @@
/obj/machinery/camera{
c_tag = "Virology - Cells";
dir = 4;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whitegreen/side{
dir = 9
@@ -66174,7 +65763,7 @@
/obj/machinery/camera{
c_tag = "Virology - Lab";
dir = 8;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/structure/sink{
dir = 4;
@@ -66201,7 +65790,7 @@
/obj/machinery/camera{
c_tag = "Virology - Airlock";
dir = 1;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/machinery/light,
/obj/structure/closet/l3closet,
@@ -66233,7 +65822,7 @@
/obj/machinery/camera{
c_tag = "Virology - Entrance";
dir = 8;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/machinery/light/small{
dir = 4
@@ -66531,7 +66120,7 @@
/obj/machinery/camera{
c_tag = "Research Division - Server Room";
dir = 2;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_x = 22
},
/obj/machinery/power/apc{
@@ -66826,8 +66415,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Aft Primary Hallway - Aft";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/escape{
dir = 2
@@ -67585,7 +67173,7 @@
/obj/machinery/camera{
c_tag = "Virology - Break Room";
dir = 2;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/turf/open/floor/plasteel/whitegreen/side{
dir = 1
@@ -68280,7 +67868,7 @@
desc = "Used for watching the turbine vent.";
dir = 8;
name = "turbine vent monitor";
- network = list("Turbine");
+ network = list("turbine");
pixel_x = 29
},
/obj/machinery/button/door{
@@ -68310,15 +67898,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cLE" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1;
- name = "euthanization chamber freezer";
- on = 1;
- target_temperature = 80
- },
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cLF" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -68565,8 +68144,7 @@
},
/obj/machinery/camera{
c_tag = "Departure Lounge - Starboard Fore";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/structure/extinguisher_cabinet{
pixel_x = 27
@@ -68640,8 +68218,7 @@
},
/obj/machinery/camera{
c_tag = "Aft Starboard Solar Maintenance";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
@@ -68811,8 +68388,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel - Fore";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/table/wood,
/turf/open/floor/plasteel/vault,
@@ -68983,7 +68559,6 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching output from station security cameras.";
name = "Security Camera Monitor";
- network = list("SS13");
pixel_y = 30
},
/turf/open/floor/plasteel/red/side{
@@ -69192,8 +68767,7 @@
"cNu" = (
/obj/machinery/camera{
c_tag = "Chapel Office - Backroom";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/item/device/radio/intercom{
dir = 4;
@@ -69524,8 +69098,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel Office";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
@@ -69697,8 +69270,7 @@
},
/obj/machinery/camera{
c_tag = "Departure Lounge - Security Post";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/item/book/manual/wiki/security_space_law{
pixel_x = -4;
@@ -70243,8 +69815,7 @@
"cPO" = (
/obj/machinery/camera{
c_tag = "Departure Lounge - Port Aft";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/machinery/light{
dir = 8
@@ -70309,8 +69880,7 @@
"cPV" = (
/obj/machinery/camera{
c_tag = "Departure Lounge - Starboard Aft";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light{
dir = 4
@@ -70514,7 +70084,7 @@
/obj/machinery/camera{
c_tag = "Research Division Hallway - Xenobiology Lab Access";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/side{
dir = 1
@@ -70560,7 +70130,7 @@
/obj/machinery/camera{
c_tag = "Toxins - Launch Area";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/suit_storage_unit/rd,
/obj/effect/turf_decal/bot{
@@ -70577,7 +70147,7 @@
/turf/open/floor/plasteel/vault,
/area/chapel/main)
"cQB" = (
-/obj/machinery/doppler_array{
+/obj/machinery/doppler_array/research/science{
dir = 4
},
/obj/item/device/radio/intercom{
@@ -70658,8 +70228,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel - Starboard";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/chapel{
dir = 4
@@ -70884,8 +70453,7 @@
"cRn" = (
/obj/machinery/camera{
c_tag = "Chapel - Port";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/structure/chair/comfy/black{
dir = 4
@@ -71334,7 +70902,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #1";
dir = 4;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -71408,7 +70976,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #2";
dir = 8;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -71909,7 +71477,7 @@
/obj/machinery/computer/security/telescreen{
dir = 1;
name = "Test Chamber Monitor";
- network = list("Xeno");
+ network = list("xeno");
pixel_y = 2
},
/obj/structure/table/reinforced,
@@ -72007,7 +71575,7 @@
"cTT" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"cUH" = (
/obj/structure/table/optable,
/turf/open/floor/plasteel/white,
@@ -72253,6 +71821,12 @@
},
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
+"cWu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cWA" = (
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
@@ -72289,18 +71863,6 @@
/obj/structure/easel,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"cXz" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Aft";
- dir = 1;
- network = list("SS13","Engine")
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cXA" = (
/turf/closed/wall/r_wall,
/area/security/checkpoint/engineering)
@@ -72313,7 +71875,12 @@
},
/area/construction/mining/aux_base)
"cXI" = (
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"cXR" = (
@@ -72325,11 +71892,12 @@
},
/area/construction/mining/aux_base)
"cXZ" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/structure/window/reinforced{
- dir = 8
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
},
-/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard)
"cYc" = (
@@ -72342,15 +71910,16 @@
/obj/machinery/camera{
c_tag = "Robotics - Aft";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white/side{
dir = 1
},
/area/science/robotics/lab)
"cYj" = (
-/obj/structure/closet/firecloset,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"cYE" = (
@@ -72386,7 +71955,7 @@
desc = "Used for the Auxillary Mining Base.";
dir = 1;
name = "Auxillary Base Monitor";
- network = list("AuxBase");
+ network = list("auxbase");
pixel_y = -28
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
@@ -72478,9 +72047,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"cZv" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cZR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/yellow{
@@ -72582,7 +72148,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Test Chamber";
dir = 1;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -72626,9 +72192,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
/obj/machinery/light/small{
dir = 1
},
@@ -72638,33 +72201,28 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"daR" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1;
- external_pressure_bound = 140;
- name = "server vent";
- pressure_checks = 0
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"daS" = (
/obj/structure/disposalpipe/segment,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"daW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
},
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/area/maintenance/department/science/xenobiology)
+"daW" = (
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "11"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"daX" = (
/obj/structure/cable/yellow{
@@ -72674,27 +72232,20 @@
icon_state = "platingdmg2"
},
/area/maintenance/port/fore)
-"daY" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"daZ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
+/obj/structure/particle_accelerator/particle_emitter/right{
+ icon_state = "emitter_right";
+ dir = 4
},
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"dbb" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/structure/particle_accelerator/particle_emitter/center{
+ icon_state = "emitter_center";
+ dir = 4
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"dbd" = (
/obj/structure/sink/kitchen{
pixel_y = 28
@@ -72707,30 +72258,6 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
-"dbg" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dbh" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"dbj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -72760,7 +72287,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #3";
dir = 4;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -72771,7 +72298,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #4";
dir = 8;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -72784,7 +72311,7 @@
/obj/machinery/camera{
c_tag = "Morgue";
dir = 2;
- network = list("SS13","Medbay")
+ network = list("ss13","medbay")
},
/obj/structure/bodycontainer/morgue{
dir = 8
@@ -72798,7 +72325,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #5";
dir = 4;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
@@ -72809,24 +72336,17 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Pen #6";
dir = 8;
- network = list("SS13","RD","Xeno")
+ network = list("ss13","rd","xeno")
},
/turf/open/floor/engine,
/area/science/xenobiology)
"dbv" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/small,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"dbw" = (
-/obj/machinery/camera{
- c_tag = "Xenobiology Lab - Kill Chamber";
- dir = 1;
- network = list("SS13","RD","Xeno");
- start_active = 1
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
},
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dbE" = (
/obj/machinery/plantgenes,
/obj/effect/turf_decal/stripes/line{
@@ -73059,7 +72579,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Fore";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/whitepurple/side{
dir = 1
@@ -73233,15 +72753,18 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/effect/turf_decal/stripes/line{
- dir = 9
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
@@ -73265,7 +72788,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -73299,7 +72821,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Airlock";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -73335,9 +72857,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/structure/chair/comfy/black{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line{
dir = 10
},
@@ -73352,9 +72871,6 @@
/area/science/xenobiology)
"dcx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/chair/comfy/black{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line{
dir = 6
},
@@ -73432,18 +72948,13 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcJ" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/extinguisher{
- pixel_x = 4;
- pixel_y = 3
- },
-/obj/item/extinguisher,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcK" = (
@@ -73492,7 +73003,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Central";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line{
@@ -73687,7 +73198,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Aft-Port";
dir = 4;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -73702,7 +73213,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Lab - Aft-Starboard";
dir = 8;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -73869,11 +73380,8 @@
},
/obj/structure/chair,
/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"ddy" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
@@ -73881,9 +73389,8 @@
/area/maintenance/department/science/xenobiology)
"ddz" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plating,
-/area/science/xenobiology)
+/turf/closed/wall/r_wall,
+/area/maintenance/department/science/xenobiology)
"ddA" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
@@ -73893,23 +73400,15 @@
opacity = 0;
req_access_txt = "55"
},
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"ddB" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 1;
- external_pressure_bound = 120;
- name = "server vent"
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/turf/closed/wall/r_wall,
+/area/maintenance/department/science/xenobiology)
"ddC" = (
/obj/structure/disposalpipe/trunk{
dir = 1
},
/obj/structure/disposaloutlet,
/turf/open/floor/plating/airless,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"ddE" = (
/obj/effect/landmark/start/cook,
/obj/machinery/holopad,
@@ -73927,16 +73426,12 @@
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
"ddO" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"ddP" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -73950,41 +73445,10 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"ddS" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 4;
- network = list("SS13","Engine")
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = -26
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddT" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddU" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddV" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"ddW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "2-4"
},
@@ -73997,28 +73461,14 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ddY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/engineering)
"ddZ" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dea" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- volume_rate = 200
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
/turf/open/floor/plating/airless,
-/area/engine/engineering)
+/area/space)
"deb" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -74026,644 +73476,153 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"ded" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dee" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"def" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"deh" = (
-/obj/structure/cable/white{
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dei" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dej" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dek" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "Mix to Gas"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"del" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/space,
+/area/space)
"dem" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Gas to Mix"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"den" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dep" = (
-/obj/machinery/firealarm{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"deq" = (
-/obj/item/device/radio/intercom{
- freerange = 0;
- frequency = 1459;
- name = "Station Intercom (General)";
- pixel_y = 21
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"der" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"des" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deu" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dev" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dew" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Laser Room";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dex" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dey" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deA" = (
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deB" = (
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "1-2"
},
+/turf/open/space,
+/area/space)
+"den" = (
/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deC" = (
-/obj/effect/turf_decal/bot{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"der" = (
+/obj/structure/closet/secure_closet/engineering_welding,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
-"deD" = (
-/obj/machinery/status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"deI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deK" = (
-/obj/structure/cable/white,
-/obj/machinery/power/emitter/anchored{
- dir = 2;
+"dev" = (
+/obj/machinery/field/generator{
+ anchored = 1;
state = 2
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deL" = (
-/obj/structure/cable/white,
-/obj/machinery/light{
- dir = 4
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"dew" = (
+/turf/open/space,
+/area/space/nearstation)
+"deB" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deM" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"deN" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deO" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"deS" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"deU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"deD" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/turf/open/floor/plating/airless,
+/area/space)
+"deM" = (
+/obj/structure/table,
+/obj/effect/turf_decal/delivery,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
/area/engine/engineering)
"deV" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"deW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 4;
- network = list("SS13","Engine")
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space)
"deY" = (
-/obj/structure/reflector/single/anchored{
- dir = 9
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"dfa" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dfb" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfc" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dff" = (
-/obj/structure/reflector/double/anchored{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfg" = (
-/obj/structure/reflector/single/anchored{
- dir = 10
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plating,
/area/engine/engineering)
"dfh" = (
-/obj/structure/sign/warning/nosmoking,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dfi" = (
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/table,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/storage/belt/utility,
+/obj/item/storage/belt/utility,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 10
+ },
+/turf/open/floor/plasteel/yellow/side{
dir = 4
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
/area/engine/engineering)
-"dfj" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfk" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dfm" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"dfp" = (
-/obj/effect/turf_decal/bot{
+/obj/structure/closet/firecloset,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfq" = (
-/obj/machinery/camera{
- c_tag = "Supermatter Chamber";
- dir = 4;
- network = list("Engine")
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dft" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- filter_type = "n2"
- },
-/turf/open/floor/engine,
/area/engine/engineering)
"dfz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfA" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfB" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 1;
- state = 2
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfC" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 1;
- state = 2
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
+/area/space)
"dfD" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/engineering_singularity_safety{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/item/book/manual/wiki/engineering_guide,
+/obj/item/book/manual/engineering_particle_accelerator{
+ pixel_x = -3;
+ pixel_y = -3
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfE" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/meter,
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"dfI" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Cooling Loop Bypass"
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfJ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfM" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfO" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space)
"dfP" = (
/obj/structure/cable/white{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Atmos to Loop"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfQ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfR" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Gas to Cold Loop";
- on = 1
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfS" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfT" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Cold Loop to Gas";
- on = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfV" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfW" = (
-/obj/item/wrench,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"dfX" = (
/obj/structure/disposalpipe/segment,
@@ -74681,137 +73640,82 @@
},
/area/engine/engineering)
"dfY" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dfZ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"dga" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "2-8"
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dgb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"dgc" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
+/obj/item/clothing/gloves/color/rainbow,
+/obj/item/clothing/head/soft/rainbow,
+/obj/item/clothing/shoes/sneakers/rainbow,
+/obj/item/clothing/under/color/rainbow,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
},
-/turf/open/floor/plating,
/area/maintenance/starboard)
"dgd" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dge" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgf" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/cable/white{
+ icon_state = "0-2"
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/emitter{
+ anchored = 1;
+ dir = 1;
+ icon_state = "emitter";
+ state = 2
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgg" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgh" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"dgi" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgj" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/structure/grille,
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgk" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgm" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"dgo" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"dgp" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"dgr" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgt" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgu" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
-"dgv" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgw" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgz" = (
/obj/structure/closet/toolcloset,
/obj/effect/turf_decal/delivery,
@@ -74819,134 +73723,13 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"dgA" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgB" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/machinery/light{
+ dir = 4
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"dgI" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgK" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgM" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgN" = (
-/obj/structure/lattice,
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgO" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/lattice/catwalk,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/transit_tube/horizontal,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dha" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dhc" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dhe" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhg" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine";
- on = 0
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhi" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/door/window/northleft{
- dir = 8;
- icon_state = "left";
- name = "Inner Pipe Access";
- req_access_txt = "24"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"dhj" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"dhk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"dhl" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/space,
+/turf/closed/wall/mineral/plastitanium,
/area/space/nearstation)
"dhn" = (
/obj/structure/table,
@@ -75376,8 +74159,7 @@
},
/obj/machinery/camera{
c_tag = "Theatre - Stage";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light/small{
dir = 4
@@ -75544,8 +74326,7 @@
"dir" = (
/obj/machinery/camera{
c_tag = "Theatre - Backstage";
- dir = 1;
- network = list("SS13")
+ dir = 1
},
/obj/structure/sign/poster/contraband/random{
pixel_y = -32
@@ -75894,8 +74675,7 @@
},
/obj/machinery/camera{
c_tag = "Departure Lounge - Port Fore";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-24"
@@ -75945,8 +74725,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel - Funeral Parlour";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel/dark,
@@ -75969,26 +74748,18 @@
/turf/open/space,
/area/science/xenobiology)
"djt" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/engine/supermatter)
+/area/engine/engineering)
"djx" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Aft Port";
+ dir = 4;
+ network = list("singularity")
},
-/obj/item/crowbar,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"djz" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
@@ -76026,7 +74797,7 @@
id = "arrivals_stationary";
name = "arrivals";
width = 7;
- roundstart_template = /datum/map_template/shuttle/arrival/box;
+ roundstart_template = /datum/map_template/shuttle/arrival/box
},
/turf/open/space/basic,
/area/space)
@@ -76048,12 +74819,11 @@
/turf/open/floor/plating,
/area/chapel/main)
"dlI" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dlN" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/supermatter)
+/obj/structure/closet/secure_closet/engineering_electrical,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"dlV" = (
/turf/closed/wall/r_wall,
/area/maintenance/department/science/xenobiology)
@@ -76061,9 +74831,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/machinery/door/airlock/research{
glass = 1;
name = "Slime Euthanization Chamber";
@@ -76074,7 +74841,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dmr" = (
/obj/machinery/door/airlock/research{
glass = 1;
@@ -76086,7 +74853,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dmD" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
@@ -76264,6 +75031,14 @@
icon_state = "platingdmg2"
},
/area/maintenance/port/fore)
+"drT" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dsg" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -76304,6 +75079,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"dtL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space,
+/area/space)
"dtP" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -76637,46 +75419,24 @@
/turf/closed/wall,
/area/engine/gravity_generator)
"dBw" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBx" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dBy" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dBz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBB" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
+"dBy" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"dBB" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"dBC" = (
/obj/machinery/meter,
/obj/structure/grille,
@@ -77356,6 +76116,23 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
+"dPf" = (
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"dPp" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"dYu" = (
/obj/machinery/door/airlock/external{
name = "Auxiliary Airlock"
@@ -77365,6 +76142,19 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/entry)
+"dZD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space)
+"eln" = (
+/turf/open/space/basic,
+/area/engine/engineering)
+"enN" = (
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"eoK" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -77397,6 +76187,17 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"esV" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"evy" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -77407,6 +76208,25 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"eEu" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"eFN" = (
/obj/structure/bodycontainer/crematorium{
id = "crematoriumChapel";
@@ -77437,12 +76257,48 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/engine/engineering)
+"fjy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/space)
+"foU" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/computer/security/telescreen{
+ desc = "Used for watching the Engine.";
+ dir = 8;
+ layer = 4;
+ name = "Engine Monitor";
+ network = list("singularity");
+ pixel_x = 30
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
"fDD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"fGs" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"fWO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"gfh" = (
/obj/machinery/libraryscanner,
/turf/open/floor/plasteel/white,
@@ -77465,6 +76321,14 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"goZ" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"gEk" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -77490,6 +76354,14 @@
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
+"gKb" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Fore Starboard";
+ dir = 8;
+ network = list("singularity")
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"gLC" = (
/obj/structure/reagent_dispensers/water_cooler,
/turf/open/floor/plasteel,
@@ -77522,6 +76394,9 @@
},
/turf/open/floor/plating,
/area/security/prison)
+"hWU" = (
+/turf/open/floor/plating/airless,
+/area/space)
"ioI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -77549,6 +76424,37 @@
},
/turf/open/floor/plasteel/whitepurple,
/area/science/lab)
+"iOa" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/maintenance/starboard)
+"iTS" = (
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/effect/turf_decal/delivery,
+/obj/structure/table,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
+"iYY" = (
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"jjF" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"jwW" = (
/turf/closed/wall/mineral/plastitanium,
/area/crew_quarters/fitness/recreation)
@@ -77560,7 +76466,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons from the safety of your own office.";
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = 32
},
/turf/open/floor/plasteel/white,
@@ -77579,6 +76485,25 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+"jzw" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/department/science/xenobiology)
+"jFx" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard)
+"jIV" = (
+/obj/structure/closet/secure_closet/engineering_personal,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"jKK" = (
/obj/machinery/door/airlock/external{
req_access_txt = "13"
@@ -77588,6 +76513,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"jYQ" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"kfu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
@@ -77693,6 +76624,14 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"lHL" = (
+/turf/open/space/basic,
+/area/space/nearstation)
+"lLj" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
+/area/engine/engineering)
"lMz" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
@@ -77734,6 +76673,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"moI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"mvj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -77743,6 +76688,12 @@
},
/turf/closed/wall,
/area/hallway/secondary/service)
+"mwK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"mzh" = (
/obj/machinery/firealarm{
dir = 1;
@@ -77771,6 +76722,30 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/science/circuit)
+"nte" = (
+/obj/machinery/the_singularitygen/tesla,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"nwU" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"nyo" = (
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -77805,10 +76780,33 @@
},
/turf/open/floor/plasteel,
/area/construction/storage/wing)
+"nKh" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"obb" = (
/obj/structure/target_stake,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"obN" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/space,
+/area/space)
+"ocj" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"ocT" = (
/obj/machinery/light{
dir = 1
@@ -77823,7 +76821,7 @@
/obj/machinery/computer/security/telescreen{
desc = "Used for watching the RD's goons from the safety of your own office.";
name = "Research Monitor";
- network = list("RD");
+ network = list("rd");
pixel_y = 32
},
/turf/open/floor/plasteel/white,
@@ -77923,6 +76921,13 @@
dir = 2
},
/area/crew_quarters/locker)
+"pWF" = (
+/obj/effect/decal/cleanable/oil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"qnJ" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -77953,6 +76958,12 @@
"qBq" = (
/turf/closed/wall/mineral/plastitanium,
/area/hallway/secondary/entry)
+"qJG" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"qJZ" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -77963,7 +76974,7 @@
/obj/machinery/camera{
c_tag = "Research Division Circuitry Lab";
dir = 1;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
@@ -77976,6 +76987,18 @@
dir = 1
},
/area/science/lab)
+"rEi" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"rFx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/engine/engineering)
"rQK" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -77995,6 +77018,29 @@
/obj/machinery/vending/snack/random,
/turf/open/floor/plasteel,
/area/science/mixing)
+"rTo" = (
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"rVX" = (
+/obj/structure/particle_accelerator/particle_emitter/left{
+ icon_state = "emitter_left";
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"rWa" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/yellow/side,
+/area/engine/engineering)
"sdi" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -78031,6 +77077,21 @@
"sJW" = (
/turf/closed/wall/mineral/plastitanium,
/area/engine/break_room)
+"sOW" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/space)
+"sSU" = (
+/turf/closed/wall/r_wall,
+/area/space)
+"tdB" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/starboard/fore)
"tjH" = (
/obj/structure/table/reinforced,
/obj/machinery/computer/libraryconsole/bookmanagement,
@@ -78052,22 +77113,19 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"tDM" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/item/wrench,
+/turf/open/floor/plating,
+/area/engine/engineering)
"tFJ" = (
/obj/structure/bodycontainer/morgue{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
+"tMT" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/engine/engineering)
"tVY" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -78118,6 +77176,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard)
+"uQo" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
"uRM" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -78142,15 +77205,34 @@
"vhG" = (
/obj/structure/table/glass,
/obj/machinery/camera/autoname{
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"vmz" = (
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/space)
+"vAk" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"vLD" = (
/obj/structure/lattice,
/turf/open/space/basic,
/area/space)
+"vSl" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"wiZ" = (
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
@@ -78201,11 +77283,39 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"xcM" = (
+/obj/structure/closet/firecloset,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
+"xfK" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"xkG" = (
/obj/item/device/integrated_electronics/wirer,
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"xqB" = (
+/obj/structure/cable/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/power/emitter{
+ anchored = 1;
+ state = 2
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xse" = (
/obj/machinery/door/airlock/external{
name = "Solar Maintenance";
@@ -78237,6 +77347,19 @@
/obj/structure/chair/comfy,
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"xLP" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/space,
+/area/space)
+"xNI" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xVl" = (
/turf/closed/wall,
/area/hallway/secondary/service)
@@ -78247,6 +77370,24 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"xWZ" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
+"yeY" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Aft Starboard";
+ dir = 8;
+ network = list("singularity")
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"ygk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -111118,7 +110259,7 @@ cRi
cRi
cRi
daP
-cLE
+cTA
dlV
aaa
aaa
@@ -111375,10 +110516,10 @@ daF
daJ
cRi
bvT
-cRi
-cRi
-cRi
-cRi
+dlV
+dlV
+dlV
+dlV
aaa
aai
aaa
@@ -111632,10 +110773,10 @@ cSn
cSn
cRi
dmq
-cRi
-cZv
-cZv
-cRi
+dlV
+ddj
+ddj
+dlV
aaf
aag
aaa
@@ -111890,9 +111031,9 @@ cSn
cRi
ddx
ddz
-daR
-cZv
-cRe
+ddj
+ddj
+jzw
aaa
aaa
aaa
@@ -112404,9 +111545,9 @@ daK
cRi
bIv
ddz
-ddB
-cZv
-cRe
+ddj
+ddj
+jzw
aaa
aaf
aaa
@@ -112660,10 +111801,10 @@ cSn
daN
cRi
dmr
-cRi
-cZv
-dbw
-cRi
+dlV
+ddj
+ddj
+dlV
aaa
aag
aaa
@@ -112917,10 +112058,10 @@ daI
daM
cRi
cTA
-cRi
-cRi
-cRi
-cRi
+dlV
+dlV
+dlV
+dlV
aaf
aag
aaa
@@ -118454,12 +117595,12 @@ aFu
aBI
aBI
aJn
-aCO
-aFq
+lLj
+lLj
aNq
aBI
aPZ
-aRo
+aSB
aSu
aTG
aUZ
@@ -118700,7 +117841,7 @@ arJ
arI
dnh
dqu
-doh
+tdB
axO
axY
aAo
@@ -118710,12 +117851,12 @@ aEn
aFv
aGV
aHX
-aEi
-aKA
-aMc
-aEi
+aBO
+aBO
+aBO
+aBO
aOO
-aEi
+aBO
aRp
aSv
aTH
@@ -119217,7 +118358,7 @@ avt
awJ
axS
axY
-aCO
+jIV
ddW
aCT
aEp
@@ -119477,18 +118618,18 @@ axY
aAr
ddX
aCU
-aEq
-aTO
+aCW
+aBO
aGX
-aHZ
-aJp
-aTO
+aBO
+aBO
+aBO
aSB
-aTO
-aOR
-aQa
+aBO
+aBO
+aBO
aGX
-aTO
+aBK
aTK
aVd
aBI
@@ -119731,23 +118872,23 @@ avv
axY
axU
ayS
-dCk
-ddY
+enN
+ddX
deb
-deh
-aFz
-aCZ
+aBO
+aBO
+iTS
deM
-axY
-aCZ
+uQo
+foU
aMg
-aCZ
+xcM
dfh
-deM
-aCZ
-aFz
-deh
-aVe
+aBO
+aBO
+aBK
+dPp
+rFx
axY
aYu
aYu
@@ -119991,21 +119132,21 @@ ddP
aAt
aBL
deb
-dei
+aBO
aFA
+axY
+axY
deB
-deB
-deB
-deB
+axY
aMh
-deB
-deB
-deB
-deB
+axY
+axY
+nKh
+aBO
aSz
-aTM
+aTK
aVe
-apc
+aJu
aYu
aZL
bbB
@@ -120248,21 +119389,21 @@ aAu
ddQ
aBM
aCV
-aEr
+aBO
aFB
-aGY
+axY
daW
dBw
-aKF
+dBw
aMi
cpR
-dfi
+axY
aQd
-dBA
+aBO
aSA
-aTN
-aVf
-apc
+aTK
+aVe
+aJu
aYu
aZM
bbC
@@ -120505,21 +119646,21 @@ ayV
aAv
aBN
aCW
-aEr
-aFC
+aBO
+aFA
aGZ
-aGZ
-dlI
+qJG
+aJu
aKG
-aMj
+aJu
dBy
-dlI
-aQe
-aRv
+aGZ
+nKh
+aBO
dfD
-aTN
-aVe
-apc
+aTK
+rWa
+aJu
aYu
aZN
bbD
@@ -120760,23 +119901,23 @@ axY
axY
ayW
bTq
+dgA
+aBO
aBO
-aCX
-dej
aFC
-deC
-deC
-dlI
+axY
+qJG
+aJu
aKH
aMk
aNu
-dlI
+axY
dfp
-dfp
-dfE
+aBO
+dgA
dfP
dfY
-dgc
+axY
aYu
cXA
cXA
@@ -121014,30 +120155,30 @@ ath
ajb
avA
axY
-axZ
+axY
ayX
-ddS
-bUw
-aCY
-dek
+axY
+axY
+aBO
+aBO
der
-deD
-dlI
-aJv
+axY
+qJG
+aJu
aKI
tDM
-dfb
-dfj
+dBy
+axY
dlI
-deD
-dfF
-aTN
-aVe
-aWH
-dgi
+aBO
+axY
+axY
+ayX
+axY
+atm
dgc
-aqq
-aqr
+alq
+apc
aWu
bif
bif
@@ -121271,29 +120412,29 @@ ati
ajb
avB
axY
-ddO
+jYQ
bUw
-ddT
-ddZ
-ded
-del
-des
+aJu
+axY
+axY
+axY
+axY
djt
-daY
+qJG
daZ
dbb
-aMk
-aNv
-dfk
-dfq
+rVX
+dBy
djt
-dfG
-dfQ
-dfZ
-apc
-apc
-dgo
-apc
+axY
+axY
+axY
+aJu
+bUw
+iYY
+axY
+alq
+alq
cXZ
atm
bfZ
@@ -121528,31 +120669,31 @@ ajb
ajb
avC
axY
-aya
-bUw
-ddU
-aBQ
-dee
+axY
+eEu
+axY
+axY
+ddO
aEr
-des
+ddO
djt
-daY
-daZ
-dbb
+qJG
+aJu
+rEi
dfa
aNv
-dfk
-daY
+djt
+ddO
djx
-dfG
-cXz
-aVe
-atm
-alr
-dgp
+axY
+axY
+nwU
+axY
+axY
+alq
cXI
cYj
-atm
+iOa
bga
big
bga
@@ -121571,7 +120712,7 @@ bFS
bHy
bIV
bKC
-bMi
+bAQ
bNU
bMg
bQV
@@ -121785,31 +120926,31 @@ dps
dpL
avD
axY
+axY
+xNI
+ddO
+ddO
+ddO
+ddO
ddO
-bUw
-ddV
-aBQ
-dee
-aEr
-aKL
djt
-daY
-deS
-dbb
-aMk
-aNv
-dfm
-daY
djt
-dbg
-dfR
+djt
+aRm
+djt
+djt
+djt
+ddO
+ddO
+ddO
+ddO
dga
dgd
dgj
-dgp
-alr
-atm
atm
+alq
+jFx
+iOa
bgb
cTu
bgb
@@ -121828,8 +120969,8 @@ bFT
bHz
bIW
bKD
-dhe
-dhg
+bCi
+bCi
bPu
bPu
bPu
@@ -122044,28 +121185,28 @@ avE
axY
ayc
aza
-aAw
-bUw
+ddO
+aaa
aCY
dem
-aFD
+dem
+deD
+deD
deD
-dlI
-dlI
deV
-dlN
-dfc
-dlI
-dlI
-deD
+dem
+dem
+dem
+dem
+dem
dfI
-dfS
-aVh
-aaf
+aaa
+ddO
+ddO
aYx
-dgr
-dgw
-dgA
+sSU
+lHL
+lMJ
dgI
bgb
cTi
@@ -122086,7 +121227,7 @@ bHy
bIX
bKE
bKE
-dhh
+bKE
bPv
bKE
bKE
@@ -122296,34 +121437,34 @@ apn
aqy
arT
apm
-dnS
+vAk
avB
axY
-axY
-bTq
+goZ
+ddO
aAx
-aBO
+sOW
aIe
aOS
-deu
-deI
-deN
-deI
-deW
-aMm
-dfd
-deN
-dft
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
dBB
-dbh
-dfT
-aVh
-aaa
+aIe
+sOW
+cWu
+ddO
aYx
-dgf
-dgj
-ack
-dgJ
+sSU
+lMJ
+lMJ
+lHL
bgb
bij
bgb
@@ -122343,7 +121484,7 @@ bHA
bIY
bKF
bMk
-dhi
+bNV
bPw
bQW
bSj
@@ -122556,31 +121697,31 @@ atk
aux
avF
dqT
-dqT
-aaf
-ack
-dea
-aIc
-den
+esV
+xqB
+aAx
+aaa
+aIe
+dZD
+dev
+aav
+aav
+dev
+lMJ
+aaa
+aav
+aav
dev
-deJ
-deO
-deU
-deX
-dBx
-dfe
-dBz
-dfu
dfz
-dfJ
-dfU
-dga
+aIe
+aaa
+cWu
dge
azd
-azd
-azd
-dgB
-dgK
+sSU
+lMJ
+lMJ
+lHL
aaa
cUL
aaa
@@ -122600,7 +121741,7 @@ bHB
bIZ
bKG
bMl
-dhj
+bKG
bIZ
bKG
bMl
@@ -122813,31 +121954,31 @@ atl
auy
dnS
dqT
-dqT
-aaf
-ack
-ack
+fGs
+ddO
+aAx
+sOW
def
aCZ
-dew
-aCZ
-axY
-axY
-aCZ
-aCZ
-aCZ
-axY
-axY
-aCZ
-dew
-aCZ
-aVe
-dgf
-dgk
-dgt
-dgk
-dgv
-dgJ
+aav
+aav
+aav
+vLD
+aaf
+aaa
+aav
+aav
+aav
+xfK
+obN
+sOW
+cWu
+ddO
+dgg
+sSU
+lMJ
+lHL
+lHL
anT
aaf
aaf
@@ -122857,7 +121998,7 @@ bza
bJa
bza
bFX
-dhk
+bza
bJa
bza
bFX
@@ -123069,52 +122210,52 @@ apm
apm
dnh
dnS
-dnz
dqT
+xWZ
+dPf
+aAx
+aaa
+aIe
+dZD
+aav
+aav
+aaa
+aaa
aaf
-aaf
-aaf
-def
-ddZ
-dex
-aJu
-ddZ
-ddZ
-ddZ
-aMo
-dff
-ddZ
-ddZ
-aJu
-dex
-ddZ
-aVe
+aaa
+aaa
+aav
+aav
+dfz
+aIe
+aaa
+cWu
aWK
dgk
-dgt
-dgk
-dgB
-dgM
-dgN
-dgO
-dgO
-dgw
-dgO
-dgS
-dgO
-dgO
-dgw
-dgw
-dgw
-dgw
+sSU
+lMJ
+lHL
+lHL
+anT
+dew
+dew
+aaf
+dew
+bpw
+dew
+dew
+aaf
+aaf
+aaf
+aaf
bCz
-dgw
-dha
-dgw
-dhc
-dgw
-dha
-dhl
+aaf
+bFY
+aaf
+bJb
+aaf
+bFY
+aaf
bJb
aaf
bFY
@@ -123327,31 +122468,31 @@ dnh
auz
dqp
dqT
-dqT
+axY
+fGs
+aAx
+vmz
+def
+aCZ
aaa
aaa
aaa
-bTq
-dep
-dey
-aHa
ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-dfA
-dfM
-dfV
-dgb
+cDu
+fWO
+aaa
+vLD
+dev
+xfK
+obN
+vmz
+cWu
dgg
-azd
-azd
-azd
-dgv
-aaf
+axY
+sSU
+lMJ
+lHL
+lHL
anT
aaa
aaa
@@ -123584,30 +122725,30 @@ dni
auA
dnS
dqT
-aaa
-aaa
-aaa
-aaa
axY
-deq
-dey
-deK
-ddZ
-ddZ
-ddZ
+fGs
+ddO
+sOW
+aIe
+dZD
+lMJ
+aaf
+aaf
+den
+nte
aMo
-ddZ
-ddZ
-ddZ
-dfB
-dfM
-dfW
+aaf
+aaf
+lMJ
+dfz
+aIe
+sOW
+ddO
+dgg
axY
-aWK
-dgk
-dgt
-dgk
-dgB
+sSU
+lMJ
+lHL
aaa
anT
aaa
@@ -123841,31 +122982,31 @@ dnh
auB
avG
dqT
-aaa
-aaa
-aaa
-aaa
axY
-aJu
-deA
-deL
-aJu
-aJu
+fGs
+aAx
+vmz
+def
+aCZ
+dev
+vLD
+aaa
+fjy
deY
+moI
+aaa
+aaa
+aaa
+xfK
+obN
+vmz
+cWu
+dgg
axY
-dfg
-aJu
-aJu
-dfC
-dfO
-ddZ
-axY
-dgh
-dgk
-dgk
-dgk
-dgv
-aaf
+sSU
+lMJ
+lHL
+lHL
anT
aaa
aaa
@@ -124098,30 +123239,30 @@ dnh
dnh
jKK
dqT
+ocj
+rTo
+aAx
+aaa
+aIe
+dZD
+aav
+aav
+aaa
+aaa
aaf
aaa
aaa
+aav
+aav
+dfz
+aIe
aaa
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-aWK
+cWu
+jjF
dgm
-dgu
-dgm
-dgB
+sSU
+lMJ
+lHL
aaa
anT
aaa
@@ -124355,31 +123496,31 @@ atn
bOY
avG
dqT
-aaf
-aaa
-aaa
+fGs
+ddO
+aAx
+sOW
+dtL
+aCZ
+aav
+aav
aaa
aaa
aaf
+vLD
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaf
-ack
-ack
-aye
-dgv
-aye
-dgv
-aaf
+aav
+aav
+xfK
+xLP
+sOW
+pWF
+ddO
+dgg
+sSU
+lMJ
+lHL
+lHL
anT
aaf
aaf
@@ -124612,29 +123753,29 @@ dnh
dnh
lNZ
dqT
-aaf
+drT
+xqB
+aAx
+aaa
+vmz
+dZD
+dev
+aav
aaa
aaa
+lMJ
+dev
+aav
+aav
+dev
+dfz
+vmz
aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaa
-aaa
-aaf
-aaf
-aaf
-aaa
-aaa
-aaf
+cWu
+dge
+vSl
+sSU
+lMJ
aaa
aaa
aaf
@@ -124869,29 +124010,29 @@ aaa
aaf
ack
dqT
-aaf
-anT
-anT
-anT
-anT
-aaf
-anT
-anT
-anT
-anT
-anT
-anT
-aqB
-anT
-anT
-anT
-anT
-anT
-anT
-aaf
-aaa
-aaa
-aaf
+axY
+axY
+ddO
+hWU
+hWU
+gKb
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+yeY
+hWU
+hWU
+ddO
+axY
+axY
+sSU
+lMJ
aaa
aaa
aaf
@@ -125126,29 +124267,29 @@ aaf
aaf
ack
aaf
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+sSU
+lMJ
aaa
aaa
aaa
@@ -125382,30 +124523,30 @@ aaa
aaa
aaa
aaa
+vLD
aaa
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+eln
+tMT
aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-anT
-anT
-anT
-anT
-aqB
-anT
-anT
-anT
-anT
-aqB
-aaf
-aaf
-aaf
-aaf
-aaa
-aaf
-aaf
+lHL
+lMJ
aaa
aaa
aaa
@@ -125639,7 +124780,7 @@ aaa
aaa
aaa
aaa
-aaa
+vLD
aaa
aaa
aaa
@@ -125896,26 +125037,26 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
aaf
aai
aaa
diff --git a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm
index 88e19bad50..ccef5665e1 100644
--- a/_maps/cit_map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/cit_map_files/OmegaStation/OmegaStation.dmm
@@ -2574,7 +2574,7 @@
c_tag = "AI Vault - Port";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/obj/effect/turf_decal/stripes/line{
@@ -3515,7 +3515,7 @@
c_tag = "AI Vault - Starboard";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/obj/effect/turf_decal/stripes/line{
@@ -4081,8 +4081,7 @@
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/camera{
- c_tag = "Armoury - Internal";
- network = list("Labor")
+ c_tag = "Armoury - Internal"
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -4542,8 +4541,7 @@
dir = 8
},
/obj/machinery/camera{
- c_tag = "Security - Cell 1";
- network = list("MINE")
+ c_tag = "Security - Cell 1"
},
/turf/open/floor/plasteel/red/side{
dir = 5
@@ -4569,8 +4567,7 @@
},
/obj/machinery/camera{
c_tag = "Fore Primary Hallway";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/red/corner{
dir = 1
@@ -5967,8 +5964,7 @@
/obj/item/stamp,
/obj/machinery/camera{
c_tag = "Cargo Bay Entrance";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/brown{
dir = 8
@@ -6147,8 +6143,7 @@
dir = 8
},
/obj/machinery/camera{
- c_tag = "Security - Cell 2";
- network = list("MINE")
+ c_tag = "Security - Cell 2"
},
/turf/open/floor/plasteel/red/side{
dir = 5
@@ -6521,8 +6516,7 @@
},
/obj/machinery/camera{
c_tag = "Security - Office";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/red/corner{
dir = 1
@@ -6547,8 +6541,7 @@
"amK" = (
/obj/machinery/camera{
c_tag = "Security - Central";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/neutral/side{
dir = 8
@@ -6629,8 +6622,7 @@
"amS" = (
/obj/machinery/camera{
c_tag = "Locker Room Toilets";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/freezer,
/area/hallway/primary/central)
@@ -8505,8 +8497,7 @@
/obj/item/shovel,
/obj/machinery/camera{
c_tag = "Mining Dock";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -9015,7 +9006,6 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics Tank 4";
- network = list("thunder");
pixel_x = 10
},
/turf/open/floor/plasteel/green/side{
@@ -9418,8 +9408,7 @@
},
/obj/machinery/camera{
c_tag = "Central Diner 3";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/vault/side{
dir = 4
@@ -10058,8 +10047,7 @@
"atz" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank 1";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -10454,8 +10442,7 @@
},
/obj/machinery/camera{
c_tag = "Bar";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -10473,8 +10460,7 @@
},
/obj/machinery/camera{
c_tag = "Bar Backroom";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/vault,
/area/crew_quarters/bar/atrium)
@@ -11736,8 +11722,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics East";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/caution{
dir = 4
@@ -11956,8 +11941,7 @@
"axj" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank 2";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -12059,8 +12043,7 @@
/obj/machinery/portable_atmospherics/canister/nitrogen,
/obj/machinery/camera{
c_tag = "Atmospherics Monitoring";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -12634,8 +12617,7 @@
},
/obj/machinery/camera{
c_tag = "Central Diner 2";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/vault/side{
dir = 4
@@ -13466,8 +13448,7 @@
/obj/structure/bedsheetbin,
/obj/machinery/camera{
c_tag = "Locker Room East";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/arrival{
@@ -14488,8 +14469,7 @@
},
/obj/machinery/camera{
c_tag = "Central Hallway East";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/neutral/corner{
dir = 1
@@ -15091,8 +15071,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering Secure Storage";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault/side{
@@ -15337,8 +15316,7 @@
},
/obj/machinery/camera{
c_tag = "Locker Room South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault{
@@ -15695,8 +15673,7 @@
},
/obj/machinery/camera{
c_tag = "SMES Access";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -15739,8 +15716,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering Access";
- dir = 8;
- network = list("Labor")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -15877,8 +15853,7 @@
},
/obj/machinery/camera{
c_tag = "Central Diner 1";
- dir = 4;
- network = list("MINE")
+ dir = 4
},
/turf/open/floor/plasteel/redyellow,
/area/crew_quarters/bar/atrium)
@@ -16458,8 +16433,7 @@
"aHg" = (
/obj/machinery/camera{
c_tag = "Gravity Generator Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/bot_white/left,
/turf/open/floor/plasteel/vault{
@@ -16559,7 +16533,7 @@
/obj/machinery/camera{
c_tag = "Engineering Fore";
dir = 2;
- network = list("SS13","Engine");
+ network = list("ss13","engine");
pixel_x = 23
},
/turf/open/floor/engine,
@@ -17184,8 +17158,7 @@
},
/obj/machinery/camera{
c_tag = "Engineering Monitoring";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -18010,7 +17983,7 @@
/obj/machinery/camera{
c_tag = "Kitchen Coldroom";
dir = 4;
- network = list("MINE")
+ network = list("mine")
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/kitchen)
@@ -19145,7 +19118,7 @@
/obj/machinery/camera{
c_tag = "Engineering Port";
dir = 4;
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -19171,7 +19144,7 @@
/obj/machinery/camera{
c_tag = "Supermatter Chamber";
dir = 2;
- network = list("Engine");
+ network = list("engine");
pixel_x = 23
},
/obj/structure/cable{
@@ -19285,7 +19258,7 @@
desc = "Used for watching the Engine.";
dir = 1;
name = "Engine Monitor";
- network = list("Engine");
+ network = list("engine");
pixel_y = -32
},
/obj/machinery/rnd/protolathe/department/engineering,
@@ -19335,8 +19308,7 @@
},
/obj/machinery/camera{
c_tag = "Atmospherics South West";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/neutral/corner{
dir = 8;
@@ -19468,8 +19440,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Hydroponics South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault/side{
@@ -20153,8 +20124,7 @@
icon_state = "4-8"
},
/obj/machinery/camera{
- c_tag = "Aft Primary Hallway 4";
- network = list("SS13","Prison")
+ c_tag = "Aft Primary Hallway 4"
},
/turf/open/floor/plasteel/green/corner{
dir = 1
@@ -20262,8 +20232,7 @@
icon_state = "4-8"
},
/obj/machinery/camera{
- c_tag = "Aft Primary Hallway 3";
- network = list("SS13","Prison")
+ c_tag = "Aft Primary Hallway 3"
},
/turf/open/floor/plasteel/green/corner{
dir = 1
@@ -21100,7 +21069,7 @@
/obj/machinery/camera{
c_tag = "Engineering Aft";
dir = 2;
- network = list("SS13","Engine");
+ network = list("ss13","engine");
pixel_x = 23
},
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -21257,8 +21226,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Aft Primary Hallway 2";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/yellow/corner{
dir = 8
@@ -21535,8 +21503,7 @@
},
/obj/machinery/camera{
c_tag = "Library 2";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/dark,
/area/library)
@@ -21685,8 +21652,7 @@
},
/obj/machinery/camera{
c_tag = "Chemistry";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/whiteyellow/corner{
dir = 1
@@ -22567,8 +22533,7 @@
"aUo" = (
/obj/machinery/camera{
c_tag = "Genetics Cloning";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/whiteblue/corner{
dir = 1
@@ -23136,7 +23101,7 @@
/obj/machinery/camera{
c_tag = "Server Room";
dir = 2;
- network = list("SS13","RD");
+ network = list("ss13","rd");
pixel_x = 22
},
/turf/open/floor/circuit/green/telecomms/mainframe,
@@ -23645,8 +23610,7 @@
/obj/structure/closet/crate/bin,
/obj/machinery/camera{
c_tag = "Medbay Morgue";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/vault/side{
dir = 8
@@ -23914,8 +23878,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay West";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -24230,8 +24193,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay Storage";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/delivery,
/obj/structure/window/reinforced{
@@ -24495,8 +24457,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Research Division South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/whitepurple/corner,
/area/science/research)
@@ -25331,7 +25292,7 @@
/obj/machinery/camera{
c_tag = "Robotics Lab";
dir = 2;
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault/side,
@@ -25637,8 +25598,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay Foyer";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/neutral,
/area/hallway/primary/central)
@@ -26708,8 +26668,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay South";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/whiteblue/corner{
dir = 8
@@ -27226,8 +27185,7 @@
},
/obj/machinery/camera{
c_tag = "Medbay Recovery Room";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/vault/side{
dir = 8
@@ -28451,7 +28409,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Test Chamber";
dir = 2;
- network = list("Xeno","RD")
+ network = list("xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 4
@@ -28546,7 +28504,7 @@
/obj/machinery/camera{
c_tag = "Crematorium";
dir = 4;
- network = list("MINE")
+ network = list("mine")
},
/turf/open/floor/plasteel/vault/side{
dir = 4
@@ -29231,8 +29189,7 @@
},
/obj/machinery/camera{
c_tag = "Chaplain's Quarters";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/plasteel/vault{
dir = 8
@@ -29278,8 +29235,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/camera{
c_tag = "Chapel Office";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/turf/open/floor/wood,
/area/chapel/main)
@@ -29714,8 +29670,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel South";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -29737,8 +29692,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
c_tag = "Arrivals Hallway 3";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -29825,7 +29779,7 @@
c_tag = "Science - Server Room";
dir = 8;
name = "science camera";
- network = list("SS13","RD")
+ network = list("ss13","rd")
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/science/xenobiology)
@@ -30413,8 +30367,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/camera{
c_tag = "Port Primary Hallway";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -30431,8 +30384,7 @@
},
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway 2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/turf/open/floor/plasteel/neutral/corner,
/area/hallway/primary/central)
@@ -30440,8 +30392,7 @@
/obj/structure/closet/firecloset,
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway 2";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault/side{
@@ -30464,8 +30415,7 @@
"blk" = (
/obj/machinery/camera{
c_tag = "Atmospherics Tank 3";
- dir = 4;
- network = list("SS13")
+ dir = 4
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -30478,12 +30428,11 @@
/obj/machinery/camera{
c_tag = "Shuttle Docking Foyer";
dir = 8;
- network = list("MINE")
+ network = list("mine")
},
/obj/machinery/camera{
c_tag = "Escape Arm Airlocks";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -30492,8 +30441,7 @@
/obj/structure/closet/emcloset,
/obj/machinery/camera{
c_tag = "Starboard Primary Hallway";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel/vault/side{
@@ -30507,7 +30455,7 @@
/obj/machinery/camera{
c_tag = "Engineering Starboard";
dir = 8;
- network = list("SS13","Engine")
+ network = list("ss13","engine")
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -30523,8 +30471,7 @@
},
/obj/machinery/camera{
c_tag = "Research Division Access";
- dir = 2;
- network = list("SS13")
+ dir = 2
},
/obj/structure/cable/white{
icon_state = "2-8"
@@ -30538,7 +30485,6 @@
/obj/machinery/camera{
c_tag = "Aft Primary Hallway 1";
dir = 8;
- network = list("SS13");
pixel_y = -22
},
/turf/open/floor/plasteel/purple/corner,
@@ -30583,7 +30529,6 @@
/obj/machinery/camera{
c_tag = "Surgery Operating";
dir = 1;
- network = list("SS13");
pixel_x = 22
},
/turf/open/floor/plasteel/neutral,
@@ -30592,7 +30537,7 @@
/obj/machinery/camera{
c_tag = "Xenobiology Test Chamber";
dir = 2;
- network = list("Xeno","RD")
+ network = list("xeno","rd")
},
/turf/open/floor/plasteel/vault{
dir = 5
@@ -30615,8 +30560,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
c_tag = "Arrivals Hallway";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -30627,8 +30571,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/camera{
c_tag = "Arrivals Hallway 2";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -30685,8 +30628,7 @@
},
/obj/machinery/camera{
c_tag = "Chapel Mass Driver";
- dir = 8;
- network = list("SS13")
+ dir = 8
},
/obj/machinery/light/small,
/obj/machinery/button/massdriver{
@@ -31264,8 +31206,7 @@
"buU" = (
/obj/machinery/camera{
c_tag = "Communications Relay";
- dir = 8;
- network = list("MINE")
+ dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -33064,7 +33005,7 @@
c_tag = "AI Chamber - Core";
dir = 2;
name = "core camera";
- network = list("RD")
+ network = list("rd")
},
/obj/machinery/cell_charger,
/turf/open/floor/plasteel/vault/side,
@@ -33247,7 +33188,7 @@
c_tag = "AI Chamber - Core";
dir = 2;
name = "core camera";
- network = list("RD")
+ network = list("rd")
},
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -33384,7 +33325,7 @@
c_tag = "AI Chamber - Core";
dir = 2;
name = "core camera";
- network = list("RD")
+ network = list("rd")
},
/obj/machinery/light{
dir = 1
@@ -33617,7 +33558,7 @@
c_tag = "AI Satellite - Access";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault/side{
@@ -33905,7 +33846,7 @@
c_tag = "AI Satellite - Maintenance";
dir = 8;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/obj/machinery/atmospherics/components/unary/vent_pump/on{
@@ -33977,7 +33918,7 @@
c_tag = "AI Satellite - Antechamber";
dir = 4;
name = "ai camera";
- network = list("Sat");
+ network = list("minisat");
start_active = 1
},
/turf/open/floor/plasteel/vault/side{
diff --git a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm
index 592a3d6b26..6bf52ab60a 100644
--- a/_maps/cit_map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/cit_map_files/PubbyStation/PubbyStation.dmm
@@ -8933,16 +8933,6 @@
dir = 4
},
/area/bridge)
-"axf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridgespace";
- name = "bridge external shutters"
- },
-/turf/open/floor/plasteel/vault{
- dir = 8
- },
-/area/bridge)
"axg" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/dark,
@@ -15026,6 +15016,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMq" = (
@@ -15033,6 +15026,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMr" = (
@@ -15040,6 +15036,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMs" = (
@@ -15049,6 +15048,9 @@
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMt" = (
@@ -15063,6 +15065,9 @@
c_tag = "Cargo Warehouse";
dir = 2
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMu" = (
@@ -15070,6 +15075,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMv" = (
@@ -15083,6 +15091,9 @@
pixel_x = 26
},
/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMw" = (
@@ -15649,6 +15660,9 @@
/obj/structure/sign/poster/official/random{
pixel_x = -32
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aNO" = (
@@ -16155,6 +16169,9 @@
"aOY" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aOZ" = (
@@ -16542,6 +16559,9 @@
req_access_txt = "31"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aQd" = (
@@ -17040,6 +17060,14 @@
/area/quartermaster/sorting)
"aRl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/power/apc/highcap/fifteen_k{
+ dir = 4;
+ name = "Delivery Office APC";
+ pixel_x = 28
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"aRm" = (
@@ -17057,6 +17085,9 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/delivery,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aRo" = (
@@ -17434,6 +17465,9 @@
"aSh" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/quartermaster/sorting)
"aSi" = (
@@ -17447,6 +17481,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aSj" = (
@@ -17825,6 +17862,9 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/office)
"aTi" = (
@@ -17839,6 +17879,9 @@
departmentType = 2;
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aTj" = (
@@ -17851,6 +17894,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aTl" = (
@@ -22032,8 +22078,7 @@
},
/area/maintenance/department/cargo)
"bdA" = (
-/obj/item/cigbutt,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/droneDispenser,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"bdB" = (
@@ -26568,12 +26613,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"bpp" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"bpq" = (
/obj/structure/sign/warning/electricshock,
/turf/closed/wall/r_wall,
@@ -27772,9 +27811,6 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"brQ" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/machinery/camera{
c_tag = "Xenobiology Port";
dir = 8;
@@ -28377,7 +28413,7 @@
/turf/open/floor/plasteel/white,
/area/science/explab)
"btj" = (
-/obj/machinery/droneDispenser,
+/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/science/explab)
"btk" = (
@@ -28566,11 +28602,11 @@
/turf/open/floor/plating,
/area/science/xenobiology)
"btD" = (
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"btE" = (
/obj/effect/decal/remains/xeno,
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"btF" = (
/obj/structure/chair{
@@ -29191,12 +29227,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/camera{
- c_tag = "Xenobiology Kill Room";
- dir = 8;
- network = list("ss13","rd")
- },
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"bva" = (
/turf/closed/wall,
@@ -31263,16 +31294,22 @@
/turf/open/floor/plasteel/whitepurple/side,
/area/science/xenobiology)
"bzi" = (
-/obj/item/extinguisher{
- pixel_x = 4;
- pixel_y = 3
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/item/extinguisher,
/obj/structure/table/glass,
-/turf/open/floor/plasteel/whitepurple/side,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
/area/science/xenobiology)
"bzj" = (
-/obj/structure/reagent_dispensers/watertank,
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
@@ -31280,6 +31317,7 @@
pixel_x = 32;
receive_ore_updates = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel/whitepurple/side,
/area/science/xenobiology)
"bzk" = (
@@ -32314,6 +32352,9 @@
/area/crew_quarters/heads/hor)
"bBw" = (
/obj/machinery/computer/security,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/red/side{
dir = 8
},
@@ -38116,6 +38157,7 @@
},
/obj/item/stack/sheet/glass,
/obj/item/stack/rods/fifty,
+/obj/item/pipe_dispenser,
/turf/open/floor/plasteel/yellow/side,
/area/engine/atmos)
"bOY" = (
@@ -40924,9 +40966,6 @@
/obj/structure/table/reinforced,
/obj/item/clipboard,
/obj/item/lighter,
-/obj/item/clothing/glasses/meson{
- pixel_y = 4
- },
/obj/item/stamp/ce,
/obj/item/stock_parts/cell/high/plus,
/obj/machinery/keycard_auth{
@@ -40941,6 +40980,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel/yellow/side{
dir = 4
},
@@ -42858,10 +42898,7 @@
},
/obj/effect/turf_decal/stripes/line,
/obj/item/airlock_painter,
-/obj/item/clothing/glasses/meson{
- pixel_x = 3;
- pixel_y = -4
- },
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cap" = (
@@ -43196,11 +43233,11 @@
"cbe" = (
/obj/item/pen,
/obj/item/storage/belt/utility,
-/obj/item/clothing/glasses/meson,
/obj/item/paper_bin{
layer = 2.9
},
/obj/structure/table/glass,
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cbf" = (
@@ -43287,7 +43324,7 @@
/obj/structure/table,
/obj/item/clothing/gloves/color/yellow,
/obj/item/storage/belt/utility,
-/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cbo" = (
@@ -43736,6 +43773,9 @@
/obj/item/stack/sheet/mineral/plasma{
amount = 30
},
+/obj/item/device/gps{
+ gpstag = "ENG0"
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"ccS" = (
@@ -45137,9 +45177,6 @@
icon_state = "0-8"
},
/obj/machinery/power/tesla_coil,
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"chz" = (
@@ -45147,9 +45184,6 @@
icon_state = "0-4"
},
/obj/machinery/power/tesla_coil,
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"chA" = (
@@ -45257,16 +45291,6 @@
/obj/structure/grille,
/turf/open/floor/plating/airless,
/area/engine/engineering)
-"chQ" = (
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
"chR" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -45420,14 +45444,13 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"cit" = (
-/obj/machinery/the_singularitygen,
+/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ciu" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"civ" = (
@@ -49969,29 +49992,9 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"cBQ" = (
-/obj/machinery/power/rad_collector/anchored,
+/obj/machinery/power/rad_collector,
/turf/open/floor/plating,
/area/engine/engineering)
-"cBR" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/item/tank/internals/plasma,
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cBS" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
"cBT" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating/airless,
@@ -50152,6 +50155,16 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
+"frt" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/office)
"fyh" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -50240,12 +50253,24 @@
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAP)
+"kqj" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
"krG" = (
/obj/structure/cable{
icon_state = "2-8"
},
/turf/open/floor/plasteel/dark,
/area/library)
+"let" = (
+/turf/closed/wall/r_wall,
+/area/space)
"lqy" = (
/obj/machinery/door/airlock/centcom{
name = "Library"
@@ -50255,6 +50280,11 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
+"lvl" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"mHo" = (
/obj/structure/table,
/obj/machinery/microwave{
@@ -50286,6 +50316,15 @@
},
/turf/open/floor/carpet,
/area/library/lounge)
+"nJY" = (
+/obj/structure/rack,
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"opC" = (
/obj/machinery/light/small{
dir = 4
@@ -50445,6 +50484,10 @@
/obj/item/stack/cable_coil,
/turf/open/floor/plasteel/whitepurple/side,
/area/science/lab)
+"yia" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
(1,1,1) = {"
aaa
@@ -79160,8 +79203,8 @@ bXk
bXk
bXk
bXk
-aaa
-aaa
+bXk
+let
aaa
aaa
aaa
@@ -79416,9 +79459,9 @@ chR
cgt
cjT
ckq
+ckq
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -79673,9 +79716,9 @@ chS
cfV
cgS
cfV
+cfV
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -79929,10 +79972,10 @@ cfV
cfV
cfV
cgT
+cfV
ckr
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -80179,17 +80222,17 @@ cfU
cgu
cgU
chw
-cBR
-chw
-chw
+cgU
chw
+cgU
chw
+cgU
cjs
cfV
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80436,17 +80479,17 @@ cfV
cgv
cfV
chx
-chQ
+cfV
chx
-chQ
+cfV
chx
-chQ
+cfV
chx
cfV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80694,16 +80737,16 @@ cgv
cgV
bBW
bBW
-aaa
cgV
+aht
aaa
bBW
bBW
cgV
cfV
-bTE
-abI
-abI
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80951,16 +80994,16 @@ cgv
bBW
bBW
bBW
-aaa
+yia
abI
aaa
bBW
bBW
bBW
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81215,9 +81258,9 @@ aaa
bBW
bBW
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81469,12 +81512,12 @@ cii
cis
ciG
aaa
-aaa
-aaa
+yia
+cgV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81719,7 +81762,7 @@ cfd
cfw
cfW
cgw
-cgV
+aht
abI
abI
cij
@@ -81727,11 +81770,11 @@ cit
ciH
abI
abI
-cgV
+aht
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81976,8 +82019,8 @@ cfe
cfx
cfa
cgv
-aaa
-aaa
+cgV
+yia
aaa
cik
ciu
@@ -81986,9 +82029,9 @@ aaa
aaa
aaa
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82243,9 +82286,9 @@ aaa
bBW
bBW
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82495,14 +82538,14 @@ bBW
aaa
aaa
abI
-aaa
+yia
aaa
bBW
bBW
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82751,15 +82794,15 @@ cgV
bBW
aaa
aaa
+aht
cgV
-aaa
bBW
bBW
cgV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -83006,17 +83049,17 @@ cfV
cgv
cfV
chz
-cBS
+cfV
chz
-cBS
+cfV
chz
-cBS
+cfV
chz
cfV
cfV
-bTE
-abI
-abI
+cfV
+bXk
+let
abI
abI
aaa
@@ -83174,7 +83217,7 @@ auU
atY
vTA
ayf
-axf
+vTA
aAF
aBz
aCP
@@ -83263,17 +83306,17 @@ cfU
cgx
cgU
chA
+cgU
chA
+cgU
chA
-chA
-chA
-chA
+cgU
cjt
cfV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
abI
aaa
aaa
@@ -83527,10 +83570,10 @@ cfV
cfV
cfV
cgY
+cfV
cks
bXk
-abI
-aaa
+let
aaa
aaa
aaa
@@ -83785,9 +83828,9 @@ chO
cfV
cgZ
cfV
+cfV
bXk
-abI
-abI
+let
abI
aaa
aaa
@@ -84042,9 +84085,9 @@ chP
cgt
cjU
ckq
+ckq
bXk
-abI
-aaa
+let
aaa
aaa
aaa
@@ -84299,9 +84342,9 @@ bXk
bXk
bXk
bXk
+bXk
ckJ
-abI
-aaa
+let
aaa
aaa
aaa
@@ -87058,7 +87101,7 @@ aVu
bat
aLf
bcy
-aKq
+lvl
aEj
aEj
bgC
@@ -87572,7 +87615,7 @@ aPY
bav
aLf
aFi
-aFi
+nJY
beI
bfv
bgE
@@ -89361,7 +89404,7 @@ aOW
xzr
xzr
xzr
-aSY
+frt
aUs
aLf
aLf
@@ -89875,7 +89918,7 @@ cDa
cDa
cDa
aLg
-aTj
+kqj
aUu
aVx
aVx
@@ -93238,7 +93281,7 @@ bkE
aht
bnd
boh
-bpp
+bpn
bqx
brQ
btr
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 7507cf7ce5..fd936f5205 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -243,7 +243,7 @@
/obj/structure/lattice,
/obj/structure/grille,
/turf/open/space,
-/area/space/nearstation)
+/area/space)
"aaU" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plasteel/floorgrime,
@@ -932,7 +932,6 @@
pixel_x = 3;
pixel_y = -3
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/turf_decal/bot{
dir = 2
},
@@ -2439,10 +2438,6 @@
},
/turf/open/floor/plating,
/area/security/main)
-"agd" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"agf" = (
/obj/structure/table,
/obj/item/stack/sheet/metal,
@@ -4577,15 +4572,13 @@
/area/engine/atmos)
"aln" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
name = "Labor Camp Shuttle Airlock";
- req_access_txt = "2";
- shuttledocked = 1
+ req_access_txt = "2"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/dark,
/area/security/processing)
"alp" = (
/turf/open/floor/plating,
@@ -5353,7 +5346,7 @@
/area/maintenance/fore/secondary)
"anE" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
req_access_txt = "13"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -5392,17 +5385,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port/fore)
-"anN" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
- name = "Labor Camp Shuttle Airlock";
- shuttledocked = 1
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/security/processing)
"anO" = (
/obj/docking_port/stationary{
dir = 8;
@@ -34461,13 +34443,6 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"bIP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/chair/comfy/black,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"bIQ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -37316,7 +37291,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/chair/comfy/black,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"bPz" = (
@@ -37343,15 +37317,13 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPA" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/table/glass,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPB" = (
@@ -37441,10 +37413,10 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPI" = (
-/obj/structure/reagent_dispensers/watertank,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bPJ" = (
@@ -38079,7 +38051,7 @@
dir = 8;
layer = 4;
name = "Engine Monitor";
- network = list("engine");
+ network = list("singularity");
pixel_x = 30
},
/turf/open/floor/plasteel/red/side{
@@ -38382,6 +38354,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bRZ" = (
@@ -40087,6 +40062,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bWn" = (
@@ -40339,9 +40317,6 @@
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bWV" = (
@@ -41561,6 +41536,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bZX" = (
@@ -42803,14 +42781,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"ccP" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"ccQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"ccR" = (
/obj/machinery/portable_atmospherics/pump,
/obj/effect/turf_decal/bot{
@@ -43716,20 +43686,6 @@
/obj/item/caution,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cfr" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 2;
- external_pressure_bound = 140;
- pressure_checks = 0;
- name = "killroom vent"
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology Kill Room";
- dir = 4;
- network = list("ss13","rd")
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cfs" = (
/obj/machinery/door/airlock/maintenance/abandoned{
name = "Air Supply Maintenance";
@@ -43767,15 +43723,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating/airless,
/area/maintenance/solars/port/aft)
-"cfy" = (
-/obj/structure/rack,
-/obj/item/clothing/shoes/winterboots,
-/obj/item/clothing/suit/hooded/wintercoat,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cfz" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -43827,16 +43774,6 @@
dir = 5
},
/area/crew_quarters/heads/chief)
-"cfI" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/yellow/side{
- dir = 4
- },
-/area/engine/engineering)
"cfJ" = (
/obj/machinery/light/small{
dir = 1
@@ -44021,9 +43958,6 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"cgi" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cgj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/barricade/wooden,
@@ -44032,18 +43966,19 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cgk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/biohazard,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cgl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 2;
- external_pressure_bound = 120;
- name = "killroom vent"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/open/floor/circuit/killroom,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/engine,
/area/science/xenobiology)
"cgm" = (
/obj/structure/cable{
@@ -44054,17 +43989,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cgn" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- target_temperature = 80;
- dir = 2;
- on = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cgo" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -44139,13 +44063,13 @@
/area/engine/engineering)
"cgw" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cgx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgy" = (
/obj/machinery/light/small{
@@ -44215,32 +44139,22 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cgI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
"cgJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cgL" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cgO" = (
/obj/structure/rack,
@@ -44254,16 +44168,6 @@
dir = 5
},
/area/crew_quarters/heads/chief)
-"cgQ" = (
-/obj/machinery/camera{
- c_tag = "Engineering East";
- dir = 8
- },
-/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/plasteel/yellow/corner{
- dir = 4
- },
-/area/engine/engineering)
"cgR" = (
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -44462,13 +44366,6 @@
},
/turf/open/floor/plasteel/floorgrime,
/area/maintenance/disposal/incinerator)
-"cho" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"chp" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -44478,43 +44375,22 @@
},
/turf/closed/wall,
/area/maintenance/starboard/aft)
-"chq" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"chr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Kill Chamber";
+"chs" = (
+/obj/machinery/door/window/northleft{
+ base_state = "right";
+ dir = 8;
+ icon_state = "right";
+ name = "Containment Pen";
req_access_txt = "55"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plating,
-/area/science/xenobiology)
-"chs" = (
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cht" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
},
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"chu" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
+/turf/open/floor/engine,
/area/science/xenobiology)
"chv" = (
/obj/structure/cable{
@@ -44624,25 +44500,24 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"chF" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/landmark/start/station_engineer,
+/obj/structure/chair/office/dark{
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chG" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chH" = (
/obj/structure/closet/firecloset,
@@ -44740,35 +44615,15 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"chV" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/tank/internals/emergency_oxygen/engi{
- pixel_x = 5
- },
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/glasses/meson/engine,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"chX" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/turf/open/floor/engine,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"chY" = (
/obj/machinery/shieldgen,
@@ -44852,24 +44707,6 @@
"cig" = (
/turf/closed/wall,
/area/engine/engineering)
-"cii" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/suit/radiation,
-/obj/item/clothing/head/radiation,
-/obj/item/clothing/glasses/meson,
-/obj/item/device/geiger_counter,
-/obj/item/device/geiger_counter,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cij" = (
/obj/machinery/modular_computer/console/preset/engineering,
/obj/structure/cable{
@@ -44907,15 +44744,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
-"cip" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"ciq" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
@@ -44925,13 +44753,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/heads/chief)
-"cir" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
"cis" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
@@ -45072,14 +44893,18 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"ciO" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/engineering_singularity_safety{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/item/book/manual/wiki/engineering_guide,
+/obj/item/book/manual/engineering_particle_accelerator{
+ pixel_x = -3;
+ pixel_y = -3
},
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"ciP" = (
/obj/structure/cable{
@@ -45221,12 +45046,6 @@
},
/turf/open/floor/plasteel/vault,
/area/crew_quarters/heads/chief)
-"cjh" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"cji" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -45361,18 +45180,6 @@
/obj/item/cigbutt/roach,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cjB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/structure/table,
-/obj/item/folder/white,
-/obj/item/pen,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/science/xenobiology)
"cjC" = (
/obj/structure/grille,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -45459,7 +45266,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 6
+ },
/area/engine/engineering)
"cjP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -45480,7 +45289,7 @@
req_access = null;
req_access_txt = "10;13"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/engineering)
"cjS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -45647,11 +45456,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/aft)
-"ckn" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cko" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
@@ -46730,16 +46534,11 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cnx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/structure/chair/sofa/left{
+ icon_state = "sofaend_left";
dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cny" = (
/obj/effect/landmark/start/station_engineer,
@@ -46973,15 +46772,12 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cnZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"coa" = (
@@ -46995,25 +46791,32 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cob" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"coc" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
+/obj/structure/table,
+/obj/item/electronics/airlock,
+/obj/item/electronics/airlock,
+/obj/item/electronics/apc,
+/obj/item/stock_parts/cell/high/plus,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/engine,
+/obj/item/stack/cable_coil,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cop" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
@@ -47182,38 +46985,27 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"coK" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"coL" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"coM" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
+/obj/structure/chair/office/dark,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"coL" = (
+/obj/structure/chair/office/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"coS" = (
/obj/structure/rack,
@@ -47379,50 +47171,37 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cpt" = (
-/obj/structure/table,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
+/area/engine/engineering)
+"cpu" = (
+/obj/item/book/manual/wiki/engineering_hacking{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/book/manual/wiki/engineering_construction,
/obj/item/clothing/gloves/color/yellow,
-/obj/item/storage/toolbox/electrical{
- pixel_y = 5
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/table/glass,
+/obj/item/device/flashlight,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cpx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/closet/radiation,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cpu" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cpv" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cpx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cpy" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
+/obj/structure/sign/warning/radiation/rad_area,
+/turf/closed/wall/r_wall,
/area/engine/engineering)
"cpA" = (
/obj/structure/chair/office/dark{
@@ -47437,19 +47216,17 @@
/turf/open/floor/plasteel,
/area/bridge)
"cpD" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/closet/secure_closet/engineering_welding,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cpE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cpG" = (
/obj/structure/table/optable,
@@ -47606,133 +47383,72 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cpZ" = (
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_y = 5
- },
-/obj/item/device/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/obj/item/device/flashlight{
- pixel_x = 1;
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"cqa" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cqb" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"cqc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+"cqb" = (
+/obj/structure/chair/sofa/right{
+ icon_state = "sofaend_right";
+ dir = 4
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cqd" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/structure/closet/radiation,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqe" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 6
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cqf" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"cqg" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Gas to Filter";
- on = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
- },
/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 1;
+ c_tag = "Engineering Center";
+ dir = 2;
network = list("ss13","engine");
pixel_x = 23
},
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
+/obj/machinery/light{
dir = 1
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqi" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqj" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_y = -24;
- req_access_txt = "10"
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cql" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
+"cqh" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cqm" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+"cqi" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cqj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"cqn" = (
/obj/structure/grille,
@@ -47828,54 +47544,39 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cqA" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access = null;
- req_access_txt = "10;13"
+"cqC" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cqD" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plating,
/area/engine/engineering)
-"cqB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cqE" = (
+/obj/structure/particle_accelerator/end_cap,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cqF" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
-"cqC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cqD" = (
-/obj/structure/sign/warning/radiation,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cqE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cqF" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"cqG" = (
/obj/structure/rack,
/obj/item/storage/box/rubbershot{
@@ -47963,70 +47664,49 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cqS" = (
-/obj/machinery/light/small{
- dir = 8
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
},
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plating,
/area/engine/engineering)
"cqT" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cqU" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = 25;
+ req_access_txt = "11"
},
-/obj/effect/turf_decal/bot,
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"cqY" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/engineering)
"cqZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cra" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Gas to Filter"
- },
-/obj/machinery/airalarm/engine{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"crb" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- icon_state = "pump_map";
- name = "Gas to Chamber"
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"crc" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
+/obj/structure/particle_accelerator/fuel_chamber,
+/turf/open/floor/plating,
/area/engine/engineering)
-"crd" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine Room";
- req_access_txt = "10"
+"cra" = (
+/obj/machinery/particle_accelerator/control_box,
+/obj/structure/cable/yellow,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crb" = (
+/obj/effect/landmark/start/station_engineer,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crc" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Starboard Fore";
+ dir = 2;
+ network = list("engine")
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"crh" = (
/obj/effect/turf_decal/stripes/line{
@@ -48089,40 +47769,38 @@
/turf/open/floor/plating,
/area/engine/engineering)
"crs" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = -7
},
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = -7
+ },
+/obj/item/crowbar,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"crt" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/structure/particle_accelerator/power_box,
+/turf/open/floor/plating,
+/area/engine/engineering)
"cru" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"crv" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/item/screwdriver,
+/turf/open/floor/plating,
+/area/engine/engineering)
"crw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
/area/engine/engineering)
"cry" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -48210,43 +47888,34 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/aft)
-"crH" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
"crI" = (
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"crJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"crK" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/turf/closed/wall/r_wall,
+/obj/structure/chair/stool,
+/turf/open/floor/plating,
/area/engine/engineering)
-"crL" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
+"crJ" = (
+/obj/machinery/light/small{
+ dir = 8;
+ light_color = "#fff4bc"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"crK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"crM" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#fff4bc"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/emcloset/anchored,
+/turf/open/floor/plating,
/area/engine/engineering)
"crP" = (
/obj/machinery/light,
@@ -48259,25 +47928,12 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
-"crT" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"crU" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
"crV" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"crW" = (
/obj/machinery/light/small{
@@ -48297,38 +47953,29 @@
/obj/structure/transit_tube,
/turf/open/floor/plating,
/area/engine/engineering)
-"crZ" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"csa" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csb" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csc" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/space,
/area/maintenance/aft)
"csd" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cse" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csg" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -48347,17 +47994,10 @@
},
/turf/open/space,
/area/space/nearstation)
-"csj" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"csk" = (
/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/closed/wall/r_wall,
+/area/science/xenobiology)
"csl" = (
/obj/structure/transit_tube/curved{
dir = 4
@@ -48414,26 +48054,22 @@
/turf/open/floor/plasteel/floorgrime,
/area/maintenance/disposal/incinerator)
"css" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
-"csu" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"csv" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csx" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"csy" = (
/obj/structure/table,
/obj/item/weldingtool,
@@ -48442,19 +48078,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"csA" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
"csD" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -48466,24 +48089,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/aft)
-"csH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"csI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"csM" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
@@ -48501,27 +48106,9 @@
/area/ai_monitored/turret_protected/aisat_interior)
"csP" = (
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 1
},
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"csR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"csT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -50258,7 +49845,7 @@
/area/shuttle/pod_1)
"cxG" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
name = "Escape Pod Three";
req_access_txt = "0"
},
@@ -50268,15 +49855,21 @@
/turf/open/floor/plating,
/area/security/main)
"cxJ" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 8;
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security/glass{
name = "Labor Camp Shuttle Airlock";
req_access_txt = "2"
},
+/obj/machinery/button/door{
+ id = "prison release";
+ name = "Labor Camp Shuttle Lockdown";
+ pixel_y = -25;
+ req_access_txt = "2"
+ },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/dark,
/area/security/processing)
"cxN" = (
/obj/structure/cable{
@@ -50292,16 +49885,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
-"cxP" = (
-/obj/machinery/door/airlock/external{
- cyclelinkeddir = 8;
- name = "Labor Camp Shuttle Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/security/processing)
"cxR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/spawner/structure/window/reinforced,
@@ -50551,18 +50134,14 @@
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat_interior)
-"czE" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"czF" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"czG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -50644,11 +50223,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
-"czQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"czR" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -50796,97 +50370,40 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cAl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cAm" = (
+/obj/item/wirecutters,
/obj/structure/cable/yellow{
- icon_state = "1-4"
+ icon_state = "2-8"
},
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cAo" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAm" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cAo" = (
-/obj/structure/cable{
+/obj/structure/cable/yellow{
icon_state = "1-4"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAp" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Cooling Loop to Gas";
- on = 1
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAq" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAr" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Gas to Mix";
- on = 0
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAs" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAt" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cAu" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 4;
- state = 2
- },
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cAy" = (
/obj/structure/closet/secure_closet/freezer/kitchen/maintenance,
@@ -51001,9 +50518,17 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"cAP" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = 25;
+ req_access_txt = "11"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"cAQ" = (
/obj/structure/chair,
/turf/open/floor/plating,
@@ -51417,10 +50942,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cBS" = (
/obj/structure/cable{
@@ -51596,89 +51118,6 @@
},
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
-"cCB" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCC" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCD" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine";
- on = 0
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCE" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"cCF" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cCG" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCH" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCI" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"cCP" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCQ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"cCS" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"cCT" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -51698,77 +51137,33 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDe" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/closet/radiation,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cDh" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/device/flashlight,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/item/pipe_dispenser,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDi" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/suit/radiation,
-/obj/item/clothing/head/radiation,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDj" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -51785,90 +51180,39 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDo" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/item/pen,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
+/obj/item/paper_bin{
+ layer = 2.9
+ },
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cDt" = (
+/obj/structure/table,
+/obj/item/twohanded/rcl/pre_loaded,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"cDw" = (
+/obj/structure/closet/secure_closet/engineering_electrical,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDp" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDr" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDs" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDv" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDw" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cDx" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/chair/sofa{
+ icon_state = "sofamiddle";
+ dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Atmos to Loop";
- on = 0
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cDy" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDz" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
+/obj/structure/table,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDB" = (
@@ -51878,102 +51222,23 @@
/obj/effect/landmark/start/station_engineer,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDC" = (
-/obj/item/wrench,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDD" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External Gas to Loop"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"cDF" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "External Gas to Loop"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cDG" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cDH" = (
-/obj/structure/rack,
-/obj/item/clothing/mask/gas{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas{
- pixel_x = -3;
- pixel_y = -3
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDI" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"cDJ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cDK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/turf/open/floor/plasteel/yellow/side{
dir = 4
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
-"cDL" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cDN" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/closed/wall,
-/area/engine/engineering)
-"cDY" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+"cDO" = (
+/obj/effect/turf_decal/stripes/line{
dir = 9
},
-/turf/open/space,
+/turf/open/floor/plating/airless,
/area/space/nearstation)
"cDZ" = (
/obj/structure/cable{
@@ -51983,824 +51248,139 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cEa" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cEd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Port";
- dir = 4;
- network = list("ss13","engine")
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
-"cEe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEf" = (
-/obj/machinery/ai_status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cEg" = (
-/obj/machinery/status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cEh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 8;
- network = list("ss13","engine")
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEk" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cEl" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
"cEm" = (
/obj/machinery/vending/autodrobe,
/turf/open/floor/wood,
/area/maintenance/bar)
-"cEr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cEs" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Gas to Cooling Loop";
- on = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEt" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEu" = (
-/obj/machinery/camera{
- c_tag = "Supermatter Chamber";
- dir = 2;
- network = list("engine");
- pixel_x = 23
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEv" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEw" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEx" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEy" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEz" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cEA" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEC" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Gas";
- on = 0
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cED" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEE" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"cEK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cEL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEM" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/item/tank/internals/plasma,
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cET" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/effect/decal/cleanable/oil,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
-"cEU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cEW" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cFb" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
-/turf/open/floor/engine,
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cFc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"cEv" = (
/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- icon_state = "pump_map";
- name = "Cooling Loop Bypass"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFe" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cFh" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cFj" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
+ icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/turf/open/floor/plating,
-/area/engine/supermatter)
-"cFk" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Mix Bypass"
- },
-/turf/open/floor/engine,
/area/engine/engineering)
-"cFm" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"cFn" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+"cEw" = (
+/obj/structure/particle_accelerator/particle_emitter/left,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cEx" = (
+/obj/structure/particle_accelerator/particle_emitter/right,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cEy" = (
+/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/turf/open/space,
-/area/space/nearstation)
-"cFo" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"cFu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"cFw" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cFy" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+"cEK" = (
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/floor/engine,
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access = null;
+ req_access_txt = "10;13"
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
-"cFz" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
+"cFb" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Port Fore";
+ dir = 2;
+ network = list("engine")
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cFA" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel/dark,
+"cFn" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFI" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFJ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/engine,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFK" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/machinery/field/generator{
+ anchored = 1;
+ state = 2
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFN" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Aft";
- dir = 2;
- network = list("ss13","engine");
- pixel_x = 23
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cFP" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cFT" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"cFU" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGd" = (
-/obj/structure/closet/crate/bin,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGe" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGf" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8;
- filter_type = "n2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGg" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGh" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGj" = (
-/obj/structure/table,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGk" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGl" = (
-/obj/structure/closet/secure_closet/engineering_personal,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGs" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGt" = (
-/obj/structure/closet/wardrobe/engineering_yellow,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGu" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGx" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/obj/machinery/meter,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/components/binary/valve/digital{
- dir = 4;
- name = "Output Release";
- open = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGE" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGH" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGI" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Laser Room";
- req_access_txt = "10"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cGK" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGL" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"cGM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cGR" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGS" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cGT" = (
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGU" = (
-/obj/structure/reflector/double/anchored{
- dir = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGV" = (
-/obj/structure/reflector/box/anchored{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cGZ" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1;
- volume_rate = 200
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cHa" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHc" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHd" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHe" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHg" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHj" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/machinery/power/emitter/anchored{
dir = 8;
state = 2
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"cHn" = (
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-4"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"cHo" = (
-/obj/structure/reflector/single/anchored{
- dir = 9
+"cGh" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHp" = (
-/obj/structure/reflector/single/anchored{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cHr" = (
-/obj/structure/cable{
+/obj/structure/cable/yellow{
icon_state = "1-8"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGr" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGE" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"cGU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"cGV" = (
+/obj/machinery/the_singularitygen/tesla,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"cGZ" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"cHD" = (
/obj/structure/cable{
@@ -53139,8 +51719,13 @@
/turf/open/floor/plating,
/area/security/brig)
"cMm" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"cMC" = (
/obj/machinery/computer/security/telescreen{
@@ -53148,7 +51733,7 @@
dir = 8;
layer = 4;
name = "Engine Monitor";
- network = list("engine");
+ network = list("singularity");
pixel_x = 30
},
/obj/effect/turf_decal/stripes/line{
@@ -53159,15 +51744,24 @@
},
/area/engine/engineering)
"cMD" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"cMH" = (
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"cMN" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plating,
-/area/engine/supermatter)
+/area/engine/engineering)
+"cMH" = (
+/obj/structure/particle_accelerator/particle_emitter/center,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"cMN" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cMQ" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -53375,6 +51969,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"cQZ" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cSz" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53400,41 +52000,23 @@
/turf/open/floor/plasteel/dark/telecomms/mainframe,
/area/tcommsat/server)
"cSG" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plating,
+/area/engine/engineering)
"cSH" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
},
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"cSI" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"cSJ" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"cSK" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"cSL" = (
/obj/machinery/button/door{
id = "atmos";
@@ -53744,18 +52326,6 @@
},
/turf/open/floor/plating,
/area/science/xenobiology)
-"cTY" = (
-/obj/structure/sign/poster/official/safety_internals{
- pixel_x = -32
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"cTZ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"cVb" = (
/turf/closed/wall,
/area/hallway/secondary/service)
@@ -53816,6 +52386,37 @@
dir = 6
},
/area/security/brig)
+"dnf" = (
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobio0";
+ name = "containment blast door"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/engine,
+/area/science/xenobiology)
+"dos" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"dAS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53823,6 +52424,9 @@
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
/area/maintenance/fore/secondary)
+"dBk" = (
+/turf/open/floor/plasteel/dark,
+/area/security/processing)
"dLQ" = (
/turf/open/floor/plasteel/red/corner{
dir = 1
@@ -53865,6 +52469,13 @@
},
/turf/open/floor/plating,
/area/security/brig)
+"ejb" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
"ejX" = (
/obj/machinery/light{
dir = 1
@@ -53908,6 +52519,26 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"ezw" = (
+/obj/structure/window/reinforced,
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "xenobio7";
+ name = "Containment Blast Doors";
+ pixel_y = 4;
+ req_access_txt = "55"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"eBn" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 1
@@ -53920,6 +52551,13 @@
icon_state = "wood-broken5"
},
/area/maintenance/bar)
+"eHD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"eRz" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -53935,6 +52573,11 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"fdi" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"fgi" = (
/turf/closed/wall,
/area/crew_quarters/cryopod)
@@ -53978,9 +52621,16 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/security/armory)
-"fsQ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel/dark,
+"fFB" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/engine/engineering)
"fIx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -54045,6 +52695,9 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/showroomfloor,
/area/space)
+"gre" = (
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"gtB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54148,18 +52801,61 @@
/obj/structure/closet/bombcloset/security,
/turf/open/floor/plasteel/showroomfloor,
/area/space)
+"hmW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"hyz" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/effect/turf_decal/bot{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"hCi" = (
/obj/structure/lattice,
/turf/open/space/basic,
/area/space)
+"hDa" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"hMa" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access = null;
+ req_access_txt = "10;13"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"hQd" = (
+/turf/open/space/basic,
+/area/engine/engineering)
"hSW" = (
/turf/open/floor/plasteel/red/side,
/area/security/brig)
-"ijc" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+"ieW" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"ilg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood{
@@ -54176,6 +52872,14 @@
/obj/machinery/droneDispenser,
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
+"iqO" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Port Aft";
+ dir = 1;
+ network = list("engine")
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"itG" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
@@ -54289,6 +52993,10 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
+"jyX" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
"jAD" = (
/obj/structure/grille,
/turf/open/floor/plating/airless,
@@ -54333,15 +53041,6 @@
dir = 9
},
/area/security/brig)
-"jMY" = (
-/obj/structure/table,
-/obj/item/stack/cable_coil{
- pixel_x = 3;
- pixel_y = -7
- },
-/obj/item/stack/cable_coil,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"jSO" = (
/obj/machinery/light{
dir = 4
@@ -54360,6 +53059,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"jZh" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"khb" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -54370,7 +53076,7 @@
/area/hallway/secondary/service)
"khB" = (
/obj/machinery/door/airlock/external{
- cyclelinkeddir = 4;
+ cyclelinkeddir = 0;
req_access_txt = "13"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -54440,6 +53146,12 @@
icon_state = "wood-broken7"
},
/area/maintenance/bar)
+"kNw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"kPd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
@@ -54455,13 +53167,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/medical/morgue)
-"kQq" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"kSb" = (
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -54628,27 +53333,44 @@
/obj/effect/turf_decal/bot_white,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
-"mBv" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4;
- name = "Output to Waste"
- },
-/turf/open/floor/engine,
+"mzz" = (
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"mHd" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/maintenance/bar)
+"mLm" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"mMg" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"mNi" = (
/obj/machinery/light_switch{
pixel_x = -20
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"mQs" = (
+/obj/machinery/power/emitter/anchored{
+ dir = 4;
+ state = 2
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"mRe" = (
/obj/machinery/light{
dir = 8
@@ -54662,6 +53384,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/maintenance/fore/secondary)
+"mWO" = (
+/turf/open/floor/plating/airless,
+/area/space)
"mXj" = (
/turf/open/floor/plasteel/showroomfloor,
/area/space)
@@ -54671,10 +53396,6 @@
"nnM" = (
/turf/closed/wall/r_wall,
/area/security/armory)
-"noK" = (
-/obj/structure/girder,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"nsq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54708,10 +53429,6 @@
},
/turf/open/floor/plasteel/floorgrime,
/area/security/brig)
-"nzh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"nAv" = (
/obj/structure/table,
/obj/item/grenade/barrier{
@@ -54783,6 +53500,13 @@
/obj/item/device/electropack/shockcollar,
/turf/open/floor/plating,
/area/maintenance/bar)
+"oaS" = (
+/obj/effect/landmark/start/station_engineer,
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"obC" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -54853,10 +53577,19 @@
dir = 10
},
/area/security/brig)
-"oDF" = (
-/obj/machinery/light,
+"oAQ" = (
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
+"oHi" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"oHU" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -54880,6 +53613,21 @@
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"oUs" = (
+/obj/machinery/button/door{
+ id = "Singularity";
+ name = "Shutters Control";
+ pixel_x = -25;
+ req_access_txt = "11"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"oZl" = (
/turf/open/floor/plasteel/purple/side{
tag = "icon-purple (NORTH)";
@@ -54923,6 +53671,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"pmD" = (
+/turf/open/space/basic,
+/area/space/nearstation)
"pzG" = (
/obj/structure/sign/poster/random{
pixel_x = -32
@@ -55089,6 +53840,14 @@
/obj/item/device/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
+"riY" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Engine Containment Starboard Aft";
+ dir = 1;
+ network = list("engine")
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"rmX" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/beer,
@@ -55131,11 +53890,22 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"rNn" = (
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"rWu" = (
/turf/open/floor/wood{
icon_state = "wood-broken6"
},
/area/maintenance/bar)
+"rZV" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"saK" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -55148,6 +53918,20 @@
/obj/item/gun/energy/laser/practice,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"spp" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "Singularity";
+ name = "radiation shutters"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/bot{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"srd" = (
/turf/open/floor/plasteel/red/corner{
dir = 4
@@ -55170,6 +53954,12 @@
/obj/item/shovel/spade,
/turf/open/floor/plasteel/hydrofloor,
/area/hallway/secondary/service)
+"sAz" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"sGJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood{
@@ -55236,6 +54026,12 @@
/obj/structure/chair/office/light,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"sWi" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"sXy" = (
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
@@ -55299,6 +54095,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/space/nearstation)
+"tHc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"tMl" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/showroomfloor,
@@ -55329,21 +54131,14 @@
/obj/item/storage/box/drinkingglasses,
/turf/open/floor/wood,
/area/maintenance/bar)
-"udp" = (
-/obj/item/crowbar/large,
-/obj/structure/rack,
-/obj/item/device/flashlight,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"uhH" = (
-/obj/item/wrench,
-/obj/item/weldingtool,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
+"ugZ" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
},
-/obj/structure/rack,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"ujc" = (
/obj/machinery/vending/cigarette,
@@ -55401,6 +54196,20 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"uuA" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 2;
+ pixel_y = 4
+ },
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -2
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"uvc" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
@@ -55408,6 +54217,12 @@
"uvy" = (
/turf/closed/wall/r_wall,
/area/space)
+"uAt" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/yellow/side,
+/area/engine/engineering)
"uMX" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -55487,6 +54302,12 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
+"vie" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"vxh" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance{
@@ -55517,6 +54338,33 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"vDd" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "xenobio0";
+ name = "Containment Blast Doors";
+ pixel_y = 4;
+ req_access_txt = "55"
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
+"vHQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"vNJ" = (
/obj/machinery/vending/clothing,
/turf/open/floor/wood,
@@ -55740,6 +54588,22 @@
/obj/effect/spawner/lootdrop/grille_or_trash,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"xJs" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"xMh" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xTa" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -55768,6 +54632,14 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"yam" = (
+/obj/effect/landmark/start/atmospheric_technician,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"yck" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/space)
"ycu" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -78747,10 +77619,10 @@ abc
abc
afu
abc
-aaa
-aaa
-aaa
-aaa
+abc
+abc
+abc
+abc
aaa
aaa
aaa
@@ -79016,7 +77888,7 @@ aln
aiU
aaa
aiU
-anN
+aln
aiU
aaa
aaa
@@ -79124,8 +77996,8 @@ aaa
aaa
aaa
aaa
-aaT
-aaT
+aaa
+aaa
aaa
aaa
aaa
@@ -79269,11 +78141,11 @@ aaf
aaf
aaf
aiU
-alp
+dBk
aiU
aaa
aiU
-alp
+dBk
aiU
aaf
aaf
@@ -79369,21 +78241,21 @@ cjJ
aaa
aaa
crn
-aaf
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-aaf
-ctv
-aaT
-aaT
aaa
aaa
aaa
@@ -79530,7 +78402,7 @@ cxJ
aiU
aiT
aiU
-cxP
+cxJ
aiU
aiV
aiT
@@ -79626,21 +78498,21 @@ cjJ
aaa
aaa
crn
-aaf
-aaT
-ctv
-ctv
-ctv
-ctv
-ctv
-ctv
-ctv
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-aaf
-ctv
-ctv
-aaT
aaa
aaa
aaa
@@ -79883,20 +78755,20 @@ cjJ
aaf
aaf
cig
-aaf
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaT
-aaf
-aaf
-aaf
-aaf
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80141,17 +79013,17 @@ ccw
ccw
ccw
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaa
-aaf
aaa
aaa
aaa
-aaf
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80398,19 +79270,19 @@ cqw
cqO
crp
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaa
-aaf
aaa
aaa
aaa
-aaT
-aaT
-aaT
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -80654,20 +79526,20 @@ cgR
cgR
cqN
cro
-cEl
-cEE
-cEl
-cFm
-csx
-cFm
-cFm
-csx
-csv
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
-aaT
-ctv
-aaT
aaa
aaa
aaa
@@ -80911,20 +79783,20 @@ ciN
cji
cDZ
crr
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -81164,24 +80036,24 @@ ccw
cfL
coH
cBO
-cgR
+cnv
cDB
cqP
crq
-crZ
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
+pmD
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
aaa
-aaT
-ctv
-aaT
aaa
aaa
aaa
@@ -81425,21 +80297,21 @@ cgR
cqx
cqR
crp
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
-aaa
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+gXs
+hCi
aaa
aaa
aaa
@@ -81682,25 +80554,25 @@ cpX
cqz
cqQ
ccw
-crH
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
+pmD
aaa
aaa
-aaT
-ctv
-aaT
+uvy
+uvy
+uvy
aaa
aaa
aaa
aaa
aaa
+uvy
+uvy
+uvy
+hCi
+hCi
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -81939,24 +80811,24 @@ clJ
cig
cig
ccw
-crJ
-crT
-crJ
-cFn
-css
-csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-ctv
-aaT
-aaa
+pmD
+pmD
+uvy
+uvy
+uvy
+uvy
+uvy
aaa
aaa
aaa
+uvy
+uvy
+uvy
+uvy
+uvy
+hCi
+hCi
+hCi
aaa
aaa
aaa
@@ -82190,30 +81062,30 @@ ccw
ccw
ccw
cnZ
-coH
+oHi
+cpt
+cpt
cpt
-cpZ
-cig
cqS
ccw
-crH
-crT
-crZ
-cFo
-css
-cFm
-cFm
-css
-csv
-aaa
-aaa
-aaT
-ctv
-aaT
-aaa
-aaa
-aaf
-aaa
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+cpy
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -82449,28 +81321,28 @@ cnt
cob
coL
cDo
+oaS
cgR
-cqA
cqT
-csg
+ccw
crJ
-crU
+ccw
csb
cFn
css
+cFn
csx
-csx
-css
-csb
-aaf
-aaf
-aaT
-aaT
-aaT
-gXs
-aaf
-aaf
-aaf
+ccw
+ccw
+ccw
+cGE
+cFn
+jZh
+mzz
+mzz
+ccw
+uvy
+yck
aaa
aaa
aaa
@@ -82707,27 +81579,27 @@ cgw
coK
cpu
cMm
-ccw
-ccw
-ccw
+ckH
+uAt
+hMa
crK
cEK
csa
-csj
-csa
-csa
+gre
+mQs
+gre
cGr
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+vHQ
+hDa
+vHQ
+mLm
+gre
+mQs
+gre
+gre
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -82960,31 +81832,31 @@ ckG
clJ
cmF
cgR
-cgI
+cnZ
chF
ciO
-cqc
-cqc
-cqc
-cEd
-cEr
-cEL
+oaS
+cgR
+cqT
+ccw
+cig
+ccw
cFb
-cFu
+gre
cFI
-cGd
-cGs
-cGr
+gre
+gre
+gre
+gre
+gre
+gre
+gre
+cFI
+gre
+iqO
ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-aaa
-eRz
-aaT
-eRz
+uvy
+fdi
aaa
aaa
aaa
@@ -83217,30 +82089,30 @@ cTa
ceZ
clQ
cgR
-cgx
-coM
-cpv
-cqb
-cqb
-cqb
-cqb
+cnZ
+oHi
+cgR
+cgR
+cgR
+cqT
+fFB
cEs
-cqb
-cqb
+gre
+rNn
cAp
-cqb
+xJs
cAo
-cGt
-cgx
-jMY
-csd
-cHa
-csd
-uhH
+xJs
+cAo
+xJs
+cAo
+xJs
+cQZ
+gre
+gre
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -83475,29 +82347,29 @@ cTd
ckF
ckF
cgK
-cDg
-cDp
-cqe
-cqB
-cqB
-cEe
+oHi
+cgR
+cgR
+cgR
+cqT
+fFB
csP
-cAl
-cFc
+gre
+gre
cAq
-cFJ
+mWO
cSH
-cGu
-cGH
-fsQ
-fsQ
-cGR
-csd
-csd
+mWO
+cSH
+mWO
+cSH
+mWO
+cSH
+mWO
+gre
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -83735,26 +82607,26 @@ cgJ
chG
cpx
cqd
-cDC
+cjc
cqU
-cEf
-cEt
-cEM
-csA
-cEg
+fFB
+csP
+gre
+rNn
+cAq
cFK
-cGe
-cGv
-cGI
-cGS
-cHb
-cHg
-cHn
-oDF
+aoV
+aoV
+cFK
+gXs
+aaa
+aoV
+aoV
+cFK
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaf
aaa
@@ -83988,30 +82860,30 @@ cig
cig
cTf
cgR
-ccw
+cnZ
cDh
cpy
-cDv
-cDD
-cqU
-cMD
-cEu
-cEz
-cEz
-cMD
-cFL
-cGf
-kQq
-cMm
-ciZ
-cHc
-cAu
-cAu
-ciZ
ccw
+hyz
+ccw
+ccw
+cqY
+cqY
+cqY
+cAq
+aoV
+aoV
+aoV
+hCi
+aaf
aaa
-aaT
-ctv
+aoV
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84245,30 +83117,30 @@ ckI
clJ
cmL
cBO
+cnZ
+cDh
ccw
-chV
-cpx
cqf
cqD
-cMD
+oUs
crs
cEv
-cEv
-cFe
-cMD
-cFM
-czE
-kQq
-ccw
-cGT
-csd
-csd
-csd
-csd
-ccw
+ugZ
+cqY
+cAq
+aoV
+aoV
+aaa
+aaa
aaf
-aaT
-ctv
+aaa
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84502,30 +83374,30 @@ ckK
clJ
cmL
cgR
-cgL
+cnZ
chX
-cpx
+spp
cqh
cqF
cra
crI
cEw
-cEw
-cEw
-cFw
-cFN
-csH
-csR
-cMm
-cGU
-csd
-csd
-cHo
-csd
-ccw
+ejb
+cqY
+cAq
aaa
-aaT
-ctv
+aaa
+aaa
+cDO
+cGU
+sWi
+aaa
+hCi
+cFK
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -84759,30 +83631,30 @@ ckI
clJ
cmL
cnv
-cMm
-chX
-cpx
+cnZ
+eHD
+ccw
cqg
cqE
cqZ
crt
cMH
cAm
-cMH
+mMg
cMN
-cFO
-cSI
-cSI
-cMm
+gXs
+aaf
+aaf
+kNw
cGV
-csd
-cGV
-noK
-csd
+tHc
+aaf
+aaf
+gXs
+mWO
+gre
ccw
-aaa
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -85016,30 +83888,30 @@ cfb
ccw
cmN
cgR
-cgL
-chX
-cpx
+cnZ
+eHD
+hyz
cqj
cSG
crb
cru
cEx
-cEx
-cEx
-cAP
-cFP
-csI
-cAt
-cMm
-csd
-csd
-csd
-cHp
-csd
+oAQ
+cqY
+cAq
+cFK
+hCi
+aaa
+hmW
+sAz
+ieW
+aaa
+aaa
+aaa
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -85273,30 +84145,30 @@ cfb
clM
cfz
cgR
+cnZ
+eHD
ccw
-cii
-cpx
cqi
cMD
cAP
-crv
-cEy
-cEy
-cFh
cMD
-cFM
-czE
-kQq
-ccw
-cGT
-csd
-csd
-csd
-csd
-ccw
+cMD
+cEy
+cqY
+cAq
+aoV
+aoV
+aaa
+aaa
aaf
-aaT
-ctv
+aaa
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -85530,30 +84402,30 @@ cfb
cfa
cje
cgR
+cnZ
+eHD
+cpy
ccw
-cDi
-cDr
-cDw
-cDE
-cEa
-cMD
-cEz
-cEz
-cEz
-cMD
-cFR
-cSJ
-kQq
-cMm
-ciZ
-cHd
-cHj
-cHd
-ciZ
+hyz
ccw
+ccw
+cqY
+cqY
+cqY
+cAq
+aoV
+aoV
aaa
-aaT
-ctv
+aaa
+aaf
+hCi
+aaa
+aoV
+aoV
+mWO
+gre
+ccw
+uvy
aaT
aaa
aaa
@@ -85787,30 +84659,30 @@ ckL
cmF
cje
cgR
-cMm
-chX
+cnZ
+cjS
cpD
cDw
cDF
cEa
-cEg
-cEA
-cET
-cFj
-cEf
-cFS
-cGg
-mBv
-cGI
-cGS
-cHe
-cHe
-cHr
-oDF
+fFB
+csP
+gre
+rNn
+cAq
+cFK
+aoV
+aaa
+aaa
+gXs
+cFK
+aoV
+aoV
+cFK
+mWO
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaf
aaa
@@ -86044,30 +84916,30 @@ ceq
clQ
cje
cgR
-cMm
-cDj
-cDs
-cql
-cDG
-cDG
-cEh
-cEB
-cEU
-cFk
-cAs
-cFT
+cnZ
+cjS
+cgR
+cgR
+cgR
+cqT
+fFB
+csP
+gre
+gre
+cAq
+mWO
cSK
-cGx
-cGK
-nzh
-nzh
-cGY
-csd
-csd
+mWO
+cSK
+mWO
+cSK
+mWO
+cSK
+mWO
+gre
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -86301,30 +85173,30 @@ ckO
ckH
cja
cny
-ccw
-cip
+cnZ
+cjS
cnx
cDx
cqb
-cqb
-cqb
-cEC
-cqb
-cqb
+cqT
+fFB
+cEs
+gre
+rNn
cAr
-cqb
+xJs
cGh
-cGC
-cey
-ijc
-csd
-cEk
-csd
-udp
+xJs
+cGh
+xJs
+cGh
+xJs
+vie
+gre
+gre
+gre
ccw
-aaf
-aaT
-ctv
+uvy
aaT
aaa
aaa
@@ -86558,30 +85430,30 @@ cfb
clR
cgR
cgR
-cMm
-cir
+cnZ
+cjS
cDt
cDy
cqC
+cqT
+ccw
+ccw
+ccw
crc
-cEi
-cED
-crc
-crc
-cFy
+gre
cBR
-cGi
-cGD
-cGL
+gre
+gre
+gre
+gre
+gre
+gre
+gre
+cBR
+gre
+riY
ccw
-ccw
-ccw
-ccw
-ccw
-ccw
-aaa
-aaT
-aaT
+uvy
aaT
aaa
aaa
@@ -86819,27 +85691,27 @@ cDe
cDk
coc
cqa
-cig
-ccw
-ccw
+uuA
+uAt
+hMa
czF
+cEK
csd
-csd
-cFz
+gre
cFU
-cGj
+gre
cGE
-cGM
+vHQ
cGZ
-aag
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+vHQ
+csx
+gre
+cFU
+gre
+gre
+ccw
+uvy
+hCi
aaa
aaa
aaa
@@ -87075,28 +85947,28 @@ cgU
cgU
cis
cjN
-cDz
-cDH
-cMm
-csd
-crM
-crV
-crV
-cFA
-csd
-cGk
+cgR
+cgR
+cqT
ccw
-aag
-aag
-aag
-aaf
-aaf
-aaf
-aaf
-gXs
-aaf
-aaf
-aaf
+crM
+ccw
+crV
+cFn
+xMh
+cFn
+mLm
+ccw
+ccw
+ccw
+cGr
+cFn
+rZV
+mzz
+mzz
+ccw
+uvy
+yck
aaf
aaa
aaa
@@ -87328,32 +86200,32 @@ ccw
cet
cfd
cfB
-cfI
-cgQ
+cfB
+cfB
cjS
cjN
-cqm
cgR
-crd
-cEk
-crL
-cEW
-cse
-cse
-csu
-cGl
+cgR
+cqT
ccw
-aaa
-aaa
-aaf
-aaa
-aaf
-ctv
-aaT
-aaa
-aaa
-aaf
-aaa
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+cpy
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+jyX
+uvy
+hCi
aaa
aaa
aaa
@@ -87589,28 +86461,28 @@ ccw
ccw
cDl
cjN
-cjh
-cDI
+cgR
+cgR
+cgR
+cqS
ccw
ccw
ccw
ccw
ccw
-cMm
-cMm
-cMm
ccw
-aaf
-aaf
-aaf
-aaf
-aaf
-ctv
-aaT
-aaa
-aaa
-aaf
+hQd
+pmD
+pmD
+pmD
+uvy
+uvy
+uvy
+uvy
+uvy
aaa
+yck
+hCi
aaa
aaa
aaa
@@ -87847,7 +86719,7 @@ ccw
cDm
cjP
ckF
-cDJ
+ckF
ckF
cpE
cjR
@@ -87860,13 +86732,13 @@ aaa
aaa
aaa
aaa
-ctv
-ctv
-ctv
-aaT
-aaa
-aaa
-aaa
+pmD
+uvy
+uvy
+uvy
+hCi
+hCi
+hCi
aaa
aaa
aaa
@@ -88089,7 +86961,7 @@ caE
cbA
ccy
bOd
-bOd
+yam
bQu
cfO
cgW
@@ -88111,17 +86983,17 @@ ccw
crX
cfK
aag
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaT
-aaT
-aaT
-aaT
-aaa
+hCi
+hCi
+hCi
+hCi
+hCi
+hCi
+gXs
+gXs
+gXs
+gXs
+hCi
aaa
aaa
aae
@@ -88334,7 +87206,7 @@ bIF
bOZ
bQp
bRA
-bOd
+yam
bTO
bUL
bVU
@@ -88361,7 +87233,7 @@ ccw
cpa
cjc
cqo
-cDL
+ccw
cjk
cjm
ccw
@@ -88377,7 +87249,7 @@ aaa
aaa
aaa
aaa
-eRz
+gXs
aaa
aaa
aaa
@@ -88618,7 +87490,7 @@ ccw
ccw
cpI
ccw
-cDL
+ccw
cjl
cjQ
cjV
@@ -88875,7 +87747,7 @@ cig
cpb
ciZ
cqp
-cDN
+cig
cjT
cgR
crP
@@ -89132,7 +88004,7 @@ cig
cig
czg
cig
-cDN
+cig
crh
crA
crR
@@ -89389,7 +88261,7 @@ cig
cpc
cpJ
cpc
-cDN
+cig
cqY
cqY
cqY
@@ -89622,7 +88494,7 @@ bRF
bSM
bTS
bUQ
-agd
+bWa
bUO
bVZ
bVZ
@@ -89646,7 +88518,7 @@ cig
cpd
czM
cpd
-cDN
+cig
aaa
aaa
aaa
@@ -89879,8 +88751,8 @@ bRE
bSJ
bPe
bOd
-cCB
-cCC
+bOd
+bOd
bXT
bXT
bXT
@@ -89903,7 +88775,7 @@ ccw
cpd
czL
cpd
-cDL
+ccw
aaf
aaa
aaa
@@ -90137,7 +89009,7 @@ bSM
bTU
bUS
bUS
-cCD
+bUS
bXU
bUS
bUS
@@ -90160,7 +89032,7 @@ aaa
cpd
cpM
cpd
-cCQ
+aaf
aaf
aaa
aaa
@@ -90394,7 +89266,7 @@ bSN
bTT
bUR
bWb
-cCE
+bUR
bTT
bUR
bZJ
@@ -90417,7 +89289,7 @@ aaa
aaa
czN
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -90674,7 +89546,7 @@ aaa
aaa
aaa
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -90908,7 +89780,7 @@ bSP
bPh
bQy
bRI
-cCF
+bQy
bPh
bQy
bRI
@@ -90931,7 +89803,7 @@ aaa
aaa
aaa
aaa
-cCQ
+aaf
aaf
aaa
aaa
@@ -91165,16 +90037,16 @@ aaf
bRK
aaf
bVv
-cCG
-cCH
-cCI
-cCJ
-cCI
-cCH
-cCI
-cCJ
-cCI
-cCP
+aaf
+bRK
+aaf
+bVv
+aaf
+bRK
+aaf
+bVv
+aaf
+aaf
bLK
chg
bLK
@@ -91188,7 +90060,7 @@ aoV
aoV
aoV
aoV
-cCQ
+aaf
aoV
aaa
aaa
@@ -91431,7 +90303,7 @@ bPj
bQA
bPj
bOh
-cCQ
+aaf
bLK
cyG
bLK
@@ -91445,7 +90317,7 @@ aoV
aoV
aoV
aoV
-cCQ
+aaf
aoV
aaa
aaa
@@ -91688,21 +90560,21 @@ cbI
ccC
cdD
bOh
-cCG
-cCS
-cCS
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cDY
+aaf
+aah
+aah
+aaf
+aaf
+aaf
+aaf
+aaf
+aah
+aah
+aah
+aah
+aah
+aah
+aaf
aaf
aaf
aaf
@@ -97857,7 +96729,7 @@ bDb
bDb
bDb
bDb
-cNW
+bDb
cNW
cQB
czY
@@ -98110,11 +96982,11 @@ bJN
bRT
bEm
bEm
+bJN
+bRT
+bEm
+bEm
bDb
-cfr
-cho
-bDb
-aaa
cNW
cQB
czY
@@ -98353,7 +97225,7 @@ bJJ
bKY
bMi
bNo
-bIP
+bOx
bPA
bJN
bRU
@@ -98367,12 +97239,12 @@ bJN
bRU
bEm
bEm
+bJN
+bRU
+bEm
+bEm
bDb
-cgi
-chq
-ccQ
-aaa
-cOT
+cNW
cQB
czY
cOT
@@ -98624,12 +97496,12 @@ bJN
bRU
bEm
cBz
+bJN
+bRU
+bEm
+cBz
bDb
-cgi
-chq
-ccQ
-aaa
-cOT
+cNW
cQB
czY
cOT
@@ -98868,7 +97740,7 @@ bLa
bMi
bNo
bPy
-bPA
+dos
bJN
bRW
bTb
@@ -98881,11 +97753,11 @@ bJN
bZV
caV
cbS
-bDb
+bJN
cgl
chs
+dnf
bDb
-aaa
cNW
cQB
czY
@@ -99138,11 +98010,11 @@ bVi
bRV
bTa
cbR
+bVi
+bRV
+bTa
+vDd
bDb
-cgk
-chr
-bDb
-aaa
cNW
cBN
czY
@@ -99395,12 +98267,12 @@ bZa
bMi
bMi
bRZ
-cTY
-cTZ
-chu
-ccQ
-aaf
-cOT
+bZa
+bMi
+bMi
+bRZ
+bDb
+cNW
cQB
cAa
cOT
@@ -99651,13 +98523,13 @@ bUf
bTc
bRX
bTc
+bUf
+bTc
+bRX
+bTc
cbT
-ccP
-ccP
-cht
-ckn
csk
-czQ
+cko
czU
czZ
cOT
@@ -99909,12 +98781,12 @@ bZb
bRZ
bMi
bMi
-cfy
-cgn
-cjB
-ccQ
-aaf
-cOT
+bZb
+bRZ
+bMi
+bMi
+bDb
+cNW
cgm
czY
cOT
@@ -100166,11 +99038,11 @@ bVi
bZW
bTd
bUg
+bVi
+ezw
+bTd
+bUg
bDb
-bDb
-bDb
-bDb
-aaa
cNW
cgm
czY
@@ -100423,11 +99295,11 @@ bJN
bZX
caW
cbU
+bJN
+bWn
+bXg
+bYh
bDb
-aaf
-aaf
-aaa
-aaa
cNW
cgm
czY
@@ -100680,12 +99552,12 @@ bJN
bEm
bEm
bRU
+bJN
+bEm
+bEm
+bRU
bDb
-aaf
-aaa
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -100937,12 +99809,12 @@ bJN
bEm
bEm
bRU
+bJN
+bEm
+bEm
+bRU
bDb
-aaf
-aaa
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -101194,12 +100066,12 @@ bJN
bEm
bEm
bUi
+bJN
+bEm
+bEm
+bUi
bDb
-aaf
-aaf
-aaa
-aaa
-cOT
+cNW
cgm
czY
cOT
@@ -101452,10 +100324,10 @@ bDb
bDb
bDb
bDb
-cNW
-cNW
-cNW
-cNW
+bDb
+bDb
+bDb
+bDb
cNW
czX
cAc
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 7951c5a282..b1b3f234f9 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -9182,10 +9182,6 @@
},
/turf/open/floor/circuit/green,
/area/engine/supermatter)
-"ayK" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
"ayL" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 4
@@ -50251,6 +50247,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/power/emitter{
+ anchored = 1;
+ state = 2
+ },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cdE" = (
@@ -51319,6 +51319,7 @@
dir = 8;
network = list("singularity")
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cfC" = (
@@ -52290,7 +52291,6 @@
/turf/open/space,
/area/space/nearstation)
"chu" = (
-/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
@@ -53055,10 +53055,10 @@
"cjb" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-4"
},
/turf/open/space,
/area/space/nearstation)
@@ -53074,28 +53074,11 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cje" = (
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plating,
/area/engine/engineering)
-"cjf" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"cjg" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -53660,13 +53643,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"ckx" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cky" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -53682,6 +53658,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ckA" = (
@@ -53690,35 +53667,11 @@
id = "engpa";
name = "Engineering Chamber Shutters"
},
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/plating,
/area/engine/engineering)
-"ckB" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ckC" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/neutral,
-/area/engine/engineering)
"ckD" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral,
@@ -54289,20 +54242,9 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"clS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"clT" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/field/generator{
- anchored = 1
+ anchored = 1;
+ state = 2
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -54315,19 +54257,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"clV" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"clW" = (
/obj/structure/rack,
/obj/item/crowbar,
@@ -54337,9 +54266,6 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"clX" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -55205,9 +55131,6 @@
id = "engpa";
name = "Engineering Chamber Shutters"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line{
dir = 2
},
@@ -55893,9 +55816,6 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -56455,6 +56375,10 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cqr" = (
+/obj/structure/particle_accelerator/particle_emitter/left{
+ icon_state = "emitter_left";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"cqs" = (
@@ -56463,6 +56387,7 @@
/area/engine/engineering)
"cqt" = (
/obj/structure/cable,
+/obj/machinery/particle_accelerator/control_box,
/turf/open/floor/plating,
/area/engine/engineering)
"cqu" = (
@@ -57024,7 +56949,7 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"crJ" = (
-/obj/item/wrench,
+/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"crK" = (
@@ -57065,7 +56990,10 @@
/turf/open/floor/plating,
/area/engine/engineering)
"crO" = (
-/obj/item/weldingtool/largetank,
+/obj/structure/particle_accelerator/fuel_chamber{
+ icon_state = "fuel_chamber";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"crP" = (
@@ -57843,7 +57771,10 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ctp" = (
-/obj/item/wrench,
+/obj/structure/particle_accelerator/particle_emitter/right{
+ icon_state = "emitter_right";
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"ctq" = (
@@ -58656,9 +58587,6 @@
/obj/structure/cable{
icon_state = "1-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/engine/engineering)
@@ -58713,6 +58641,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cva" = (
@@ -59870,24 +59799,6 @@
dir = 4
},
/area/crew_quarters/fitness/recreation)
-"cxA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
-"cxB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/field/generator{
- anchored = 1
- },
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"cxD" = (
/obj/structure/rack,
/obj/item/crowbar,
@@ -60707,13 +60618,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"czp" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
"czq" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -60727,33 +60631,9 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"czs" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engpa";
- name = "Engineering Chamber Shutters"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"czt" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plasteel/neutral,
-/area/engine/engineering)
"czu" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -61355,10 +61235,10 @@
"cAI" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "4-8"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-4"
},
/turf/open/space,
/area/space/nearstation)
@@ -61370,11 +61250,7 @@
/turf/open/space,
/area/space/nearstation)
"cAK" = (
-/obj/machinery/power/rad_collector/anchored,
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/turf_decal/stripes/line{
dir = 4
},
@@ -62960,6 +62836,7 @@
dir = 8;
network = list("singularity")
},
+/obj/machinery/power/grounding_rod,
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cDW" = (
@@ -63843,6 +63720,12 @@
icon_state = "0-2"
},
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/emitter{
+ anchored = 1;
+ dir = 1;
+ icon_state = "emitter";
+ state = 2
+ },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cFI" = (
@@ -67649,9 +67532,6 @@
dir = 5
},
/area/science/xenobiology)
-"cNh" = (
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
"cNi" = (
/obj/machinery/light/small{
dir = 1
@@ -67662,7 +67542,9 @@
name = "xenobiology camera";
network = list("ss13","xeno","rd")
},
-/turf/open/floor/plasteel/vault/killroom,
+/turf/open/floor/plasteel/vault{
+ dir = 5
+ },
/area/science/xenobiology)
"cNj" = (
/obj/structure/closet/crate{
@@ -68378,26 +68260,6 @@
"cON" = (
/turf/open/floor/circuit/green,
/area/science/xenobiology)
-"cOO" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 2;
- external_pressure_bound = 140;
- name = "killroom vent";
- pressure_checks = 0
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cOP" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"cOQ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 2;
- external_pressure_bound = 120;
- name = "server vent"
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cOR" = (
/turf/closed/wall/r_wall,
/area/science/research)
@@ -69153,24 +69015,6 @@
dir = 1
},
/area/science/xenobiology)
-"cQw" = (
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
-"cQx" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
-"cQy" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/vault/killroom,
-/area/science/xenobiology)
"cQz" = (
/obj/structure/closet/wardrobe/science_white,
/obj/machinery/light/small{
@@ -69874,7 +69718,6 @@
icon_state = "0-4"
},
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/open/floor/plating,
/area/science/xenobiology)
"cSg" = (
@@ -69885,7 +69728,7 @@
icon_state = "2-8"
},
/obj/machinery/door/airlock/research/glass{
- name = "Xenobiology Kill Room";
+ name = "Xenobiology Isolation Pin";
req_access_txt = "47"
},
/obj/effect/turf_decal/stripes/line{
@@ -70675,13 +70518,19 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTR" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1;
- min_temperature = 80;
- on = 1;
- target_temperature = 80
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
},
-/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTS" = (
@@ -72377,9 +72226,6 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cXm" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/machinery/status_display{
pixel_x = 32
},
@@ -100905,6 +100751,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"gsR" = (
+/turf/open/space,
+/area/space)
"gKr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -100964,6 +100813,25 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
+"htt" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"hGT" = (
/obj/machinery/door/firedoor,
/obj/structure/cable/white{
@@ -100995,6 +100863,9 @@
dir = 9
},
/area/science/circuit)
+"hRG" = (
+/turf/open/space/basic,
+/area/space/nearstation)
"iQh" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -101053,6 +100924,9 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/neutral,
/area/medical/morgue)
+"jKb" = (
+/turf/open/space,
+/area/space/nearstation)
"kwx" = (
/obj/effect/turf_decal/loading_area,
/turf/open/floor/plasteel/whitepurple/corner,
@@ -101078,6 +100952,9 @@
dir = 5
},
/area/crew_quarters/locker)
+"lkn" = (
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"loI" = (
/obj/machinery/autolathe,
/obj/machinery/door/window/southleft{
@@ -101093,6 +100970,10 @@
dir = 4
},
/area/science/lab)
+"lxv" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"lEl" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -101137,6 +101018,13 @@
dir = 1
},
/area/science/circuit)
+"mqk" = (
+/obj/structure/particle_accelerator/end_cap{
+ icon_state = "end_cap";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"mvm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -101148,6 +101036,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/circuit/green,
/area/science/research/abandoned)
+"nJG" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"oZC" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -101161,6 +101053,13 @@
},
/turf/open/floor/wood,
/area/bridge/showroom/corporate)
+"pfd" = (
+/obj/structure/particle_accelerator/particle_emitter/center{
+ icon_state = "emitter_center";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"pmQ" = (
/obj/structure/table/reinforced,
/obj/machinery/newscaster{
@@ -101224,6 +101123,19 @@
"saw" = (
/turf/closed/wall,
/area/science/circuit)
+"shc" = (
+/obj/machinery/status_display{
+ pixel_x = 32
+ },
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/open/floor/circuit/green,
+/area/science/xenobiology)
+"tdp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"tmi" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -101262,6 +101174,9 @@
/obj/structure/reagent_dispensers/water_cooler,
/turf/open/floor/plasteel/whitepurple/side,
/area/science/misc_lab)
+"uDN" = (
+/turf/open/floor/plating/airless,
+/area/space)
"uYS" = (
/obj/machinery/door/airlock/atmos/glass{
heat_proof = 1;
@@ -101319,6 +101234,13 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"xwB" = (
+/obj/structure/particle_accelerator/power_box{
+ icon_state = "power_box";
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"xwK" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -121811,14 +121733,14 @@ aaa
cja
ckw
clS
-aad
-aad
-clR
-aaa
-abj
-aad
-aad
-cxA
+jKb
+jKb
+clS
+nJG
+hRG
+jKb
+jKb
+clS
ctn
cja
aaa
@@ -122066,17 +121988,17 @@ cdC
cfA
aad
cjb
-ckx
+cky
+jKb
+gsR
+gsR
+lxv
aad
-aaa
-aaa
-abj
-aad
-abj
-aaa
-aaa
-aad
-czp
+hRG
+gsR
+gsR
+jKb
+czq
cAI
aad
cDT
@@ -122324,15 +122246,15 @@ cfA
aaa
cja
ckw
+jKb
+gsR
+hRG
+hRG
aad
-aaa
-abj
-abj
-abj
-abj
-abj
-aaa
-aad
+hRG
+hRG
+gsR
+jKb
ctn
cja
aaa
@@ -122579,19 +122501,19 @@ car
cbP
cfA
abj
-cja
-ckw
-ckw
-abj
-abj
+cjb
+cky
+hRG
+hRG
+hRG
cqo
clR
ctm
-abj
-abj
-abj
-ctn
-cja
+hRG
+lxv
+clS
+czq
+cAI
abj
cDT
cFJ
@@ -122836,19 +122758,19 @@ car
cbP
cdC
aad
-cjb
-cky
-aaa
+cja
+ckw
+nJG
+aad
aad
-abj
ckw
crJ
-ctn
-abj
+tdp
aad
-aaa
-czq
-cAI
+aad
+nJG
+ctn
+cja
aad
cdC
cFJ
@@ -123093,19 +123015,19 @@ car
cbP
cfA
abj
-cja
-ckw
-abj
-abj
-abj
+cjb
+cky
+clS
+lxv
+hRG
cqp
crK
cto
-abj
-abj
-ctn
-ctn
-cja
+hRG
+hRG
+hRG
+czq
+cAI
abj
cDT
cFJ
@@ -123352,15 +123274,15 @@ cfA
aaa
cja
ckw
+jKb
+gsR
+hRG
+hRG
aad
-aaa
-abj
-abj
-abj
-abj
-abj
-aaa
-aad
+hRG
+hRG
+gsR
+jKb
ctn
cja
aaa
@@ -123608,17 +123530,17 @@ cdC
cfA
aad
cjb
-ckx
+cky
+jKb
+gsR
+aaa
+hRG
aad
+lxv
aaa
-aaa
-abj
-aad
-abj
-aaa
-aaa
-aad
-czp
+gsR
+jKb
+czq
cAI
aad
cDU
@@ -123866,15 +123788,15 @@ cfA
aaa
cja
ckw
-clT
-aad
-aad
-abj
-aaa
-crK
-aad
-aad
-cxB
+clS
+jKb
+hRG
+hRG
+nJG
+clS
+jKb
+jKb
+clS
ctn
cja
aaa
@@ -124377,8 +124299,8 @@ car
cbT
cdG
cfB
-aaa
-aad
+uDN
+lkn
aaa
aad
cjd
@@ -124390,8 +124312,8 @@ cjd
cjd
aad
aaa
-aad
-aaa
+lkn
+uDN
cDV
cFL
cHg
@@ -124898,7 +124820,7 @@ cje
cjd
cpa
cqr
-cqr
+pfd
ctp
cuQ
cjd
@@ -125149,19 +125071,19 @@ cbV
cdJ
car
chv
-cjf
+chv
ckA
-clV
+chv
cnC
cpa
cqs
-cqr
+xwB
ctq
cuR
cnC
-cjf
-czs
-clV
+chv
+chv
+chv
chv
car
cFO
@@ -125407,7 +125329,7 @@ cdK
cfD
chw
cjg
-ckB
+chw
clW
cnD
cpb
@@ -125417,7 +125339,7 @@ ctr
cuS
cnD
cxD
-ckB
+chw
chw
chw
cDW
@@ -125664,17 +125586,17 @@ cdL
cfE
chx
cjh
-ckC
+cjn
clX
cnE
cpc
cqu
-cqr
+mqk
cts
cuT
cnE
clX
-czt
+cjn
cAL
cCs
cDX
@@ -127151,7 +127073,7 @@ atS
avb
awh
axz
-ayK
+axz
axz
aAW
axz
@@ -128522,7 +128444,7 @@ das
dcd
cMY
deX
-dgo
+htt
dhR
lKu
tmi
@@ -132622,9 +132544,9 @@ cHA
cjp
cKl
cLI
-cNh
-cNh
-cNh
+cNd
+cNd
+cNd
cNc
cTQ
cVI
@@ -132879,9 +132801,9 @@ cHB
cjp
cKj
cLI
-cNh
-cOO
-cQw
+cNd
+cNd
+cNd
cSf
cTR
cVP
@@ -133137,8 +133059,8 @@ caE
cKm
cLI
cNi
-cOP
-cQx
+cNd
+cNd
cSg
cTS
cVQ
@@ -133393,9 +133315,9 @@ cHB
cjp
cKk
cLI
-cNh
-cOQ
-cQy
+cNd
+cNd
+cNd
cSh
cTT
cVR
@@ -133650,9 +133572,9 @@ cHA
ceb
cKk
cLI
-cNh
-cNh
-cNh
+cNd
+cNd
+cNd
cNc
cTU
cVS
@@ -133915,7 +133837,7 @@ cTV
cVT
cXm
cZb
-cXm
+shc
dcu
ddV
cMY
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index a2e2d840b5..e32792718e 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -5314,10 +5314,6 @@
"alq" = (
/turf/closed/wall,
/area/maintenance/starboard)
-"alr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"als" = (
/obj/machinery/light{
dir = 8
@@ -11251,6 +11247,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"axN" = (
@@ -11354,17 +11353,21 @@
req_one_access_txt = "0"
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"axV" = (
/obj/structure/sign/warning/securearea{
pixel_y = 32
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axW" = (
/obj/structure/disposalpipe/segment,
@@ -11374,10 +11377,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axX" = (
/obj/machinery/light_switch{
@@ -11393,41 +11395,21 @@
/obj/structure/sign/warning/securearea{
pixel_y = 32
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 5
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"axY" = (
/turf/closed/wall/r_wall,
/area/engine/engineering)
-"axZ" = (
-/obj/structure/closet/firecloset,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"aya" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"ayc" = (
-/obj/structure/table/reinforced,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/clothing/mask/breath{
- pixel_x = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
-"aye" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
"ayf" = (
/obj/structure/closet/crate,
/obj/item/stack/sheet/glass{
@@ -11770,46 +11752,59 @@
dir = 1;
pixel_y = 2
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
/area/engine/engineering)
"ayT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"ayV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"ayW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"ayX" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"aza" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+"ayX" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"aza" = (
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"azb" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
@@ -11821,13 +11816,18 @@
},
/area/security/brig)
"azd" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aze" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-22"
@@ -12266,6 +12266,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -12455,13 +12458,20 @@
"aAo" = (
/obj/structure/closet/secure_closet/engineering_personal,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"aAp" = (
/obj/structure/closet/secure_closet/engineering_personal,
/obj/item/clothing/suit/hooded/wintercoat/engineering,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
/area/engine/engineering)
"aAr" = (
/obj/item/device/radio/intercom{
@@ -12474,15 +12484,12 @@
c_tag = "Engineering - Fore";
dir = 2
},
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/closet/secure_closet/engineering_personal,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aAt" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
@@ -12496,27 +12503,21 @@
sortType = 4
},
/obj/effect/landmark/start/station_engineer,
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aAv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aAw" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"aAx" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"aAz" = (
/obj/structure/table/wood,
@@ -12540,7 +12541,7 @@
id = "mining_home";
name = "mining shuttle bay";
width = 7;
- roundstart_template = /datum/map_template/shuttle/mining/box;
+ roundstart_template = /datum/map_template/shuttle/mining/box
},
/turf/open/space/basic,
/area/space)
@@ -12743,7 +12744,7 @@
id = "laborcamp_home";
name = "fore bay 1";
width = 9;
- roundstart_template = /datum/map_template/shuttle/labour/box;
+ roundstart_template = /datum/map_template/shuttle/labour/box
},
/turf/open/space/basic,
/area/space)
@@ -13134,18 +13135,14 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aBK" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBL" = (
@@ -13157,9 +13154,6 @@
},
/obj/machinery/rnd/circuit_imprinter,
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBM" = (
@@ -13169,9 +13163,6 @@
},
/obj/machinery/rnd/protolathe/department/engineering,
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBN" = (
@@ -13180,21 +13171,10 @@
dir = 1
},
/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aBO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"aBQ" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aBS" = (
/obj/item/stack/ore/silver,
@@ -13707,9 +13687,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aCV" = (
@@ -13719,38 +13696,29 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aCW" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"aCX" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aCY" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space)
"aCZ" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"aDa" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -14352,10 +14320,9 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aEo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -14378,31 +14345,16 @@
/obj/structure/cable/yellow{
icon_state = "2-8"
},
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aEq" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aEr" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Fore Port";
+ dir = 4;
+ network = list("singularity")
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"aEt" = (
/obj/structure/table,
@@ -14940,10 +14892,9 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 2
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aFw" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -14961,52 +14912,26 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aFz" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"aFA" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFB" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/rack,
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = -26;
+ req_access_txt = "11"
},
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/black,
+/obj/item/wrench,
+/obj/item/clothing/glasses/meson/engine,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFC" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aFD" = (
-/obj/structure/cable/white{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/meter,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/engine,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aFE" = (
/obj/structure/table/wood,
@@ -15753,10 +15678,9 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aGW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -15767,31 +15691,14 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aGY" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"aGZ" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "External Gas to Loop"
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"aHa" = (
-/obj/structure/cable/white,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aHb" = (
/obj/machinery/camera{
@@ -16196,6 +16103,9 @@
lootcount = 2;
name = "2maintenance loot spawner"
},
+/obj/machinery/light/small{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aHW" = (
@@ -16212,42 +16122,21 @@
dir = 8;
pixel_x = -24
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aHY" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aHZ" = (
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/item/tank/internals/emergency_oxygen/engi,
-/obj/effect/turf_decal/delivery,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aIc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plating,
-/area/engine/engineering)
"aIe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space,
+/area/space)
"aIf" = (
/obj/machinery/camera{
c_tag = "Auxillary Base Construction";
@@ -16924,34 +16813,13 @@
/obj/structure/table,
/obj/item/airlock_painter,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aJp" = (
-/obj/structure/table,
-/obj/effect/turf_decal/delivery,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/machinery/light{
- dir = 4
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aJu" = (
/turf/open/floor/plating,
/area/engine/engineering)
-"aJv" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"aJB" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -17398,12 +17266,6 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
-"aKA" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"aKB" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -17417,53 +17279,26 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aKF" = (
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_x = 24;
- req_access_txt = "10"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"aKG" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+/obj/structure/particle_accelerator/end_cap{
+ icon_state = "end_cap";
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"aKH" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Gas to Chamber";
- on = 0
+/obj/structure/particle_accelerator/fuel_chamber{
+ icon_state = "fuel_chamber";
+ dir = 4
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"aKI" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
+/obj/structure/particle_accelerator/power_box{
+ icon_state = "power_box";
+ dir = 4
},
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"aKL" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Mix Bypass";
- on = 0
- },
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"aKN" = (
/obj/machinery/door/poddoor{
@@ -18014,12 +17849,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/engine/engineering)
-"aMc" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"aMd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -18040,62 +17869,52 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"aMg" = (
-/obj/machinery/door/firedoor,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
},
-/turf/open/floor/plating,
/area/engine/engineering)
"aMh" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"aMi" = (
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
-"aMi" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- name = "Gas to Filter"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aMj" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"aMk" = (
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"aMm" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/particle_accelerator/control_box,
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1
+ },
+/turf/open/floor/plating,
/area/engine/engineering)
"aMo" = (
-/obj/structure/reflector/box/anchored{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"aMq" = (
/obj/structure/window/reinforced,
/turf/open/space,
@@ -18542,7 +18361,9 @@
maxcharge = 15000
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
+ },
/area/engine/engineering)
"aNr" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -18552,17 +18373,27 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"aNu" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Gas to Filter";
- on = 0
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Particle Accelerator";
+ dir = 1;
+ network = list("singularity")
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"aNv" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
"aNw" = (
/obj/structure/window/reinforced{
dir = 4
@@ -19226,10 +19057,9 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aOP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -19252,26 +19082,12 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aOR" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/closet/firecloset,
-/obj/effect/turf_decal/stripes/line{
+"aOS" = (
+/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aOS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/item/device/radio/intercom{
- freerange = 0;
- frequency = 1459;
- name = "Station Intercom (General)";
- pixel_y = 21
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space)
"aOT" = (
/obj/structure/window/reinforced{
dir = 4
@@ -19815,41 +19631,32 @@
icon_state = "2-8"
},
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 9
+ },
/area/engine/engineering)
"aPZ" = (
/obj/machinery/vending/tool,
/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aQa" = (
-/obj/structure/table,
-/obj/effect/turf_decal/delivery,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
},
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aQd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/structure/rack,
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "11"
},
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+/obj/item/storage/belt/utility,
+/obj/item/weldingtool,
+/obj/item/clothing/head/welding,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aQe" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"aQf" = (
/obj/structure/chair{
@@ -20454,19 +20261,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aRo" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aRp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -20478,9 +20275,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aRq" = (
@@ -20507,13 +20301,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"aRv" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"aRy" = (
/turf/closed/wall/r_wall,
/area/aisat)
@@ -20930,10 +20717,9 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
+/turf/open/floor/plasteel/yellow/side{
dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aSu" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -20962,9 +20748,7 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSx" = (
@@ -20975,36 +20759,39 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSz" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/item/pen,
+/obj/item/storage/belt/utility,
+/obj/item/clothing/glasses/meson,
+/obj/item/paper_bin{
+ layer = 2.9
},
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aSA" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/wiki/engineering_hacking{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 5
- },
-/turf/open/floor/engine,
+/obj/item/book/manual/wiki/engineering_construction,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/obj/item/device/flashlight,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"aSB" = (
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aSD" = (
@@ -21489,10 +21276,9 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
},
-/turf/open/floor/plasteel,
/area/engine/engineering)
"aTG" = (
/obj/structure/disposalpipe/segment{
@@ -21504,26 +21290,18 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aTH" = (
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/open/floor/plasteel,
+/obj/machinery/light,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aTI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -21534,9 +21312,6 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 2
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
@@ -21549,31 +21324,6 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"aTM" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aTN" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"aTO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aTQ" = (
@@ -22178,7 +21928,9 @@
"aUY" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 10
+ },
/area/engine/engineering)
"aUZ" = (
/obj/structure/disposalpipe/segment,
@@ -22189,8 +21941,8 @@
/obj/effect/turf_decal/bot{
dir = 1
},
-/turf/open/floor/plasteel{
- dir = 1
+/turf/open/floor/plasteel/yellow/side{
+ dir = 6
},
/area/engine/engineering)
"aVa" = (
@@ -22227,31 +21979,13 @@
dir = 4
},
/obj/structure/closet/secure_closet/engineering_electrical,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aVe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"aVf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"aVh" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"aVk" = (
/obj/structure/window/reinforced{
@@ -22791,8 +22525,10 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aWu" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/airlock/external{
+ name = "Escape Pod Four";
+ req_access = null;
+ req_access_txt = "32"
},
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -22880,18 +22616,16 @@
dir = 1
},
/area/engine/engineering)
-"aWH" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"aWK" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
+/obj/structure/cable/white{
+ icon_state = "2-4"
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aWL" = (
/obj/machinery/ai_status_display{
pixel_x = -32
@@ -23788,12 +23522,15 @@
/turf/closed/wall,
/area/security/checkpoint/engineering)
"aYx" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"aYy" = (
/obj/machinery/camera{
c_tag = "AI Chamber - Port";
@@ -32033,9 +31770,6 @@
dir = 6
},
/area/security/checkpoint/customs)
-"bpu" = (
-/turf/closed/wall/r_wall,
-/area/space/nearstation)
"bpv" = (
/obj/structure/sign/warning/securearea{
pixel_y = 32
@@ -35370,9 +35104,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/turf/open/floor/plating,
/area/maintenance/department/science/xenobiology)
"bvU" = (
@@ -38467,7 +38198,6 @@
/obj/machinery/atmospherics/pipe/simple/purple/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/space,
/area/space/nearstation)
"bCA" = (
@@ -41244,11 +40974,8 @@
/turf/open/floor/plasteel/bar,
/area/crew_quarters/bar)
"bIv" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"bIw" = (
/obj/machinery/light,
/obj/machinery/camera{
@@ -42921,10 +42648,6 @@
/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bMi" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bMj" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel,
@@ -46279,10 +46002,10 @@
/turf/closed/wall,
/area/maintenance/solars/port/aft)
"bTq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
},
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"bTr" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -46858,8 +46581,12 @@
},
/area/maintenance/starboard)
"bUw" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible,
-/turf/open/floor/plasteel/dark,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plating,
/area/engine/engineering)
"bUx" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -47346,7 +47073,6 @@
/turf/closed/wall,
/area/hallway/secondary/service)
"bVA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock{
name = "Service Hall";
req_access_txt = "null";
@@ -48106,6 +47832,9 @@
/obj/structure/cable/yellow{
icon_state = "2-4"
},
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"bXc" = (
@@ -57167,23 +56896,23 @@
},
/area/maintenance/port/aft)
"cpR" = (
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = -26;
+ req_access_txt = "11"
+ },
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 10
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Port";
- dir = 8;
- network = list("ss13","engine")
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/machinery/airalarm/engine{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"cpS" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -68169,15 +67898,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/aft)
-"cLE" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
- dir = 1;
- name = "euthanization chamber freezer";
- on = 1;
- target_temperature = 80
- },
-/turf/open/floor/plating,
-/area/science/xenobiology)
"cLF" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -71855,7 +71575,7 @@
"cTT" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"cUH" = (
/obj/structure/table/optable,
/turf/open/floor/plasteel/white,
@@ -72101,6 +71821,12 @@
},
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
+"cWu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"cWA" = (
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
@@ -72137,18 +71863,6 @@
/obj/structure/easel,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"cXz" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Aft";
- dir = 1;
- network = list("ss13","engine")
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"cXA" = (
/turf/closed/wall/r_wall,
/area/security/checkpoint/engineering)
@@ -72161,7 +71875,12 @@
},
/area/construction/mining/aux_base)
"cXI" = (
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"cXR" = (
@@ -72173,11 +71892,12 @@
},
/area/construction/mining/aux_base)
"cXZ" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/structure/window/reinforced{
- dir = 8
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
},
-/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard)
"cYc" = (
@@ -72197,8 +71917,9 @@
},
/area/science/robotics/lab)
"cYj" = (
-/obj/structure/closet/firecloset,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"cYE" = (
@@ -72326,9 +72047,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"cZv" = (
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
"cZR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/yellow{
@@ -72474,9 +72192,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
/obj/machinery/light/small{
dir = 1
},
@@ -72486,33 +72201,28 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"daR" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1;
- external_pressure_bound = 140;
- name = "server vent";
- pressure_checks = 0
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"daS" = (
/obj/structure/disposalpipe/segment,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"daW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
},
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+/area/maintenance/department/science/xenobiology)
+"daW" = (
+/obj/machinery/button/door{
+ id = "engpa";
+ name = "Engineering Chamber Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "11"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
"daX" = (
/obj/structure/cable/yellow{
@@ -72522,27 +72232,20 @@
icon_state = "platingdmg2"
},
/area/maintenance/port/fore)
-"daY" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"daZ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 1
+/obj/structure/particle_accelerator/particle_emitter/right{
+ icon_state = "emitter_right";
+ dir = 4
},
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"dbb" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/structure/particle_accelerator/particle_emitter/center{
+ icon_state = "emitter_center";
+ dir = 4
},
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/turf/open/floor/plating,
+/area/engine/engineering)
"dbd" = (
/obj/structure/sink/kitchen{
pixel_y = 28
@@ -72555,30 +72258,6 @@
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
-"dbg" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dbh" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"dbj" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -72664,17 +72343,10 @@
"dbv" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/small,
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
-"dbw" = (
-/obj/machinery/camera{
- c_tag = "Xenobiology Lab - Kill Chamber";
- dir = 1;
- network = list("ss13","rd","xeno");
- start_active = 1
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
},
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dbE" = (
/obj/machinery/plantgenes,
/obj/effect/turf_decal/stripes/line{
@@ -73081,15 +72753,18 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcm" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/effect/turf_decal/stripes/line{
- dir = 9
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
@@ -73113,7 +72788,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
@@ -73183,9 +72857,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/structure/chair/comfy/black{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line{
dir = 10
},
@@ -73200,9 +72871,6 @@
/area/science/xenobiology)
"dcx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/chair/comfy/black{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line{
dir = 6
},
@@ -73280,18 +72948,13 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcJ" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/extinguisher{
- pixel_x = 4;
- pixel_y = 3
- },
-/obj/item/extinguisher,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcK" = (
@@ -73717,11 +73380,8 @@
},
/obj/structure/chair,
/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"ddy" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
@@ -73729,9 +73389,8 @@
/area/maintenance/department/science/xenobiology)
"ddz" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/plating,
-/area/science/xenobiology)
+/turf/closed/wall/r_wall,
+/area/maintenance/department/science/xenobiology)
"ddA" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
@@ -73741,23 +73400,15 @@
opacity = 0;
req_access_txt = "55"
},
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
-"ddB" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
- dir = 1;
- external_pressure_bound = 120;
- name = "server vent"
- },
-/turf/open/floor/circuit/killroom,
-/area/science/xenobiology)
+/turf/closed/wall/r_wall,
+/area/maintenance/department/science/xenobiology)
"ddC" = (
/obj/structure/disposalpipe/trunk{
dir = 1
},
/obj/structure/disposaloutlet,
/turf/open/floor/plating/airless,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"ddE" = (
/obj/effect/landmark/start/cook,
/obj/machinery/holopad,
@@ -73775,16 +73426,12 @@
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
"ddO" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"ddP" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -73798,41 +73445,10 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"ddS" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 4;
- network = list("ss13","engine")
- },
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = -26
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddT" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddU" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"ddV" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"ddW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "2-4"
},
@@ -73845,28 +73461,14 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"ddY" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/engineering)
"ddZ" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dea" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- volume_rate = 200
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
/turf/open/floor/plating/airless,
-/area/engine/engineering)
+/area/space)
"deb" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -73874,644 +73476,153 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"ded" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dee" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"def" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"deh" = (
-/obj/structure/cable/white{
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dei" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dej" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dek" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "Mix to Gas"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"del" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/space,
+/area/space)
"dem" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Gas to Mix"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"den" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dep" = (
-/obj/machinery/firealarm{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"deq" = (
-/obj/item/device/radio/intercom{
- freerange = 0;
- frequency = 1459;
- name = "Station Intercom (General)";
- pixel_y = 21
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"der" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"des" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deu" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dev" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dew" = (
-/obj/machinery/door/firedoor,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Laser Room";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dex" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dey" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deA" = (
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deB" = (
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "1-2"
},
+/turf/open/space,
+/area/space)
+"den" = (
/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deC" = (
-/obj/effect/turf_decal/bot{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"der" = (
+/obj/structure/closet/secure_closet/engineering_welding,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
-"deD" = (
-/obj/machinery/status_display,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"deI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deK" = (
-/obj/structure/cable/white,
-/obj/machinery/power/emitter/anchored{
- dir = 2;
+"dev" = (
+/obj/machinery/field/generator{
+ anchored = 1;
state = 2
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deL" = (
-/obj/structure/cable/white,
-/obj/machinery/light{
- dir = 4
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"dew" = (
+/turf/open/space,
+/area/space/nearstation)
+"deB" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engpa";
+ name = "Engineering Chamber Shutters"
},
-/turf/open/floor/plating,
-/area/engine/engineering)
-"deM" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"deN" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deO" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
+/turf/open/floor/plasteel,
/area/engine/engineering)
-"deS" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable,
-/obj/structure/window/plasma/reinforced,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"deU" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"deD" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/turf/open/floor/plating/airless,
+/area/space)
+"deM" = (
+/obj/structure/table,
+/obj/effect/turf_decal/delivery,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
/obj/machinery/light{
dir = 4
},
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
/area/engine/engineering)
"deV" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"deW" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 4;
- network = list("ss13","engine")
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"deX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space)
"deY" = (
-/obj/structure/reflector/single/anchored{
- dir = 9
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/engine/engineering)
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"dfa" = (
-/obj/machinery/power/supermatter_shard/crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dfb" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfc" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfe" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dff" = (
-/obj/structure/reflector/double/anchored{
- dir = 5
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfg" = (
-/obj/structure/reflector/single/anchored{
- dir = 10
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plating,
/area/engine/engineering)
"dfh" = (
-/obj/structure/sign/warning/nosmoking,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dfi" = (
-/obj/effect/turf_decal/stripes/line{
+/obj/structure/table,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/storage/belt/utility,
+/obj/item/storage/belt/utility,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 10
+ },
+/turf/open/floor/plasteel/yellow/side{
dir = 4
},
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
/area/engine/engineering)
-"dfj" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dfk" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dfm" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"dfp" = (
-/obj/effect/turf_decal/bot{
+/obj/structure/closet/firecloset,
+/turf/open/floor/plasteel/yellow/side{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfq" = (
-/obj/machinery/camera{
- c_tag = "Supermatter Chamber";
- dir = 4;
- network = list("engine")
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
-"dft" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- filter_type = "n2"
- },
-/turf/open/floor/engine,
/area/engine/engineering)
"dfz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfA" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfB" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 1;
- state = 2
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfC" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/machinery/power/emitter/anchored{
- dir = 1;
- state = 2
- },
-/obj/machinery/light{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
+/area/space)
"dfD" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/book/manual/engineering_singularity_safety{
+ pixel_x = 3;
+ pixel_y = 3
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/item/book/manual/wiki/engineering_guide,
+/obj/item/book/manual/engineering_particle_accelerator{
+ pixel_x = -3;
+ pixel_y = -3
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfE" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfF" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/meter,
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/open/floor/engine,
+/obj/item/clothing/gloves/color/yellow,
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"dfI" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Cooling Loop Bypass"
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfJ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfM" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"dfO" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/space)
"dfP" = (
/obj/structure/cable/white{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Atmos to Loop"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfQ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfR" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Gas to Cold Loop";
- on = 1
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfS" = (
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfT" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Cold Loop to Gas";
- on = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dfV" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dfW" = (
-/obj/item/wrench,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"dfX" = (
/obj/structure/disposalpipe/segment,
@@ -74529,137 +73640,82 @@
},
/area/engine/engineering)
"dfY" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dfZ" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel/yellow/side,
/area/engine/engineering)
"dga" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "2-8"
},
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"dgb" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/closed/wall/r_wall,
+/turf/open/floor/plating/airless,
/area/engine/engineering)
"dgc" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
+/obj/item/clothing/gloves/color/rainbow,
+/obj/item/clothing/head/soft/rainbow,
+/obj/item/clothing/shoes/sneakers/rainbow,
+/obj/item/clothing/under/color/rainbow,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
},
-/turf/open/floor/plating,
/area/maintenance/starboard)
"dgd" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dge" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgf" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/cable/white{
+ icon_state = "0-2"
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/emitter{
+ anchored = 1;
+ dir = 1;
+ icon_state = "emitter";
+ state = 2
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgg" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgh" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"dgi" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
-/area/maintenance/starboard)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgj" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/structure/grille,
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgk" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgm" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
-"dgo" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"dgp" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
-"dgr" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgt" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgu" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/turf/open/space,
-/area/space/nearstation)
-"dgv" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
-"dgw" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dgz" = (
/obj/structure/closet/toolcloset,
/obj/effect/turf_decal/delivery,
@@ -74667,134 +73723,13 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"dgA" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgB" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
+/obj/machinery/light{
+ dir = 4
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"dgI" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgJ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgK" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgM" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
-/turf/open/space,
-/area/space/nearstation)
-"dgN" = (
-/obj/structure/lattice,
-/obj/structure/grille,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgO" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dgS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/lattice/catwalk,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/transit_tube/horizontal,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dha" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dhc" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/space,
-/area/space/nearstation)
-"dhe" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhg" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine";
- on = 0
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhi" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/door/window/northleft{
- dir = 8;
- icon_state = "left";
- name = "Inner Pipe Access";
- req_access_txt = "24"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"dhj" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"dhk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"dhl" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/space,
+/turf/closed/wall/mineral/plastitanium,
/area/space/nearstation)
"dhn" = (
/obj/structure/table,
@@ -75813,26 +74748,18 @@
/turf/open/space,
/area/science/xenobiology)
"djt" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/engine/supermatter)
+/area/engine/engineering)
"djx" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Aft Port";
+ dir = 4;
+ network = list("singularity")
},
-/obj/item/crowbar,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/turf/open/floor/plating,
-/area/engine/supermatter)
+/obj/machinery/power/grounding_rod,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"djz" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
@@ -75870,7 +74797,7 @@
id = "arrivals_stationary";
name = "arrivals";
width = 7;
- roundstart_template = /datum/map_template/shuttle/arrival/box;
+ roundstart_template = /datum/map_template/shuttle/arrival/box
},
/turf/open/space/basic,
/area/space)
@@ -75892,12 +74819,11 @@
/turf/open/floor/plating,
/area/chapel/main)
"dlI" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dlN" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/supermatter)
+/obj/structure/closet/secure_closet/engineering_electrical,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"dlV" = (
/turf/closed/wall/r_wall,
/area/maintenance/department/science/xenobiology)
@@ -75905,9 +74831,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/machinery/door/airlock/research{
glass = 1;
name = "Slime Euthanization Chamber";
@@ -75918,7 +74841,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dmr" = (
/obj/machinery/door/airlock/research{
glass = 1;
@@ -75930,7 +74853,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
+/area/maintenance/department/science/xenobiology)
"dmD" = (
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
@@ -76108,6 +75031,14 @@
icon_state = "platingdmg2"
},
/area/maintenance/port/fore)
+"drT" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"dsg" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -76148,6 +75079,13 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"dtL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space,
+/area/space)
"dtP" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -76481,46 +75419,24 @@
/turf/closed/wall,
/area/engine/gravity_generator)
"dBw" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBx" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dBy" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"dBz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"dBB" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/engine,
+/turf/open/floor/plating,
/area/engine/engineering)
+"dBy" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"dBB" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"dBC" = (
/obj/machinery/meter,
/obj/structure/grille,
@@ -77200,6 +76116,23 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
+"dPf" = (
+/obj/structure/cable/white{
+ icon_state = "1-4"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"dPp" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/light,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"dYu" = (
/obj/machinery/door/airlock/external{
name = "Auxiliary Airlock"
@@ -77209,6 +76142,19 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/entry)
+"dZD" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/space)
+"eln" = (
+/turf/open/space/basic,
+/area/engine/engineering)
+"enN" = (
+/obj/effect/landmark/event_spawn,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"eoK" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -77241,6 +76187,17 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"esV" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"evy" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -77251,6 +76208,25 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"eEu" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"eFN" = (
/obj/structure/bodycontainer/crematorium{
id = "crematoriumChapel";
@@ -77281,12 +76257,48 @@
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
/area/engine/engineering)
+"fjy" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/space)
+"foU" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/computer/security/telescreen{
+ desc = "Used for watching the Engine.";
+ dir = 8;
+ layer = 4;
+ name = "Engine Monitor";
+ network = list("singularity");
+ pixel_x = 30
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
"fDD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"fGs" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"fWO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"gfh" = (
/obj/machinery/libraryscanner,
/turf/open/floor/plasteel/white,
@@ -77309,6 +76321,14 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"goZ" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"gEk" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -77334,6 +76354,14 @@
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
+"gKb" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Fore Starboard";
+ dir = 8;
+ network = list("singularity")
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"gLC" = (
/obj/structure/reagent_dispensers/water_cooler,
/turf/open/floor/plasteel,
@@ -77366,6 +76394,9 @@
},
/turf/open/floor/plating,
/area/security/prison)
+"hWU" = (
+/turf/open/floor/plating/airless,
+/area/space)
"ioI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -77393,6 +76424,41 @@
},
/turf/open/floor/plasteel/whitepurple,
/area/science/lab)
+"iOa" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/maintenance/starboard)
+"iTS" = (
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/gloves/color/yellow,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/effect/turf_decal/delivery,
+/obj/structure/table,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
+"iYY" = (
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/engine/engineering)
+"jjF" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"jot" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/department/science/xenobiology)
"jwW" = (
/turf/closed/wall/mineral/plastitanium,
/area/crew_quarters/fitness/recreation)
@@ -77423,6 +76489,21 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+"jFx" = (
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard)
+"jIV" = (
+/obj/structure/closet/secure_closet/engineering_personal,
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"jKK" = (
/obj/machinery/door/airlock/external{
req_access_txt = "13"
@@ -77432,6 +76513,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
+"jYQ" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"kfu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/white,
@@ -77537,6 +76624,14 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"lHL" = (
+/turf/open/space/basic,
+/area/space/nearstation)
+"lLj" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 8
+ },
+/area/engine/engineering)
"lMz" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
@@ -77578,6 +76673,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"moI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"mvj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -77587,6 +76688,12 @@
},
/turf/closed/wall,
/area/hallway/secondary/service)
+"mwK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"mzh" = (
/obj/machinery/firealarm{
dir = 1;
@@ -77615,6 +76722,30 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/science/circuit)
+"nte" = (
+/obj/machinery/the_singularitygen/tesla,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
+"nwU" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Containment Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"nyo" = (
/obj/structure/cable/yellow{
icon_state = "1-4"
@@ -77649,10 +76780,33 @@
},
/turf/open/floor/plasteel,
/area/construction/storage/wing)
+"nKh" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 1
+ },
+/area/engine/engineering)
"obb" = (
/obj/structure/target_stake,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"obN" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/space,
+/area/space)
+"ocj" = (
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"ocT" = (
/obj/machinery/light{
dir = 1
@@ -77767,6 +76921,13 @@
dir = 2
},
/area/crew_quarters/locker)
+"pWF" = (
+/obj/effect/decal/cleanable/oil,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"qnJ" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -77797,6 +76958,12 @@
"qBq" = (
/turf/closed/wall/mineral/plastitanium,
/area/hallway/secondary/entry)
+"qJG" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"qJZ" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -77820,6 +76987,18 @@
dir = 1
},
/area/science/lab)
+"rEi" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"rFx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/engine/engineering)
"rQK" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -77839,6 +77018,29 @@
/obj/machinery/vending/snack/random,
/turf/open/floor/plasteel,
/area/science/mixing)
+"rTo" = (
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
+"rVX" = (
+/obj/structure/particle_accelerator/particle_emitter/left{
+ icon_state = "emitter_left";
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"rWa" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/yellow/side,
+/area/engine/engineering)
"sdi" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -77875,6 +77077,21 @@
"sJW" = (
/turf/closed/wall/mineral/plastitanium,
/area/engine/break_room)
+"sOW" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/space)
+"sSU" = (
+/turf/closed/wall/r_wall,
+/area/space)
+"tdB" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg2"
+ },
+/area/maintenance/starboard/fore)
"tjH" = (
/obj/structure/table/reinforced,
/obj/machinery/computer/libraryconsole/bookmanagement,
@@ -77896,22 +77113,19 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"tDM" = (
-/obj/machinery/door/airlock/engineering/glass{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/item/wrench,
+/turf/open/floor/plating,
+/area/engine/engineering)
"tFJ" = (
/obj/structure/bodycontainer/morgue{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/medical/morgue)
+"tMT" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/engine/engineering)
"tVY" = (
/obj/structure/closet/crate,
/obj/item/target/alien,
@@ -77962,6 +77176,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard)
+"uQo" = (
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
"uRM" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -77990,10 +77209,30 @@
},
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"vmz" = (
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/space)
+"vAk" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"vLD" = (
/obj/structure/lattice,
/turf/open/space/basic,
/area/space)
+"vSl" = (
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"wiZ" = (
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
@@ -78044,11 +77283,39 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"xcM" = (
+/obj/structure/closet/firecloset,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/yellow/side{
+ dir = 4
+ },
+/area/engine/engineering)
+"xfK" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/power/tesla_coil,
+/turf/open/floor/plating/airless,
+/area/space)
"xkG" = (
/obj/item/device/integrated_electronics/wirer,
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"xqB" = (
+/obj/structure/cable/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/power/emitter{
+ anchored = 1;
+ state = 2
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xse" = (
/obj/machinery/door/airlock/external{
name = "Solar Maintenance";
@@ -78080,6 +77347,19 @@
/obj/structure/chair/comfy,
/turf/open/floor/plasteel,
/area/science/misc_lab)
+"xLP" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/space,
+/area/space)
+"xNI" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"xVl" = (
/turf/closed/wall,
/area/hallway/secondary/service)
@@ -78090,6 +77370,24 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"xWZ" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/structure/grille,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
+"yeY" = (
+/obj/machinery/camera/emp_proof{
+ c_tag = "Containment - Aft Starboard";
+ dir = 8;
+ network = list("singularity")
+ },
+/turf/open/floor/plating/airless,
+/area/space)
"ygk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -110961,7 +110259,7 @@ cRi
cRi
cRi
daP
-cLE
+cTA
dlV
aaa
aaa
@@ -111218,10 +110516,10 @@ daF
daJ
cRi
bvT
-cRi
-cRi
-cRi
-cRi
+dlV
+dlV
+dlV
+dlV
aaa
aai
aaa
@@ -111475,10 +110773,10 @@ cSn
cSn
cRi
dmq
-cRi
-cZv
-cZv
-cRi
+dlV
+ddj
+ddj
+dlV
aaf
aag
aaa
@@ -111733,9 +111031,9 @@ cSn
cRi
ddx
ddz
-daR
-cZv
-cRe
+ddj
+ddj
+jot
aaa
aaa
aaa
@@ -112247,9 +111545,9 @@ daK
cRi
bIv
ddz
-ddB
-cZv
-cRe
+ddj
+ddj
+jot
aaa
aaf
aaa
@@ -112503,10 +111801,10 @@ cSn
daN
cRi
dmr
-cRi
-cZv
-dbw
-cRi
+dlV
+ddj
+ddj
+dlV
aaa
aag
aaa
@@ -112760,10 +112058,10 @@ daI
daM
cRi
cTA
-cRi
-cRi
-cRi
-cRi
+dlV
+dlV
+dlV
+dlV
aaf
aag
aaa
@@ -118297,12 +117595,12 @@ aFu
aBI
aBI
aJn
-aCO
-aFq
+lLj
+lLj
aNq
aBI
aPZ
-aRo
+aSB
aSu
aTG
aUZ
@@ -118543,7 +117841,7 @@ arJ
arI
dnh
dqu
-doh
+tdB
axO
axY
aAo
@@ -118553,12 +117851,12 @@ aEn
aFv
aGV
aHX
-aEi
-aKA
-aMc
-aEi
+aBO
+aBO
+aBO
+aBO
aOO
-aEi
+aBO
aRp
aSv
aTH
@@ -119060,7 +118358,7 @@ avt
awJ
axS
axY
-aCO
+jIV
ddW
aCT
aEp
@@ -119320,18 +118618,18 @@ axY
aAr
ddX
aCU
-aEq
-aTO
+aCW
+aBO
aGX
-aHZ
-aJp
-aTO
+aBO
+aBO
+aBO
aSB
-aTO
-aOR
-aQa
+aBO
+aBO
+aBO
aGX
-aTO
+aBK
aTK
aVd
aBI
@@ -119574,23 +118872,23 @@ avv
axY
axU
ayS
-dCk
-ddY
+enN
+ddX
deb
-deh
-aFz
-aCZ
+aBO
+aBO
+iTS
deM
-axY
-aCZ
+uQo
+foU
aMg
-aCZ
+xcM
dfh
-deM
-aCZ
-aFz
-deh
-aVe
+aBO
+aBO
+aBK
+dPp
+rFx
axY
aYu
aYu
@@ -119834,21 +119132,21 @@ ddP
aAt
aBL
deb
-dei
+aBO
aFA
+axY
+axY
deB
-deB
-deB
-deB
+axY
aMh
-deB
-deB
-deB
-deB
+axY
+axY
+nKh
+aBO
aSz
-aTM
+aTK
aVe
-apc
+aJu
aYu
aZL
bbB
@@ -120091,21 +119389,21 @@ aAu
ddQ
aBM
aCV
-aEr
+aBO
aFB
-aGY
+axY
daW
dBw
-aKF
+dBw
aMi
cpR
-dfi
+axY
aQd
-dBA
+aBO
aSA
-aTN
-aVf
-apc
+aTK
+aVe
+aJu
aYu
aZM
bbC
@@ -120348,21 +119646,21 @@ ayV
aAv
aBN
aCW
-aEr
-aFC
+aBO
+aFA
aGZ
-aGZ
-dlI
+qJG
+aJu
aKG
-aMj
+aJu
dBy
-dlI
-aQe
-aRv
+aGZ
+nKh
+aBO
dfD
-aTN
-aVe
-apc
+aTK
+rWa
+aJu
aYu
aZN
bbD
@@ -120603,23 +119901,23 @@ axY
axY
ayW
bTq
+dgA
+aBO
aBO
-aCX
-dej
aFC
-deC
-deC
-dlI
+axY
+qJG
+aJu
aKH
aMk
aNu
-dlI
+axY
dfp
-dfp
-dfE
+aBO
+dgA
dfP
dfY
-dgc
+axY
aYu
cXA
cXA
@@ -120857,30 +120155,30 @@ ath
ajb
avA
axY
-axZ
+axY
ayX
-ddS
-bUw
-aCY
-dek
+axY
+axY
+aBO
+aBO
der
-deD
-dlI
-aJv
+axY
+qJG
+aJu
aKI
tDM
-dfb
-dfj
+dBy
+axY
dlI
-deD
-dfF
-aTN
-aVe
-aWH
-dgi
+aBO
+axY
+axY
+ayX
+axY
+atm
dgc
-aqq
-aqr
+alq
+apc
aWu
bif
bif
@@ -121114,29 +120412,29 @@ ati
ajb
avB
axY
-ddO
+jYQ
bUw
-ddT
-ddZ
-ded
-del
-des
+aJu
+axY
+axY
+axY
+axY
djt
-daY
+qJG
daZ
dbb
-aMk
-aNv
-dfk
-dfq
+rVX
+dBy
djt
-dfG
-dfQ
-dfZ
-apc
-apc
-dgo
-apc
+axY
+axY
+axY
+aJu
+bUw
+iYY
+axY
+alq
+alq
cXZ
atm
bfZ
@@ -121371,31 +120669,31 @@ ajb
ajb
avC
axY
-aya
-bUw
-ddU
-aBQ
-dee
+axY
+eEu
+axY
+axY
+ddO
aEr
-des
+ddO
djt
-daY
-daZ
-dbb
+qJG
+aJu
+rEi
dfa
aNv
-dfk
-daY
+djt
+ddO
djx
-dfG
-cXz
-aVe
-atm
-alr
-dgp
+axY
+axY
+nwU
+axY
+axY
+alq
cXI
cYj
-atm
+iOa
bga
big
bga
@@ -121414,7 +120712,7 @@ bFS
bHy
bIV
bKC
-bMi
+bAQ
bNU
bMg
bQV
@@ -121628,31 +120926,31 @@ dps
dpL
avD
axY
+axY
+xNI
+ddO
+ddO
+ddO
+ddO
ddO
-bUw
-ddV
-aBQ
-dee
-aEr
-aKL
djt
-daY
-deS
-dbb
-aMk
-aNv
-dfm
-daY
djt
-dbg
-dfR
+djt
+aRm
+djt
+djt
+djt
+ddO
+ddO
+ddO
+ddO
dga
dgd
dgj
-dgp
-alr
-atm
atm
+alq
+jFx
+iOa
bgb
cTu
bgb
@@ -121671,8 +120969,8 @@ bFT
bHz
bIW
bKD
-dhe
-dhg
+bCi
+bCi
bPu
bPu
bPu
@@ -121887,28 +121185,28 @@ avE
axY
ayc
aza
-aAw
-bUw
+ddO
+aaa
aCY
dem
-aFD
+dem
+deD
+deD
deD
-dlI
-dlI
deV
-dlN
-dfc
-dlI
-dlI
-deD
+dem
+dem
+dem
+dem
+dem
dfI
-dfS
-aVh
-aaf
+aaa
+ddO
+ddO
aYx
-dgr
-dgw
-dgA
+sSU
+lHL
+lMJ
dgI
bgb
cTi
@@ -121929,7 +121227,7 @@ bHy
bIX
bKE
bKE
-dhh
+bKE
bPv
bKE
bKE
@@ -122139,34 +121437,34 @@ apn
aqy
arT
apm
-dnS
+vAk
avB
axY
-axY
-bTq
+goZ
+ddO
aAx
-aBO
+sOW
aIe
aOS
-deu
-deI
-deN
-deI
-deW
-aMm
-dfd
-deN
-dft
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
+mwK
dBB
-dbh
-dfT
-aVh
-aaa
+aIe
+sOW
+cWu
+ddO
aYx
-dgf
-dgj
-ack
-dgJ
+sSU
+lMJ
+lMJ
+lHL
bgb
bij
bgb
@@ -122186,7 +121484,7 @@ bHA
bIY
bKF
bMk
-dhi
+bNV
bPw
bQW
bSj
@@ -122399,31 +121697,31 @@ atk
aux
avF
dqT
-dqT
-aaf
-ack
-dea
-aIc
-den
+esV
+xqB
+aAx
+aaa
+aIe
+dZD
+dev
+aav
+aav
+dev
+lMJ
+aaa
+aav
+aav
dev
-deJ
-deO
-deU
-deX
-dBx
-dfe
-dBz
-dfu
dfz
-dfJ
-dfU
-dga
+aIe
+aaa
+cWu
dge
azd
-azd
-azd
-dgB
-dgK
+sSU
+lMJ
+lMJ
+lHL
aaa
cUL
aaa
@@ -122443,7 +121741,7 @@ bHB
bIZ
bKG
bMl
-dhj
+bKG
bIZ
bKG
bMl
@@ -122656,31 +121954,31 @@ atl
auy
dnS
dqT
-dqT
-aaf
-ack
-ack
+fGs
+ddO
+aAx
+sOW
def
aCZ
-dew
-aCZ
-axY
-axY
-aCZ
-aCZ
-aCZ
-axY
-axY
-aCZ
-dew
-aCZ
-aVe
-dgf
-dgk
-dgt
-dgk
-dgv
-dgJ
+aav
+aav
+aav
+vLD
+aaf
+aaa
+aav
+aav
+aav
+xfK
+obN
+sOW
+cWu
+ddO
+dgg
+sSU
+lMJ
+lHL
+lHL
anT
aaf
aaf
@@ -122700,7 +121998,7 @@ bza
bJa
bza
bFX
-dhk
+bza
bJa
bza
bFX
@@ -122912,52 +122210,52 @@ apm
apm
dnh
dnS
-dnz
dqT
+xWZ
+dPf
+aAx
+aaa
+aIe
+dZD
+aav
+aav
+aaa
+aaa
aaf
-aaf
-aaf
-def
-ddZ
-dex
-aJu
-ddZ
-ddZ
-ddZ
-aMo
-dff
-ddZ
-ddZ
-aJu
-dex
-ddZ
-aVe
+aaa
+aaa
+aav
+aav
+dfz
+aIe
+aaa
+cWu
aWK
dgk
-dgt
-dgk
-dgB
-dgM
-dgN
-dgO
-dgO
-dgw
-dgO
-dgS
-dgO
-dgO
-dgw
-dgw
-dgw
-dgw
+sSU
+lMJ
+lHL
+lHL
+anT
+dew
+dew
+aaf
+dew
+bpw
+dew
+dew
+aaf
+aaf
+aaf
+aaf
bCz
-dgw
-dha
-dgw
-dhc
-dgw
-dha
-dhl
+aaf
+bFY
+aaf
+bJb
+aaf
+bFY
+aaf
bJb
aaf
bFY
@@ -123170,31 +122468,31 @@ dnh
auz
dqp
dqT
-dqT
+axY
+fGs
+aAx
+vmz
+def
+aCZ
aaa
aaa
aaa
-bTq
-dep
-dey
-aHa
ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-ddZ
-dfA
-dfM
-dfV
-dgb
+cDu
+fWO
+aaa
+vLD
+dev
+xfK
+obN
+vmz
+cWu
dgg
-azd
-azd
-azd
-dgv
-aaf
+axY
+sSU
+lMJ
+lHL
+lHL
anT
aaa
aaa
@@ -123427,30 +122725,30 @@ dni
auA
dnS
dqT
-aaa
-aaa
-aaa
-aaa
axY
-deq
-dey
-deK
-ddZ
-ddZ
-ddZ
+fGs
+ddO
+sOW
+aIe
+dZD
+lMJ
+aaf
+aaf
+den
+nte
aMo
-ddZ
-ddZ
-ddZ
-dfB
-dfM
-dfW
+aaf
+aaf
+lMJ
+dfz
+aIe
+sOW
+ddO
+dgg
axY
-aWK
-dgk
-dgt
-dgk
-dgB
+sSU
+lMJ
+lHL
aaa
anT
aaa
@@ -123684,31 +122982,31 @@ dnh
auB
avG
dqT
-aaa
-aaa
-aaa
-aaa
axY
-aJu
-deA
-deL
-aJu
-aJu
+fGs
+aAx
+vmz
+def
+aCZ
+dev
+vLD
+aaa
+fjy
deY
+moI
+aaa
+aaa
+aaa
+xfK
+obN
+vmz
+cWu
+dgg
axY
-dfg
-aJu
-aJu
-dfC
-dfO
-ddZ
-axY
-dgh
-dgk
-dgk
-dgk
-dgv
-aaf
+sSU
+lMJ
+lHL
+lHL
anT
aaa
aaa
@@ -123941,30 +123239,30 @@ dnh
dnh
jKK
dqT
+ocj
+rTo
+aAx
+aaa
+aIe
+dZD
+aav
+aav
+aaa
+aaa
aaf
aaa
aaa
+aav
+aav
+dfz
+aIe
aaa
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-axY
-aWK
+cWu
+jjF
dgm
-dgu
-dgm
-dgB
+sSU
+lMJ
+lHL
aaa
anT
aaa
@@ -124198,31 +123496,31 @@ atn
bOY
avG
dqT
-aaf
-aaa
-aaa
+fGs
+ddO
+aAx
+sOW
+dtL
+aCZ
+aav
+aav
aaa
aaa
aaf
+vLD
aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaf
-ack
-ack
-aye
-dgv
-aye
-dgv
-aaf
+aav
+aav
+xfK
+xLP
+sOW
+pWF
+ddO
+dgg
+sSU
+lMJ
+lHL
+lHL
anT
aaf
aaf
@@ -124455,29 +123753,29 @@ dnh
dnh
lNZ
dqT
-aaf
+drT
+xqB
+aAx
+aaa
+vmz
+dZD
+dev
+aav
aaa
aaa
+lMJ
+dev
+aav
+aav
+dev
+dfz
+vmz
aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaa
-aaf
-aaa
-aaf
-aaa
-aaf
-aaa
-aaa
-aaf
-aaf
-aaf
-aaa
-aaa
-aaf
+cWu
+dge
+vSl
+sSU
+lMJ
aaa
aaa
aaf
@@ -124712,29 +124010,29 @@ aaa
aaf
ack
dqT
-aaf
-anT
-anT
-anT
-anT
-aaf
-anT
-anT
-anT
-anT
-anT
-anT
-aqB
-anT
-anT
-anT
-anT
-anT
-anT
-aaf
-aaa
-aaa
-aaf
+axY
+axY
+ddO
+hWU
+hWU
+gKb
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+hWU
+yeY
+hWU
+hWU
+ddO
+axY
+axY
+sSU
+lMJ
aaa
aaa
aaf
@@ -124969,29 +124267,29 @@ aaf
aaf
ack
aaf
-aaa
-aaa
-aaa
-aaf
-aaa
-aaa
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-bpu
-aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+sSU
+lMJ
aaa
aaa
aaa
@@ -125225,30 +124523,30 @@ aaa
aaa
aaa
aaa
+vLD
aaa
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+axY
+eln
+tMT
aaa
-aaa
-aaa
-aaf
-aaf
-aaf
-anT
-anT
-anT
-anT
-aqB
-anT
-anT
-anT
-anT
-aqB
-aaf
-aaf
-aaf
-aaf
-aaa
-aaf
-aaf
+lHL
+lMJ
aaa
aaa
aaa
@@ -125482,7 +124780,7 @@ aaa
aaa
aaa
aaa
-aaa
+vLD
aaa
aaa
aaa
@@ -125739,26 +125037,26 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
+vLD
aaf
aai
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index d1c0b770dd..6bf52ab60a 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -8933,16 +8933,6 @@
dir = 4
},
/area/bridge)
-"axf" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor/preopen{
- id = "bridgespace";
- name = "bridge external shutters"
- },
-/turf/open/floor/plasteel/vault{
- dir = 8
- },
-/area/bridge)
"axg" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel/dark,
@@ -12234,11 +12224,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"aEY" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"aEZ" = (
/obj/structure/sink{
dir = 8;
@@ -12942,6 +12927,11 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aGW" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aGX" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -15026,6 +15016,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMq" = (
@@ -15033,6 +15026,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMr" = (
@@ -15040,6 +15036,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMs" = (
@@ -15049,6 +15048,9 @@
/obj/structure/sign/poster/official/random{
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMt" = (
@@ -15063,6 +15065,9 @@
c_tag = "Cargo Warehouse";
dir = 2
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMu" = (
@@ -15070,6 +15075,9 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMv" = (
@@ -15083,6 +15091,9 @@
pixel_x = 26
},
/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aMw" = (
@@ -15649,6 +15660,9 @@
/obj/structure/sign/poster/official/random{
pixel_x = -32
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aNO" = (
@@ -16155,6 +16169,9 @@
"aOY" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aOZ" = (
@@ -16542,6 +16559,9 @@
req_access_txt = "31"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/floorgrime,
/area/quartermaster/warehouse)
"aQd" = (
@@ -17040,6 +17060,14 @@
/area/quartermaster/sorting)
"aRl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/power/apc/highcap/fifteen_k{
+ dir = 4;
+ name = "Delivery Office APC";
+ pixel_x = 28
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"aRm" = (
@@ -17057,6 +17085,9 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/delivery,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aRo" = (
@@ -17434,6 +17465,9 @@
"aSh" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/quartermaster/sorting)
"aSi" = (
@@ -17447,6 +17481,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aSj" = (
@@ -17825,6 +17862,9 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/office)
"aTi" = (
@@ -17839,6 +17879,9 @@
departmentType = 2;
pixel_y = 32
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aTj" = (
@@ -17851,6 +17894,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aTl" = (
@@ -22032,8 +22078,7 @@
},
/area/maintenance/department/cargo)
"bdA" = (
-/obj/item/cigbutt,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/droneDispenser,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"bdB" = (
@@ -26568,12 +26613,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"bpp" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
-/area/science/xenobiology)
"bpq" = (
/obj/structure/sign/warning/electricshock,
/turf/closed/wall/r_wall,
@@ -27772,9 +27811,6 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"brQ" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/machinery/camera{
c_tag = "Xenobiology Port";
dir = 8;
@@ -28377,7 +28413,7 @@
/turf/open/floor/plasteel/white,
/area/science/explab)
"btj" = (
-/obj/machinery/droneDispenser,
+/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/science/explab)
"btk" = (
@@ -28566,11 +28602,11 @@
/turf/open/floor/plating,
/area/science/xenobiology)
"btD" = (
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"btE" = (
/obj/effect/decal/remains/xeno,
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"btF" = (
/obj/structure/chair{
@@ -29191,12 +29227,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/camera{
- c_tag = "Xenobiology Kill Room";
- dir = 8;
- network = list("ss13","rd")
- },
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating,
/area/science/xenobiology)
"bva" = (
/turf/closed/wall,
@@ -31263,16 +31294,22 @@
/turf/open/floor/plasteel/whitepurple/side,
/area/science/xenobiology)
"bzi" = (
-/obj/item/extinguisher{
- pixel_x = 4;
- pixel_y = 3
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/item/extinguisher,
/obj/structure/table/glass,
-/turf/open/floor/plasteel/whitepurple/side,
+/obj/item/extinguisher,
+/obj/item/extinguisher{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/extinguisher{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
/area/science/xenobiology)
"bzj" = (
-/obj/structure/reagent_dispensers/watertank,
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
@@ -31280,6 +31317,7 @@
pixel_x = 32;
receive_ore_updates = 1
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel/whitepurple/side,
/area/science/xenobiology)
"bzk" = (
@@ -32314,6 +32352,9 @@
/area/crew_quarters/heads/hor)
"bBw" = (
/obj/machinery/computer/security,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/red/side{
dir = 8
},
@@ -36419,6 +36460,14 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/hallway/primary/aft)
+"bKN" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/preopen{
+ id = "prison release";
+ name = "prisoner processing blast door"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/brig)
"bKO" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/door/poddoor/preopen{
@@ -38108,6 +38157,7 @@
},
/obj/item/stack/sheet/glass,
/obj/item/stack/rods/fifty,
+/obj/item/pipe_dispenser,
/turf/open/floor/plasteel/yellow/side,
/area/engine/atmos)
"bOY" = (
@@ -40916,9 +40966,6 @@
/obj/structure/table/reinforced,
/obj/item/clipboard,
/obj/item/lighter,
-/obj/item/clothing/glasses/meson{
- pixel_y = 4
- },
/obj/item/stamp/ce,
/obj/item/stock_parts/cell/high/plus,
/obj/machinery/keycard_auth{
@@ -40933,6 +40980,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel/yellow/side{
dir = 4
},
@@ -42850,10 +42898,7 @@
},
/obj/effect/turf_decal/stripes/line,
/obj/item/airlock_painter,
-/obj/item/clothing/glasses/meson{
- pixel_x = 3;
- pixel_y = -4
- },
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cap" = (
@@ -43188,11 +43233,11 @@
"cbe" = (
/obj/item/pen,
/obj/item/storage/belt/utility,
-/obj/item/clothing/glasses/meson,
/obj/item/paper_bin{
layer = 2.9
},
/obj/structure/table/glass,
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cbf" = (
@@ -43279,7 +43324,7 @@
/obj/structure/table,
/obj/item/clothing/gloves/color/yellow,
/obj/item/storage/belt/utility,
-/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson/engine,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cbo" = (
@@ -43728,6 +43773,9 @@
/obj/item/stack/sheet/mineral/plasma{
amount = 30
},
+/obj/item/device/gps{
+ gpstag = "ENG0"
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"ccS" = (
@@ -45129,9 +45177,6 @@
icon_state = "0-8"
},
/obj/machinery/power/tesla_coil,
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"chz" = (
@@ -45139,9 +45184,6 @@
icon_state = "0-4"
},
/obj/machinery/power/tesla_coil,
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
/turf/open/floor/plating/airless,
/area/engine/engineering)
"chA" = (
@@ -45249,16 +45291,6 @@
/obj/structure/grille,
/turf/open/floor/plating/airless,
/area/engine/engineering)
-"chQ" = (
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
"chR" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -45412,14 +45444,13 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"cit" = (
-/obj/machinery/the_singularitygen,
+/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"ciu" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/the_singularitygen/tesla,
/turf/open/floor/plating/airless,
/area/space/nearstation)
"civ" = (
@@ -49350,6 +49381,18 @@
dir = 1
},
/area/library/lounge)
+"cyr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = 29
+ },
+/turf/open/floor/plasteel/red/side{
+ dir = 1
+ },
+/area/security/brig)
"cyy" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -49952,26 +49995,6 @@
/obj/machinery/power/rad_collector,
/turf/open/floor/plating,
/area/engine/engineering)
-"cBR" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/item/tank/internals/plasma,
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
-"cBS" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/obj/machinery/power/rad_collector/anchored,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
"cBT" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
/turf/open/floor/plating/airless,
@@ -50094,18 +50117,25 @@
"cDa" = (
/turf/closed/wall,
/area/quartermaster/warehouse)
-"dse" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
+"dTw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
-"dMB" = (
+/turf/open/floor/carpet,
+/area/library)
+"ecV" = (
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"eHp" = (
/turf/closed/wall,
/area/crew_quarters/cryopod)
+"eIE" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/library/lounge)
"eJt" = (
/obj/machinery/computer/cryopod{
pixel_y = 24
@@ -50119,29 +50149,43 @@
},
/turf/open/floor/plasteel/darkpurple,
/area/crew_quarters/cryopod)
-"fwl" = (
+"fki" = (
/obj/structure/disposalpipe/segment{
- dir = 4
+ dir = 6
},
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
-"fWv" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/plasteel/dark,
-/area/library/lounge)
-"ick" = (
+"frt" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
-/area/library)
-"ijF" = (
+/turf/open/floor/plasteel,
+/area/quartermaster/office)
+"fyh" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/carpet,
/area/library)
+"fID" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/sorting)
+"izp" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/preopen{
+ id = "Engineering";
+ name = "engineering security door"
+ },
+/turf/open/floor/plating,
+/area/security/checkpoint/engineering)
"izB" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod"
@@ -50151,7 +50195,7 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
-"iKb" = (
+"iCc" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/quartermaster/sorting)
@@ -50178,31 +50222,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library)
-"jvi" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
- },
-/turf/open/floor/plasteel/darkred/side{
- dir = 1
- },
-/area/crew_quarters/heads/hos)
-"jFO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet,
-/area/library/lounge)
-"jXh" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/library/lounge)
"jZg" = (
/obj/machinery/cryopod,
/turf/open/floor/plasteel/darkpurple,
@@ -50234,6 +50253,24 @@
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/AIsatextAP)
+"kqj" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"krG" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/library)
+"let" = (
+/turf/closed/wall/r_wall,
+/area/space)
"lqy" = (
/obj/machinery/door/airlock/centcom{
name = "Library"
@@ -50243,37 +50280,64 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
-"lAs" = (
-/turf/closed/wall,
-/area/quartermaster/sorting)
-"lQQ" = (
-/obj/machinery/door/poddoor/preopen{
- id = "bridgespace";
- name = "bridge external shutters"
- },
-/turf/open/floor/plasteel/vault{
- dir = 8
- },
-/area/bridge)
-"mdL" = (
-/obj/structure/table,
-/obj/item/stock_parts/matter_bin,
-/obj/item/stock_parts/matter_bin,
-/obj/item/stock_parts/micro_laser,
-/obj/item/stock_parts/micro_laser,
-/obj/item/stack/cable_coil,
-/obj/item/stack/cable_coil,
-/turf/open/floor/plasteel/whitepurple/side,
-/area/science/lab)
-"mCe" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "Engineering";
- name = "engineering security door"
- },
+"lvl" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/item/cigbutt,
/turf/open/floor/plating,
-/area/security/checkpoint/engineering)
-"mKc" = (
+/area/maintenance/department/cargo)
+"mHo" = (
+/obj/structure/table,
+/obj/machinery/microwave{
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = 27
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/crew_quarters/kitchen)
+"mLe" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/turf/open/floor/plasteel/darkred/side{
+ dir = 1
+ },
+/area/crew_quarters/heads/hos)
+"nuB" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet,
+/area/library/lounge)
+"nJY" = (
+/obj/structure/rack,
+/obj/item/stack/sheet/glass/fifty{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
+"opC" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "Library APC";
+ pixel_x = 24
+ },
+/obj/structure/cable,
+/turf/open/floor/plasteel/dark,
+/area/library)
+"oJF" = (
/obj/structure/bookcase/random/nonfiction,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
@@ -50300,16 +50364,6 @@
"pps" = (
/turf/closed/wall,
/area/engine/break_room)
-"pXc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/carpet,
-/area/library)
-"qOE" = (
-/turf/open/floor/plasteel/dark,
-/area/library/lounge)
"qWK" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -50322,30 +50376,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"rxV" = (
-/obj/structure/table,
-/obj/machinery/microwave{
- pixel_x = -3;
- pixel_y = 6
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = 27
- },
-/turf/open/floor/plasteel/cafeteria,
-/area/crew_quarters/kitchen)
-"sBA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = 29
- },
-/turf/open/floor/plasteel/red/side{
- dir = 1
- },
-/area/security/brig)
+"sHK" = (
+/obj/structure/bookcase/random/religion,
+/turf/open/floor/plasteel/dark,
+/area/library/lounge)
"sQt" = (
/obj/machinery/door/airlock/external{
name = "Supply Dock Airlock";
@@ -50368,6 +50402,10 @@
},
/turf/open/floor/plasteel/darkpurple,
/area/crew_quarters/cryopod)
+"tez" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/carpet,
+/area/library/lounge)
"tjW" = (
/obj/machinery/light{
dir = 8
@@ -50379,6 +50417,15 @@
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
+"ufi" = (
+/turf/open/floor/plasteel/dark,
+/area/library/lounge)
+"urZ" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/library)
"uyt" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -50415,36 +50462,32 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library)
-"wxJ" = (
-/obj/effect/turf_decal/delivery,
+"vTA" = (
/obj/machinery/door/poddoor/preopen{
- id = "prison release";
- name = "prisoner processing blast door"
+ id = "bridgespace";
+ name = "bridge external shutters"
},
-/turf/open/floor/plasteel/dark,
-/area/security/brig)
-"xhj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
-/area/library/lounge)
-"xja" = (
-/obj/machinery/light/small{
- dir = 4
+/turf/open/floor/plasteel/vault{
+ dir = 8
},
-/obj/machinery/power/apc{
- dir = 4;
- name = "Library APC";
- pixel_x = 24
- },
-/obj/structure/cable,
-/turf/open/floor/plasteel/dark,
-/area/library)
-"xjc" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plasteel/dark,
-/area/library)
+/area/bridge)
+"xzr" = (
+/turf/closed/wall,
+/area/quartermaster/sorting)
+"yhZ" = (
+/obj/structure/table,
+/obj/item/stock_parts/matter_bin,
+/obj/item/stock_parts/matter_bin,
+/obj/item/stock_parts/micro_laser,
+/obj/item/stock_parts/micro_laser,
+/obj/item/stack/cable_coil,
+/obj/item/stack/cable_coil,
+/turf/open/floor/plasteel/whitepurple/side,
+/area/science/lab)
+"yia" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
(1,1,1) = {"
aaa
@@ -68110,13 +68153,13 @@ cgG
cfn
ckE
ckT
-xhj
-xhj
+tez
+tez
cwK
-xhj
-xhj
+tez
+tez
cxn
-xhj
+tez
lqy
cxC
cxK
@@ -68368,12 +68411,12 @@ cvw
cvK
cwg
cjR
-jFO
+nuB
ckF
-jFO
+nuB
cxe
-jFO
-jFO
+nuB
+nuB
cxz
cxD
cxL
@@ -68381,8 +68424,8 @@ cxY
cym
cyA
vOw
-ijF
-pXc
+fyh
+dTw
ckm
ckm
ckm
@@ -68628,7 +68671,7 @@ cwr
clm
ckG
cwU
-jXh
+eIE
ckU
cwe
cwe
@@ -68639,7 +68682,7 @@ cxM
cyB
cjp
cyR
-ick
+urZ
ckH
ckH
ckH
@@ -68882,10 +68925,10 @@ cvy
cvL
cwe
cwe
-fWv
-qOE
+sHK
+ufi
ckV
-qOE
+ufi
cln
cwe
cfN
@@ -68896,7 +68939,7 @@ aaa
aaa
cjp
cyS
-ick
+urZ
cyZ
ckH
czo
@@ -69139,10 +69182,10 @@ cvc
cvM
cfm
cwe
-fWv
-qOE
-mKc
-qOE
+sHK
+ufi
+oJF
+ufi
cln
cwe
caS
@@ -69153,7 +69196,7 @@ aht
aht
cjp
cko
-ick
+urZ
ckH
ckH
clp
@@ -69410,7 +69453,7 @@ aaa
aaa
cjp
cyT
-ick
+urZ
cyZ
ckH
czp
@@ -69667,8 +69710,8 @@ aht
aht
cjp
cjp
-xjc
-xja
+krG
+opC
ckH
czq
czw
@@ -70574,7 +70617,7 @@ aok
aoO
apF
apE
-wxJ
+bKN
apE
bBW
ajM
@@ -73914,7 +73957,7 @@ anJ
amX
aoY
apN
-sBA
+cyr
arp
asB
atB
@@ -74701,7 +74744,7 @@ aDv
aBh
aBh
aGd
-aEY
+aGW
aHG
aIM
aJG
@@ -77251,7 +77294,7 @@ akW
alK
amw
ani
-jvi
+mLe
aiR
aph
ajM
@@ -79160,8 +79203,8 @@ bXk
bXk
bXk
bXk
-aaa
-aaa
+bXk
+let
aaa
aaa
aaa
@@ -79416,9 +79459,9 @@ chR
cgt
cjT
ckq
+ckq
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -79673,9 +79716,9 @@ chS
cfV
cgS
cfV
+cfV
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -79858,7 +79901,7 @@ aRN
aWa
aRN
aRN
-rxV
+mHo
aYS
cpn
bch
@@ -79929,10 +79972,10 @@ cfV
cfV
cfV
cgT
+cfV
ckr
bXk
-aaa
-aaa
+let
aaa
aaa
aaa
@@ -80179,17 +80222,17 @@ cfU
cgu
cgU
chw
-cBR
-chw
-chw
+cgU
chw
+cgU
chw
+cgU
cjs
cfV
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80436,17 +80479,17 @@ cfV
cgv
cfV
chx
-chQ
+cfV
chx
-chQ
+cfV
chx
-chQ
+cfV
chx
cfV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80694,16 +80737,16 @@ cgv
cgV
bBW
bBW
-aaa
cgV
+aht
aaa
bBW
bBW
cgV
cfV
-bTE
-abI
-abI
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -80951,16 +80994,16 @@ cgv
bBW
bBW
bBW
-aaa
+yia
abI
aaa
bBW
bBW
bBW
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81215,9 +81258,9 @@ aaa
bBW
bBW
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81469,12 +81512,12 @@ cii
cis
ciG
aaa
-aaa
-aaa
+yia
+cgV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81719,7 +81762,7 @@ cfd
cfw
cfW
cgw
-cgV
+aht
abI
abI
cij
@@ -81727,11 +81770,11 @@ cit
ciH
abI
abI
-cgV
+aht
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -81976,8 +82019,8 @@ cfe
cfx
cfa
cgv
-aaa
-aaa
+cgV
+yia
aaa
cik
ciu
@@ -81986,9 +82029,9 @@ aaa
aaa
aaa
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82243,9 +82286,9 @@ aaa
bBW
bBW
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82495,14 +82538,14 @@ bBW
aaa
aaa
abI
-aaa
+yia
aaa
bBW
bBW
cfV
-bTE
-aaa
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82733,7 +82776,7 @@ bUi
bUV
bVO
bWA
-mCe
+izp
bYj
bYQ
bZA
@@ -82751,15 +82794,15 @@ cgV
bBW
aaa
aaa
+aht
cgV
-aaa
bBW
bBW
cgV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
aaa
aaa
aaa
@@ -82990,7 +83033,7 @@ bUj
bUW
bVP
bWB
-mCe
+izp
bYk
bYQ
bZA
@@ -83006,17 +83049,17 @@ cfV
cgv
cfV
chz
-cBS
+cfV
chz
-cBS
+cfV
chz
-cBS
+cfV
chz
cfV
cfV
-bTE
-abI
-abI
+cfV
+bXk
+let
abI
abI
aaa
@@ -83172,9 +83215,9 @@ ahi
atY
auU
atY
-lQQ
+vTA
ayf
-axf
+vTA
aAF
aBz
aCP
@@ -83247,7 +83290,7 @@ bUk
bUX
bVQ
bWC
-mCe
+izp
bYl
bYO
bZC
@@ -83263,17 +83306,17 @@ cfU
cgx
cgU
chA
+cgU
chA
+cgU
chA
-chA
-chA
-chA
+cgU
cjt
cfV
cfV
-bTE
-abI
-aaa
+cfV
+bXk
+let
abI
aaa
aaa
@@ -83527,10 +83570,10 @@ cfV
cfV
cfV
cgY
+cfV
cks
bXk
-abI
-aaa
+let
aaa
aaa
aaa
@@ -83785,9 +83828,9 @@ chO
cfV
cgZ
cfV
+cfV
bXk
-abI
-abI
+let
abI
aaa
aaa
@@ -84042,9 +84085,9 @@ chP
cgt
cjU
ckq
+ckq
bXk
-abI
-aaa
+let
aaa
aaa
aaa
@@ -84299,9 +84342,9 @@ bXk
bXk
bXk
bXk
+bXk
ckJ
-abI
-aaa
+let
aaa
aaa
aaa
@@ -85021,7 +85064,7 @@ bsT
bus
bvz
bxg
-mdL
+yhZ
bAs
bBu
bCI
@@ -85752,7 +85795,7 @@ aBI
aES
aBI
aBI
-aEY
+aGW
aHG
aBI
aJX
@@ -85775,7 +85818,7 @@ aMb
aSX
aMb
aBI
-aEY
+aGW
bgA
bhe
aDZ
@@ -87058,7 +87101,7 @@ aVu
bat
aLf
bcy
-aKq
+lvl
aEj
aEj
bgC
@@ -87555,13 +87598,13 @@ eHp
aHN
aIU
aJI
-lAs
-lAs
+xzr
+xzr
aNG
aOR
-iKb
-lAs
-lAs
+iCc
+xzr
+xzr
aTb
aOT
aVp
@@ -87572,7 +87615,7 @@ aPY
bav
aLf
aFi
-aFi
+nJY
beI
bfv
bgE
@@ -87812,7 +87855,7 @@ aET
aHN
aIU
aJI
-lAs
+xzr
aMg
aNH
aOS
@@ -88069,11 +88112,11 @@ aET
aHN
aJh
bhe
-lAs
+xzr
aMh
aNI
-fwl
-dMB
+fID
+ecV
aRi
aSf
aTd
@@ -88326,13 +88369,13 @@ aHn
aIi
aJi
aKe
-lAs
+xzr
aMi
aNJ
-fwl
+fID
aPZ
aRj
-lAs
+xzr
aTe
aUo
aVs
@@ -88583,13 +88626,13 @@ aET
aHN
aIU
aJI
-lAs
+xzr
aMj
aNK
-fwl
-dMB
-dMB
-iKb
+fID
+ecV
+ecV
+iCc
aTf
aUp
aVt
@@ -88840,7 +88883,7 @@ aET
aHN
aIU
aJI
-lAs
+xzr
aMk
aNL
aOU
@@ -89097,10 +89140,10 @@ cos
coy
aJj
aJI
-lAs
+xzr
aMl
aNM
-dse
+fki
aQb
aRl
aSh
@@ -89354,14 +89397,14 @@ aDZ
aDZ
aJk
aJH
-lAs
+xzr
aMm
-lAs
+xzr
aOW
-lAs
-lAs
-lAs
-aSY
+xzr
+xzr
+xzr
+frt
aUs
aLf
aLf
@@ -89604,18 +89647,18 @@ aAP
avk
aDg
aEc
-aEY
+aGW
cot
aBI
aBI
aBI
aJl
aKf
-lAs
+xzr
aMn
-lAs
+xzr
aOX
-lAs
+xzr
aRm
aLg
aTi
@@ -89875,7 +89918,7 @@ cDa
cDa
cDa
aLg
-aTj
+kqj
aUu
aVx
aVx
@@ -93238,7 +93281,7 @@ bkE
aht
bnd
boh
-bpp
+bpn
bqx
brQ
btr
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 284898d6d9..3c5da1dcf9 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -8,7 +8,7 @@
/area/space/nearstation)
"ac" = (
/turf/open/space,
-/area/space)
+/area/space/nearstation)
"ad" = (
/turf/closed/wall/r_wall,
/area/maintenance/department/bridge)
@@ -85,6 +85,9 @@
icon_state = "2-8"
},
/obj/machinery/camera/autoname,
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"ar" = (
@@ -176,13 +179,13 @@
/turf/open/space,
/area/space/nearstation)
"aC" = (
-/obj/machinery/door/airlock,
/obj/structure/cable{
icon_state = "4-8"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/engine/engineering)
"aD" = (
@@ -294,7 +297,8 @@
/obj/item/device/flashlight{
pixel_y = 5
},
-/obj/item/airlock_painter,
+/obj/item/storage/toolbox/syndicate,
+/obj/item/stock_parts/cell/infinite,
/turf/open/floor/plating,
/area/engine/engineering)
"aT" = (
@@ -387,6 +391,7 @@
"bd" = (
/obj/structure/table,
/obj/item/weldingtool/experimental,
+/obj/item/inducer,
/turf/open/floor/plating,
/area/engine/engineering)
"be" = (
@@ -396,7 +401,7 @@
/turf/open/floor/plating,
/area/engine/engineering)
"bf" = (
-/obj/structure/closet/secure_closet/engineering_chief,
+/obj/machinery/suit_storage_unit/captain,
/turf/open/floor/plating,
/area/engine/engineering)
"bg" = (
@@ -466,14 +471,14 @@
/area/engine/engineering)
"bp" = (
/obj/machinery/light,
-/obj/item/storage/box/lights/mixed,
-/obj/item/device/lightreplacer,
+/obj/structure/tank_dispenser,
/turf/open/floor/plating,
/area/engine/engineering)
"bq" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
},
+/obj/machinery/light,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"br" = (
@@ -514,7 +519,7 @@
/area/engine/engineering)
"by" = (
/turf/closed/wall/r_wall,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"bz" = (
/obj/machinery/light{
dir = 8
@@ -523,7 +528,7 @@
/area/maintenance/department/bridge)
"bA" = (
/turf/closed/wall/r_wall,
-/area/hallway/primary/central)
+/area/science)
"bB" = (
/obj/machinery/power/apc{
dir = 8;
@@ -538,28 +543,32 @@
locked = 0;
pixel_y = 23
},
-/obj/structure/closet/jcloset,
+/obj/machinery/autolathe/hacked,
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"bC" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"bD" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
+/obj/machinery/robotic_fabricator,
+/obj/machinery/light{
+ dir = 1
+ },
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"bE" = (
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bF" = (
-/obj/structure/closet/secure_closet/CMO,
+/obj/machinery/computer/rdconsole/core,
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"bG" = (
/obj/machinery/airalarm{
frequency = 1439;
@@ -578,12 +587,6 @@
dir = 8
},
/area/bridge)
-"bH" = (
-/obj/structure/table,
-/obj/item/ammo_box/c10mm,
-/obj/item/gun/ballistic,
-/turf/open/floor/plasteel,
-/area/bridge)
"bI" = (
/obj/structure/table,
/turf/open/floor/plasteel,
@@ -624,26 +627,36 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bP" = (
-/obj/machinery/vending/cigarette,
+/obj/item/storage/box/beakers,
+/obj/item/storage/box/syringes,
+/obj/structure/table,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/obj/item/reagent_containers/syringe,
+/obj/machinery/airalarm{
+ frequency = 1439;
+ locked = 0;
+ pixel_y = 23
+ },
/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"bQ" = (
-/obj/machinery/vending/coffee,
+/obj/machinery/chem_master,
/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"bR" = (
-/obj/machinery/vending/cola,
/obj/machinery/camera/autoname,
+/obj/machinery/chem_heater,
/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"bS" = (
-/obj/machinery/vending/snack,
+/obj/machinery/chem_dispenser,
/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"bT" = (
-/obj/machinery/computer/arcade,
+/obj/machinery/chem_dispenser/scp_294,
/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"bU" = (
/obj/machinery/airalarm{
frequency = 1439;
@@ -657,33 +670,33 @@
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/structure/closet/firecloset/full,
+/mob/living/carbon/human,
/turf/open/floor/plasteel/arrival{
dir = 9
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"bV" = (
/obj/machinery/light{
dir = 1
},
-/obj/structure/closet/emcloset,
+/mob/living/carbon/human,
/turf/open/floor/plasteel/arrival{
dir = 1
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"bW" = (
-/obj/structure/closet/secure_closet/hos,
/obj/machinery/camera/autoname,
+/mob/living/carbon/human,
/turf/open/floor/plasteel/arrival{
dir = 1
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"bX" = (
-/obj/structure/closet/emcloset,
+/obj/machinery/sleeper,
/turf/open/floor/plasteel/arrival{
dir = 1
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"bY" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -700,25 +713,25 @@
icon_state = "2-4"
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"cb" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"cc" = (
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"cd" = (
-/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/door/airlock,
/turf/open/floor/plating,
/area/bridge)
"ce" = (
@@ -747,13 +760,13 @@
},
/area/bridge)
"ch" = (
-/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
icon_state = "4-8"
},
/obj/structure/cable{
icon_state = "2-4"
},
+/obj/machinery/door/airlock,
/turf/open/floor/plating,
/area/bridge)
"ci" = (
@@ -761,8 +774,11 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"cj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -771,13 +787,14 @@
icon_state = "1-8"
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"ck" = (
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
-/area/hallway/secondary/entry)
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/medical/medbay)
"cl" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -785,23 +802,25 @@
/turf/open/floor/plasteel/arrival{
dir = 8
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cm" = (
/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cn" = (
/obj/machinery/door/airlock,
/turf/open/floor/plating,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"co" = (
/obj/machinery/light{
dir = 4
},
+/obj/structure/closet/syndicate/resources/everything,
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/science)
"cp" = (
/obj/machinery/light,
/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/structure/closet/secure_closet/engineering_chief,
/turf/open/floor/plasteel/blue/side{
dir = 10
},
@@ -811,6 +830,7 @@
/area/bridge)
"cr" = (
/obj/machinery/light,
+/obj/structure/closet/secure_closet/hos,
/turf/open/floor/plasteel/blue/side{
dir = 6
},
@@ -827,12 +847,12 @@
dir = 8
},
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"cu" = (
/turf/open/floor/plasteel/arrival{
dir = 8
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cv" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
@@ -844,16 +864,16 @@
"cx" = (
/obj/machinery/door/airlock/public/glass,
/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cy" = (
/obj/effect/turf_decal/loading_area{
dir = 8
},
/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cz" = (
/turf/open/floor/plating,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -893,23 +913,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/blue/corner{
- dir = 1
- },
-/area/hallway/primary/central)
+/turf/closed/wall/r_wall,
+/area/medical/chemistry)
"cF" = (
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plasteel,
-/area/hallway/primary/central)
+/area/medical/chemistry)
"cG" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/closed/wall/r_wall,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cH" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -917,43 +933,26 @@
/turf/open/floor/plasteel/arrival{
dir = 8
},
-/area/hallway/secondary/entry)
-"cI" = (
-/obj/structure/table,
-/obj/item/storage/fancy/donut_box,
-/turf/open/floor/plasteel/arrival{
- dir = 8
- },
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cJ" = (
-/obj/structure/table,
-/obj/item/storage/fancy/donut_box,
+/obj/item/gun/magic/staff/healing,
+/obj/item/gun/magic/wand/resurrection,
/turf/open/floor/plasteel/arrival{
dir = 10
},
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cK" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/rods/fifty,
-/obj/machinery/light,
+/obj/machinery/dna_scannernew,
/turf/open/floor/plasteel/arrival,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cL" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -3;
- pixel_y = 7
- },
+/obj/machinery/computer/cloning,
/turf/open/floor/plasteel/arrival,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cM" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular,
-/obj/item/storage/firstaid/regular,
-/obj/item/device/healthanalyzer,
+/obj/machinery/clonepod,
/turf/open/floor/plasteel/arrival,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
"cN" = (
/turf/closed/wall/r_wall,
/area/construction)
@@ -1267,29 +1266,14 @@
"dO" = (
/obj/structure/table,
/obj/machinery/light,
-/obj/item/twohanded/fireaxe,
-/obj/item/extinguisher,
-/turf/open/floor/plasteel,
-/area/storage/primary)
-"dP" = (
-/obj/structure/table,
-/obj/item/device/lightreplacer,
+/obj/item/storage/firstaid,
/turf/open/floor/plasteel,
/area/storage/primary)
"dQ" = (
/obj/structure/table,
-/obj/item/storage/box/lights/mixed,
-/obj/item/storage/box/lights/tubes,
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/storage/primary)
-"dR" = (
-/obj/structure/table,
-/obj/item/device/flashlight{
- pixel_y = 5
- },
-/turf/open/floor/plasteel,
-/area/storage/primary)
"dS" = (
/obj/machinery/atmospherics/components/unary/tank/air,
/obj/machinery/camera/autoname,
@@ -1342,32 +1326,228 @@
/obj/machinery/camera/autoname{
dir = 1
},
+/obj/item/gun/magic/wand/resurrection,
/turf/open/floor/plasteel,
/area/storage/primary)
-"pI" = (
+"ei" = (
+/obj/machinery/light,
+/obj/machinery/computer/operating,
+/turf/open/floor/plasteel,
+/area/maintenance/department/bridge)
+"fT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/science)
+"gd" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science)
+"gY" = (
+/turf/open/floor/plasteel,
+/area/science)
+"hD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/power/apc{
+ dir = 1;
+ pixel_y = 25
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"jb" = (
/obj/machinery/door/airlock,
+/turf/open/floor/plasteel,
+/area/science)
+"jU" = (
+/obj/structure/table,
+/obj/item/melee/transforming/energy/axe,
+/turf/open/floor/plasteel,
+/area/storage/primary)
+"kk" = (
+/obj/structure/table/optable,
+/turf/open/floor/plasteel,
+/area/maintenance/department/bridge)
+"kn" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"kQ" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 1;
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"lK" = (
+/obj/effect/landmark/observer_start,
+/turf/open/floor/plating,
+/area/storage/primary)
+"ny" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/syndicate,
+/turf/open/floor/plasteel,
+/area/storage/primary)
+"oV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"pA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/science)
+"pI" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
-/area/hallway/secondary/entry)
-"Qt" = (
+/area/medical/medbay)
+"pQ" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"vv" = (
/obj/machinery/door/airlock,
+/turf/open/floor/plating,
+/area/storage/primary)
+"vP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/public/glass,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"wb" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/blue/side{
+ dir = 1
+ },
+/area/hallway/primary/central)
+"wS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ frequency = 1439;
+ locked = 0;
+ pixel_y = 23
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
+"wT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"BB" = (
+/obj/item/storage/backpack/duffelbag/syndie/surgery,
+/obj/structure/table,
+/obj/item/disk/surgery/debug,
+/turf/open/floor/plasteel,
+/area/medical/medbay)
+"BD" = (
+/obj/structure/closet/secure_closet/CMO,
+/turf/open/floor/plasteel/blue/side,
+/area/bridge)
+"BG" = (
+/obj/structure/table,
+/obj/item/ammo_box/c10mm,
+/obj/item/gun/ballistic/automatic/pistol,
+/turf/open/floor/plasteel,
+/area/bridge)
+"Ce" = (
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"Ct" = (
+/obj/item/disk/tech_disk/debug,
+/turf/open/floor/plasteel,
+/area/science)
+"CV" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
+"If" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/science)
+"In" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/closed/wall/r_wall,
+/area/science)
+"Iy" = (
+/obj/structure/closet/secure_closet/RD,
+/turf/open/floor/plasteel/blue/side,
+/area/bridge)
+"JE" = (
+/obj/machinery/door/airlock,
+/turf/open/floor/plating,
+/area/hallway/primary/central)
+"NZ" = (
+/obj/machinery/rnd/protolathe,
+/turf/open/floor/plasteel,
+/area/science)
+"Qt" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
-/area/hallway/secondary/entry)
+/area/medical/medbay)
+"Ut" = (
+/obj/structure/closet/secure_closet/medical3,
+/turf/open/floor/plasteel,
+/area/medical/medbay)
+"Vg" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"WT" = (
-/obj/machinery/door/airlock,
/obj/structure/cable{
icon_state = "4-8"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/engine/engineering)
+"Xg" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/medical/chemistry)
(1,1,1) = {"
aa
@@ -2038,12 +2218,12 @@ ah
ah
ah
bA
-bZ
-bZ
-bZ
-bZ
-bZ
+gd
+gd
bA
+bZ
+bZ
+JE
cN
cN
cN
@@ -2093,9 +2273,9 @@ bj
bs
bB
ca
-bO
-bO
-bO
+If
+In
+kn
bO
bO
cO
@@ -2147,9 +2327,9 @@ bk
bt
bC
cb
-bN
-bN
-bC
+fT
+pA
+kQ
bN
bN
cP
@@ -2201,8 +2381,8 @@ bl
ah
bD
cc
-bE
-bE
+gY
+jb
cA
bE
bE
@@ -2253,10 +2433,10 @@ aO
bc
bm
ah
-bE
+NZ
cc
-bE
-bE
+Ct
+gd
cA
bE
bE
@@ -2310,8 +2490,8 @@ ah
bF
cc
co
-bE
-cA
+bA
+wS
bE
bE
cN
@@ -2353,7 +2533,7 @@ aa
ab
ac
ad
-ad
+bY
ah
ah
ah
@@ -2437,7 +2617,7 @@ dn
dZ
cN
af
-ad
+bY
ac
ab
aa
@@ -2469,7 +2649,7 @@ aQ
ai
ab
bv
-bH
+bI
cf
cq
bv
@@ -2491,7 +2671,7 @@ dn
dL
cN
af
-ad
+bY
ac
ab
aa
@@ -2523,9 +2703,9 @@ aR
ai
ab
bv
-bI
+BG
cf
-cq
+BD
bu
dU
bE
@@ -2545,7 +2725,7 @@ dn
dL
cN
af
-ad
+bY
ac
ab
aa
@@ -2599,7 +2779,7 @@ dn
dL
cN
af
-ad
+bY
ac
ab
aa
@@ -2633,7 +2813,7 @@ ac
bv
bK
cf
-cq
+Iy
bu
cD
bE
@@ -2653,7 +2833,7 @@ dn
dL
cN
af
-ad
+bY
ac
ab
aa
@@ -2707,7 +2887,7 @@ do
dM
cN
af
-ad
+bY
ac
ab
aa
@@ -2743,7 +2923,7 @@ bM
cg
cr
bu
-cD
+wb
bE
bE
cS
@@ -2761,7 +2941,7 @@ cS
cS
cS
af
-ad
+bY
ac
ab
aa
@@ -2785,7 +2965,7 @@ aa
ab
ac
ad
-ad
+bY
aj
aj
WT
@@ -2815,7 +2995,7 @@ dp
dl
cS
af
-ad
+bY
ac
ab
aa
@@ -2847,10 +3027,10 @@ aS
bd
bo
bw
-bN
+hD
ci
ct
-bN
+wT
cF
bN
bN
@@ -2869,7 +3049,7 @@ dl
dl
cS
af
-ad
+bY
ac
ab
aa
@@ -2901,11 +3081,11 @@ aT
be
be
bx
-bO
+CV
cj
-bE
-bE
-cA
+Ce
+Ce
+oV
bE
bE
cS
@@ -2923,7 +3103,7 @@ dc
dc
cS
af
-ad
+bY
ac
ab
aa
@@ -2956,10 +3136,10 @@ bf
bp
aj
bP
-cc
-bE
-bE
-cA
+pQ
+Ce
+Ce
+oV
bE
bE
cS
@@ -2974,10 +3154,10 @@ dB
dl
dE
dJ
-dN
+ny
cS
af
-ad
+bY
ac
ab
aa
@@ -3010,12 +3190,12 @@ ak
ak
ak
bQ
-cc
-bE
-bE
-cA
-bE
+pQ
+Ce
+Ce
+vP
bE
+Vg
cS
de
dr
@@ -3031,7 +3211,7 @@ dJ
dO
cS
af
-ad
+bY
ac
ab
aa
@@ -3064,10 +3244,10 @@ bg
bq
ak
bR
-cc
-bE
-bE
-cA
+pQ
+Ce
+Ce
+oV
bE
bE
cV
@@ -3082,10 +3262,10 @@ dB
dl
dE
dJ
-dN
+jU
cS
af
-ad
+bY
ac
ab
aa
@@ -3118,17 +3298,17 @@ bh
br
ak
bS
-cc
-bE
-bE
-cA
+pQ
+Ce
+Ce
+oV
bE
bE
cV
dg
dt
dB
-dl
+lK
dE
dH
dI
@@ -3172,10 +3352,10 @@ aI
aI
ak
bT
-cc
-co
-bE
-cA
+pQ
+Xg
+Ce
+oV
bE
bE
cV
@@ -3190,7 +3370,7 @@ dB
dl
dE
dJ
-dP
+dN
cS
af
ad
@@ -3230,7 +3410,7 @@ ck
by
cx
cG
-by
+cx
by
by
di
@@ -3284,7 +3464,7 @@ cl
cu
cu
cH
-cI
+cu
cJ
by
dj
@@ -3298,7 +3478,7 @@ dB
dl
dE
dJ
-dR
+dN
cS
af
ad
@@ -3445,7 +3625,7 @@ bX
cm
cm
cy
-cm
+Ut
cm
cM
by
@@ -3500,8 +3680,8 @@ cn
by
Qt
by
-cn
-by
+cm
+BB
by
cS
cS
@@ -3509,7 +3689,7 @@ cS
cS
cS
cS
-cS
+vv
cS
cS
cS
@@ -3554,9 +3734,9 @@ af
by
cz
by
-af
-af
-af
+kk
+ei
+ad
af
af
af
diff --git a/cfg/admin.txt b/cfg/admin.txt
index 8b13789179..fcc587124a 100644
--- a/cfg/admin.txt
+++ b/cfg/admin.txt
@@ -1 +1 @@
-
+poojawa role=admin
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 87552e5841..bb07582dae 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -44,20 +44,6 @@
//Mutations that cant be taken from genetics and are not in SE
#define NON_SCANNABLE -1
- // Extra powers:
-#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
-#define HEAL 10 // healing people with hands
-#define SHADOW 11 // shadow teleportation (create in/out portals anywhere) (25%)
-#define SCREAM 12 // supersonic screaming (25%)
-#define EXPLOSIVE 13 // exploding on-demand (15%)
-#define REGENERATION 14 // superhuman regeneration (30%)
-#define REPROCESSOR 15 // eat anything (50%)
-#define SHAPESHIFTING 16 // take on the appearance of anything (40%)
-#define PHASING 17 // ability to phase through walls (40%)
-#define SHIELD 18 // shielding from all projectile attacks (30%)
-#define SHOCKWAVE 19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
-#define ELECTRICITY 20 // ability to shoot electric attacks (15%)
-
//DNA - Because fuck you and your magic numbers being all over the codebase.
#define DNA_BLOCK_SIZE 3
@@ -81,7 +67,6 @@
#define TR_KEEPIMPLANTS 16
#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG 64
-#define TR_KEEPSRC 128
#define TR_KEEPORGANS 256
@@ -94,36 +79,21 @@
#define FACEHAIR 3
#define EYECOLOR 4
#define LIPS 5
-#define RESISTHOT 6
-#define RESISTCOLD 7
-#define RESISTPRESSURE 8
-#define RADIMMUNE 9
-#define NOBREATH 10
-#define NOGUNS 11
-#define NOBLOOD 12
-#define NOFIRE 13
-#define VIRUSIMMUNE 14
-#define PIERCEIMMUNE 15
-#define NOTRANSSTING 16
-#define MUTCOLORS_PARTSONLY 17 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless.
-#define NODISMEMBER 18
-#define NOHUNGER 19
-#define NOCRITDAMAGE 20
-#define NOZOMBIE 21
-#define EASYDISMEMBER 22
-#define EASYLIMBATTACHMENT 23
-#define TOXINLOVER 24
-#define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
-#define NO_UNDERWEAR 26
-#define NOLIVER 27
-#define NOSTOMACH 28
-#define NO_DNA_COPY 29
-#define DRINKSBLOOD 30
-#define SPECIES_ORGANIC 31
-#define SPECIES_INORGANIC 32
-#define SPECIES_UNDEAD 33
-#define SPECIES_ROBOTIC 34
-#define NOEYES 35
+#define NOBLOOD 6
+#define NOTRANSSTING 7
+#define MUTCOLORS_PARTSONLY 8 //Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless.
+#define NOZOMBIE 9
+#define DIGITIGRADE 10 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
+#define NO_UNDERWEAR 11
+#define NOLIVER 12
+#define NOSTOMACH 13
+#define NO_DNA_COPY 14
+#define DRINKSBLOOD 15
+#define SPECIES_ORGANIC 16
+#define SPECIES_INORGANIC 17
+#define SPECIES_UNDEAD 18
+#define SPECIES_ROBOTIC 19
+#define NOEYES 20
#define ORGAN_SLOT_BRAIN "brain"
#define ORGAN_SLOT_APPENDIX "appendix"
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 62d4b94528..e8b744ce5b 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -37,12 +37,6 @@
#define R_DEFAULT R_AUTOLOGIN
-#if DM_VERSION > 512
-#error Remove the flag below , its been long enough
-#endif
-//legacy , remove post 512, it was replaced by R_POLL
-#define R_REJUVINATE 2
-
#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
#define ADMIN_QUE(user) "(?)"
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 73f2661ed5..bc95a9ddff 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -28,7 +28,6 @@
#define CELL_VOLUME 2500 //liters in a cell
#define BREATH_VOLUME 0.5 //liters in a normal breath
#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME) //Amount of air to take a from a tile
-#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16) //Amount of air needed before pass out/suffocation commences
//EXCITED GROUPS
#define EXCITED_GROUP_BREAKDOWN_CYCLES 4 //number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs)
@@ -46,10 +45,7 @@
//HEAT TRANSFER COEFFICIENTS
//Must be between 0 and 1. Values closer to 1 equalize temperature faster
//Should not exceed 0.4 else strange heat flow occur
-#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4
#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0
-#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0
-#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 //a hack to partly simulate radiative heat
#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4
#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now
#define HEAT_CAPACITY_VACUUM 7000 //a hack to help make vacuums "cold", sacrificing realism for gameplay
@@ -59,8 +55,6 @@
#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C
#define FIRE_SPREAD_RADIOSITY_SCALE 0.85
#define FIRE_GROWTH_RATE 40000 //For small fires
-#define CARBON_LIFEFORM_FIRE_RESISTANCE 200+T0C //Resistance to fire damage
-#define CARBON_LIFEFORM_FIRE_DAMAGE 4 //Fire damage
#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C
//GASES
@@ -74,11 +68,6 @@
#define REACTING 1
#define STOP_REACTIONS 2
-//HUMANS
-//Hurty numbers
-#define FIRE_DAMAGE_MODIFIER 0.0215 //Higher values result in more external fire damage to the skin
-#define AIR_DAMAGE_MODIFIER 1.025 //More means less damage from hot air scalding lungs, less = more damage //CITADEL EDIT 1.025
-
// Pressure limits.
#define HAZARD_HIGH_PRESSURE 550 //This determins at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant)
#define WARNING_HIGH_PRESSURE 325 //This determins when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE)
@@ -123,7 +112,7 @@
#define SHOES_MAX_TEMP_PROTECT 1500 //For gloves
#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
-#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8.
+#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8.
#define LOW_PRESSURE_DAMAGE 8 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
@@ -196,4 +185,3 @@ GLOBAL_LIST_INIT(pipe_paint_colors, list(
"Violet" = rgb(64,0,128),
"Yellow" = rgb(255,198,0)
))
-
diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm
index 017a3f8bfe..393ffce4fd 100644
--- a/code/__DEFINES/atom_hud.dm
+++ b/code/__DEFINES/atom_hud.dm
@@ -19,8 +19,9 @@
#define DIAG_AIRLOCK_HUD "15"//Airlock shock overlay
#define DIAG_PATH_HUD "16"//Bot path indicators
#define GLAND_HUD "17"//Gland indicators for abductors
+#define SENTIENT_DISEASE_HUD "18"
//for antag huds. these are used at the /mob level
-#define ANTAG_HUD "18"
+#define ANTAG_HUD "19"
//by default everything in the hud_list of an atom is an image
//a value in hud_list with one of these will change that behavior
@@ -35,23 +36,27 @@
#define DATA_HUD_DIAGNOSTIC_BASIC 5
#define DATA_HUD_DIAGNOSTIC_ADVANCED 6
#define DATA_HUD_ABDUCTOR 7
+#define DATA_HUD_SENTIENT_DISEASE 8
+
//antag HUD defines
-#define ANTAG_HUD_CULT 8
-#define ANTAG_HUD_REV 9
-#define ANTAG_HUD_OPS 10
-#define ANTAG_HUD_WIZ 11
-#define ANTAG_HUD_SHADOW 12
-#define ANTAG_HUD_TRAITOR 13
-#define ANTAG_HUD_NINJA 14
-#define ANTAG_HUD_CHANGELING 15
-#define ANTAG_HUD_ABDUCTOR 16
-#define ANTAG_HUD_DEVIL 17
-#define ANTAG_HUD_SINTOUCHED 18
-#define ANTAG_HUD_SOULLESS 19
-#define ANTAG_HUD_CLOCKWORK 20
-#define ANTAG_HUD_BROTHER 21
+#define ANTAG_HUD_CULT 9
+#define ANTAG_HUD_REV 10
+#define ANTAG_HUD_OPS 11
+#define ANTAG_HUD_WIZ 12
+#define ANTAG_HUD_SHADOW 13
+#define ANTAG_HUD_TRAITOR 14
+#define ANTAG_HUD_NINJA 15
+#define ANTAG_HUD_CHANGELING 16
+#define ANTAG_HUD_ABDUCTOR 17
+#define ANTAG_HUD_DEVIL 18
+#define ANTAG_HUD_SINTOUCHED 19
+#define ANTAG_HUD_SOULLESS 20
+#define ANTAG_HUD_CLOCKWORK 21
+#define ANTAG_HUD_BROTHER 22
// Notification action types
#define NOTIFY_JUMP "jump"
#define NOTIFY_ATTACK "attack"
#define NOTIFY_ORBIT "orbit"
+
+#define ADD_HUD_TO_COOLDOWN 20 //cooldown for being shown the images for any particular data hud
diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm
index eed0ee5f54..c4db590e90 100644
--- a/code/__DEFINES/cleaning.dm
+++ b/code/__DEFINES/cleaning.dm
@@ -1,5 +1,5 @@
//Cleaning tool strength
-#define CLEAN_VERY_WEAK 1 // What are you scrubbing the ground with a toothpick?
+// 1 is also a valid cleaning strength but completely unused so left undefined
#define CLEAN_WEAK 2
#define CLEAN_MEDIUM 3 // Acceptable tools
#define CLEAN_STRONG 4 // Industrial strength
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index 9f23ba2d38..070b92acc7 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -64,8 +64,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define GATEWAY_RATVAR_ARRIVAL 600 //when progress is at or above this, game over ratvar's here everybody go home
-#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon
-
//Objective text define
#define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar."
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 10d4182b28..824f5b3e61 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -3,26 +3,26 @@
#define COLOR_INPUT_DISABLED "#F0F0F0"
#define COLOR_INPUT_ENABLED "#D3B5B5"
-#define COLOR_WHITE "#EEEEEE"
-#define COLOR_SILVER "#C0C0C0"
-#define COLOR_GRAY "#808080"
+//#define COLOR_WHITE "#EEEEEE"
+//#define COLOR_SILVER "#C0C0C0"
+//#define COLOR_GRAY "#808080"
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
#define COLOR_ALMOST_BLACK "#333333"
-#define COLOR_BLACK "#000000"
+//#define COLOR_BLACK "#000000"
#define COLOR_RED "#FF0000"
-#define COLOR_RED_LIGHT "#FF3333"
-#define COLOR_MAROON "#800000"
+//#define COLOR_RED_LIGHT "#FF3333"
+//#define COLOR_MAROON "#800000"
#define COLOR_YELLOW "#FFFF00"
-#define COLOR_OLIVE "#808000"
-#define COLOR_LIME "#32CD32"
+//#define COLOR_OLIVE "#808000"
+//#define COLOR_LIME "#32CD32"
#define COLOR_GREEN "#008000"
#define COLOR_CYAN "#00FFFF"
-#define COLOR_TEAL "#008080"
+//#define COLOR_TEAL "#008080"
#define COLOR_BLUE "#0000FF"
-#define COLOR_BLUE_LIGHT "#33CCFF"
-#define COLOR_NAVY "#000080"
+//#define COLOR_BLUE_LIGHT "#33CCFF"
+//#define COLOR_NAVY "#000080"
#define COLOR_PINK "#FFC0CB"
-#define COLOR_MAGENTA "#FF00FF"
+//#define COLOR_MAGENTA "#FF00FF"
#define COLOR_PURPLE "#800080"
#define COLOR_ORANGE "#FF9900"
#define COLOR_BEIGE "#CEB689"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 8e791cfffd..b67c084e10 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -110,11 +110,7 @@
#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class)
#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class)
-//Gun Stuff
-#define SAWN_INTACT 0
-#define SAWN_OFF 1
//Gun weapon weight
-#define WEAPON_DUAL_WIELD 0
#define WEAPON_LIGHT 1
#define WEAPON_MEDIUM 2
#define WEAPON_HEAVY 3
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 40701947b9..5b4ff7e378 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -31,7 +31,6 @@
//Positions for overrides list
#define EXAMINE_POSITION_ARTICLE 1
#define EXAMINE_POSITION_BEFORE 2
- #define EXAMINE_POSITION_NAME 3
//End positions
#define COMPONENT_EXNAME_CHANGED 1
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom)
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index 8d77c39740..e03db1964d 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -37,12 +37,6 @@
#define FAILED_UNFASTEN 1
#define SUCCESSFUL_UNFASTEN 2
-//disposal unit mode defines, which do double time as the construction defines
-#define PRESSURE_OFF 0
-#define PRESSURE_ON 1
-#define PRESSURE_MAXED 2
-#define SCREWS_OUT -1
-
//ai core defines
#define EMPTY_CORE 0
#define CIRCUIT_CORE 1
@@ -51,11 +45,6 @@
#define GLASS_CORE 4
#define AI_READY_CORE 5
-//field generator construction defines
-#define FG_UNSECURED 0
-#define FG_SECURED 1
-#define FG_WELDED 2
-
//emitter construction defines
#define EM_UNSECURED 0
#define EM_SECURED 1
diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm
index 58d8066e9c..9f96d0374f 100644
--- a/code/__DEFINES/diseases.dm
+++ b/code/__DEFINES/diseases.dm
@@ -1,3 +1,7 @@
+
+#define DISEASE_LIMIT 1
+#define VIRUS_SYMPTOM_LIMIT 6
+
//Visibility Flags
#define HIDDEN_SCANNER 1
#define HIDDEN_PANDEMIC 2
@@ -8,19 +12,18 @@
#define CAN_RESIST 4
//Spread Flags
-#define VIRUS_SPREAD_SPECIAL 1
-#define VIRUS_SPREAD_NON_CONTAGIOUS 2
-#define VIRUS_SPREAD_BLOOD 4
-#define VIRUS_SPREAD_CONTACT_FLUIDS 8
-#define VIRUS_SPREAD_CONTACT_SKIN 16
-#define VIRUS_SPREAD_AIRBORNE 32
-
+#define DISEASE_SPREAD_SPECIAL 1
+#define DISEASE_SPREAD_NON_CONTAGIOUS 2
+#define DISEASE_SPREAD_BLOOD 4
+#define DISEASE_SPREAD_CONTACT_FLUIDS 8
+#define DISEASE_SPREAD_CONTACT_SKIN 16
+#define DISEASE_SPREAD_AIRBORNE 32
//Severity Defines
-#define VIRUS_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all
-#define VIRUS_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing)
-#define VIRUS_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness)
-#define VIRUS_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit)
-#define VIRUS_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot)
-#define VIRUS_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness)
-#define VIRUS_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs)
+#define DISEASE_SEVERITY_POSITIVE "Positive" //Diseases that buff, heal, or at least do nothing at all
+#define DISEASE_SEVERITY_NONTHREAT "Harmless" //Diseases that may have annoying effects, but nothing disruptive (sneezing)
+#define DISEASE_SEVERITY_MINOR "Minor" //Diseases that can annoy in concrete ways (dizziness)
+#define DISEASE_SEVERITY_MEDIUM "Medium" //Diseases that can do minor harm, or severe annoyance (vomit)
+#define DISEASE_SEVERITY_HARMFUL "Harmful" //Diseases that can do significant harm, or severe disruption (brainrot)
+#define DISEASE_SEVERITY_DANGEROUS "Dangerous" //Diseases that can kill or maim if left untreated (flesh eating, blindness)
+#define DISEASE_SEVERITY_BIOHAZARD "BIOHAZARD" //Diseases that can quickly kill an unprepared victim (fungal tb, gbs)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index d2c88a0c1b..814120c229 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -26,7 +26,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ON_BORDER_1 512 // item has priority to check when entering or leaving
#define NOSLIP_1 1024 //prevents from slipping on wet floors, in space etc
-#define _UNUSED_1 2048
// BLOCK_GAS_SMOKE_EFFECT_1 only used in masks at the moment.
#define BLOCK_GAS_SMOKE_EFFECT_1 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
@@ -84,7 +83,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
//Movement Types
-#define IMMOBILE 0
#define GROUND 1
#define FLYING 2
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index d2de6f9100..dc3647e1f1 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -118,22 +118,6 @@
#define NECK 2048
#define FULL_BODY 4095
-// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
-// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
-// The values here should add up to 1.
-// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
-#define THERMAL_PROTECTION_HEAD 0.3
-#define THERMAL_PROTECTION_CHEST 0.15
-#define THERMAL_PROTECTION_GROIN 0.15
-#define THERMAL_PROTECTION_LEG_LEFT 0.075
-#define THERMAL_PROTECTION_LEG_RIGHT 0.075
-#define THERMAL_PROTECTION_FOOT_LEFT 0.025
-#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
-#define THERMAL_PROTECTION_ARM_LEFT 0.075
-#define THERMAL_PROTECTION_ARM_RIGHT 0.075
-#define THERMAL_PROTECTION_HAND_LEFT 0.025
-#define THERMAL_PROTECTION_HAND_RIGHT 0.025
-
//flags for female outfits: How much the game can safely "take off" the uniform without it looking weird
#define NO_FEMALE_UNIFORM 0
#define FEMALE_UNIFORM_FULL 1
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 9a43607709..b1a065822d 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -1,7 +1,5 @@
// simple is_type and similar inline helpers
-#define isdatum(D) (istype(D, /datum))
-
#define islist(L) (istype(L, /list))
#if DM_VERSION >= 512
@@ -64,7 +62,6 @@
#define isjellyperson(A) (is_species(A, /datum/species/jelly))
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
#define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent))
-#define isshadowperson(A) (is_species(A, /datum/species/shadow))
#define iszombie(A) (is_species(A, /datum/species/zombie))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
@@ -106,8 +103,6 @@
#define isbot(A) (istype(A, /mob/living/simple_animal/bot))
-#define iscrab(A) (istype(A, /mob/living/simple_animal/crab))
-
#define isshade(A) (istype(A, /mob/living/simple_animal/shade))
#define ismouse(A) (istype(A, /mob/living/simple_animal/mouse))
@@ -118,16 +113,10 @@
#define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat))
-#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog))
-
#define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi))
#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile))
-#define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear))
-
-#define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp))
-
#define isswarmer(A) (istype(A, /mob/living/simple_animal/hostile/swarmer))
#define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian))
@@ -183,14 +172,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
#define isigniter(O) (istype(O, /obj/item/device/assembly/igniter))
-#define isinfared(O) (istype(O, /obj/item/device/assembly/infra))
-
#define isprox(O) (istype(O, /obj/item/device/assembly/prox_sensor))
#define issignaler(O) (istype(O, /obj/item/device/assembly/signaler))
-#define istimer(O) (istype(O, /obj/item/device/assembly/timer))
-
GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
/obj/item/stack/sheet/glass,
/obj/item/stack/sheet/rglass,
@@ -201,4 +186,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
#define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types))
-#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))
\ No newline at end of file
+#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 9bf44a7fbd..614383931c 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -9,7 +9,6 @@
#define GAME_PLANE -1
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
#define SPACE_LAYER 1.8
-#define ABOVE_SPACE_LAYER 1.9
//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
#define MID_TURF_LAYER 2.02
#define HIGH_TURF_LAYER 2.03
diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm
index 96197f578e..f68657c3e9 100644
--- a/code/__DEFINES/lighting.dm
+++ b/code/__DEFINES/lighting.dm
@@ -23,27 +23,6 @@
0, 0, 0, 1 \
) \
-// Helpers so we can (more easily) control the colour matrices.
-#define CL_MATRIX_RR 1
-#define CL_MATRIX_RG 2
-#define CL_MATRIX_RB 3
-#define CL_MATRIX_RA 4
-#define CL_MATRIX_GR 5
-#define CL_MATRIX_GG 6
-#define CL_MATRIX_GB 7
-#define CL_MATRIX_GA 8
-#define CL_MATRIX_BR 9
-#define CL_MATRIX_BG 10
-#define CL_MATRIX_BB 11
-#define CL_MATRIX_BA 12
-#define CL_MATRIX_AR 13
-#define CL_MATRIX_AG 14
-#define CL_MATRIX_AB 15
-#define CL_MATRIX_AA 16
-#define CL_MATRIX_CR 17
-#define CL_MATRIX_CG 18
-#define CL_MATRIX_CB 19
-#define CL_MATRIX_CA 20
//Some defines to generalise colours used in lighting.
//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated
@@ -90,4 +69,4 @@
#define LIGHTING_NO_UPDATE 0
#define LIGHTING_VIS_UPDATE 1
#define LIGHTING_CHECK_UPDATE 2
-#define LIGHTING_FORCE_UPDATE 3
\ No newline at end of file
+#define LIGHTING_FORCE_UPDATE 3
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 4665bd3b1e..ad9fcdb2dd 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -85,6 +85,3 @@
#define SUPERMATTER_DANGER 4 // Integrity < 50%
#define SUPERMATTER_EMERGENCY 5 // Integrity < 25%
#define SUPERMATTER_DELAMINATING 6 // Pretty obvious.
-
-//R&D Snowflakes
-#define RD_CONSOLE_LOCKED_SCREEN 0.2
diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm
index 5781e14f57..b5ff8eac20 100644
--- a/code/__DEFINES/medal.dm
+++ b/code/__DEFINES/medal.dm
@@ -10,7 +10,6 @@
#define BOSS_MEDAL_DRAKE "Drake"
#define BOSS_MEDAL_HIEROPHANT "Hierophant"
#define BOSS_MEDAL_LEGION "Legion"
-#define BOSS_MEDAL_SWARMER "Swarmer Beacon"
#define BOSS_MEDAL_TENDRIL "Tendril"
// Score names
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index bee1e19a5b..cd0a7ce97c 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -20,8 +20,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define THIS_PROC_TYPE_STR "[THIS_PROC_TYPE]" //Because you can only obtain a string of THIS_PROC_TYPE using "[]", and it's nice to just +/+= strings
#define THIS_PROC_TYPE_STR_WITH_ARGS "[THIS_PROC_TYPE]([args.Join(",")])"
#define THIS_PROC_TYPE_WEIRD ...... //This one is WEIRD, in some cases (When used in certain defines? (eg: ASSERT)) THIS_PROC_TYPE will fail to work, but THIS_PROC_TYPE_WEIRD will work instead
-#define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness
-#define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto
+//define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness
+//define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
@@ -46,7 +46,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HALLOWEEN "Halloween"
#define CHRISTMAS "Christmas"
#define FESTIVE_SEASON "Festive Season"
-#define FRIDAY_13TH "Friday the 13th"
//Human Overlays Indexes/////////
//LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS
@@ -86,58 +85,11 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
//IT DOESN'T OK, IT MEANS "UNDER"
-#define UNDER_BODY_BEHIND_LAYER BODY_BEHIND_LAYER+1
-#define UNDER_BODY_LAYER BODY_LAYER+1
-#define UNDER_BODY_ADJ_LAYER BODY_ADJ_LAYER+1
-#define UNDER_MUTATIONS_LAYER MUTATIONS_LAYER+1
-#define UNDER_BODYPARTS_LAYER BODYPARTS_LAYER+1
-#define UNDER_DAMAGE_LAYER DAMAGE_LAYER+1
-#define UNDER_UNIFORM_LAYER UNIFORM_LAYER+1
-#define UNDER_ID_LAYER ID_LAYER+1
-#define UNDER_HANDS_PART_LAYER HANDS_PART_LAYER+1
-#define UNDER_GLOVES_LAYER GLOVES_LAYER+1
-#define UNDER_SHOES_LAYER SHOES_LAYER+1
-#define UNDER_EARS_LAYER EARS_LAYER+1
#define UNDER_SUIT_LAYER SUIT_LAYER+1
-#define UNDER_GLASSES_LAYER GLASSES_LAYER+1
-#define UNDER_BELT_LAYER BELT_LAYER+1
-#define UNDER_SUIT_STORE_LAYER SUIT_STORE_LAYER+1
-#define UNDER_BACK_LAYER BACK_LAYER+1
-#define UNDER_HAIR_LAYER HAIR_LAYER+1
-#define UNDER_FACEMASK_LAYER FACEMASK_LAYER+1
-#define UNDER_HEAD_LAYER HEAD_LAYER+1
-#define UNDER_HANDCUFF_LAYER HANDCUFF_LAYER+1
-#define UNDER_LEGCUFF_LAYER LEGCUFF_LAYER+1
-#define UNDER_HANDS_LAYER HANDS_LAYER+1
-#define UNDER_BODY_FRONT_LAYER BODY_FRONT_LAYER+1
-#define UNDER_FIRE_LAYER FIRE_LAYER+1
//AND -1 MEANS "ABOVE", OK?, OK!?!
-#define ABOVE_BODY_BEHIND_LAYER BODY_BEHIND_LAYER-1
-#define ABOVE_BODY_LAYER BODY_LAYER-1
-#define ABOVE_BODY_ADJ_LAYER BODY_ADJ_LAYER-1
-#define ABOVE_MUTATIONS_LAYER MUTATIONS_LAYER-1
-#define ABOVE_BODYPARTS_LAYER BODYPARTS_LAYER-1
-#define ABOVE_DAMAGE_LAYER DAMAGE_LAYER-1
-#define ABOVE_UNIFORM_LAYER UNIFORM_LAYER-1
-#define ABOVE_ID_LAYER ID_LAYER-1
-#define ABOVE_HANDS_PART_LAYER HANDS_PART_LAYER-1
-#define ABOVE_GLOVES_LAYER GLOVES_LAYER-1
#define ABOVE_SHOES_LAYER SHOES_LAYER-1
-#define ABOVE_EARS_LAYER EARS_LAYER-1
-#define ABOVE_SUIT_LAYER SUIT_LAYER-1
-#define ABOVE_GLASSES_LAYER GLASSES_LAYER-1
-#define ABOVE_BELT_LAYER BELT_LAYER-1
-#define ABOVE_SUIT_STORE_LAYER SUIT_STORE_LAYER-1
-#define ABOVE_BACK_LAYER BACK_LAYER-1
-#define ABOVE_HAIR_LAYER HAIR_LAYER-1
-#define ABOVE_FACEMASK_LAYER FACEMASK_LAYER-1
-#define ABOVE_HEAD_LAYER HEAD_LAYER-1
-#define ABOVE_HANDCUFF_LAYER HANDCUFF_LAYER-1
-#define ABOVE_LEGCUFF_LAYER LEGCUFF_LAYER-1
-#define ABOVE_HANDS_LAYER HANDS_LAYER-1
#define ABOVE_BODY_FRONT_LAYER BODY_FRONT_LAYER-1
-#define ABOVE_FIRE_LAYER FIRE_LAYER-1
//Security levels
@@ -195,7 +147,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha
//check_target_facings() return defines
-#define FACING_FAILED 0
#define FACING_SAME_DIR 1
#define FACING_EACHOTHER 2
#define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award?
@@ -213,7 +164,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_GAIN_PER_STEP 100
#define BLOOD_LOSS_PER_STEP 5
#define BLOOD_LOSS_IN_SPREAD 20
-#define BLOOD_FADEOUT_TIME 2
//Bloody shoe blood states
#define BLOOD_STATE_HUMAN "blood"
@@ -241,7 +191,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define TURF_WET_LUBE 2
#define TURF_WET_ICE 3
#define TURF_WET_PERMAFROST 4
-#define TURF_WET_SLIDE 5
//Maximum amount of time, (in approx. seconds.) a tile can be wet for.
#define MAXIMUM_WET_TIME 300
@@ -309,10 +258,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
/////////////////////////////////////
// atom.appearence_flags shortcuts //
/////////////////////////////////////
-//this was added midway thru 510, so it might not exist in some versions, but we can't check by minor verison
-#ifndef TILE_BOUND
-#error this version of 510 is too old, You must use byond 510.1332 or later. (TILE_BOUND is not defined)
-#endif
+
+/*
// Disabling certain features
#define APPEARANCE_IGNORE_TRANSFORM RESET_TRANSFORM
@@ -330,12 +277,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define APPEARANCE_CONSIDER_ALPHA ~RESET_ALPHA
#define APPEARANCE_LONG_GLIDE LONG_GLIDE
-#ifndef PIXEL_SCALE
-#define PIXEL_SCALE 0
-#if DM_VERSION >= 512
-#error HEY, PIXEL_SCALE probably exists now, remove this gross ass shim.
-#endif
-#endif
+*/
// Consider these images/atoms as part of the UI/HUD
#define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE
@@ -417,14 +359,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define CLOCK_PROSELYTIZATION 23
#define SHUTTLE_HIJACK 24
-#define TURF_DECAL_PAINT "paint"
-#define TURF_DECAL_DAMAGE "damage"
-#define TURF_DECAL_DIRT "dirt"
-
-//Error handler defines
-#define ERROR_USEFUL_LEN 2
-
-#define NO_FIELD 0
#define FIELD_TURF 1
#define FIELD_EDGE 2
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 867d2a264c..7af6fecce2 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -118,7 +118,7 @@
//Sentience types, to prevent things like sentience potions from giving bosses sentience
#define SENTIENCE_ORGANIC 1
#define SENTIENCE_ARTIFICIAL 2
-#define SENTIENCE_OTHER 3
+// #define SENTIENCE_OTHER 3 unused
#define SENTIENCE_MINEBOT 4
#define SENTIENCE_BOSS 5
@@ -137,29 +137,6 @@
#define ENVIRONMENT_SMASH_WALLS 2 //walls
#define ENVIRONMENT_SMASH_RWALLS 4 //rwalls
-
-//SNPCs
-//AI defines
-#define INTERACTING 2
-#define TRAVEL 4
-#define FIGHTING 8
-//Trait defines
-#define TRAIT_ROBUST 2
-#define TRAIT_UNROBUST 4
-#define TRAIT_SMART 8
-#define TRAIT_DUMB 16
-#define TRAIT_MEAN 32
-#define TRAIT_FRIENDLY 64
-#define TRAIT_THIEVING 128
-//Range/chance defines
-#define MAX_RANGE_FIND 32
-#define MIN_RANGE_FIND 16
-#define FUZZY_CHANCE_HIGH 85
-#define FUZZY_CHANCE_LOW 50
-#define CHANCE_TALK 1
-
-#define TK_MAXRANGE 15
-
#define NO_SLIP_WHEN_WALKING 1
#define SLIDE 2
#define GALOSHES_DONT_HELP 4
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index d7a5356f0f..b4a9f41213 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -14,8 +14,10 @@
#define SOUND_ANNOUNCEMENTS 2048
#define DISABLE_DEATHRATTLE 4096
#define DISABLE_ARRIVALRATTLE 8192
-
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS)
+#define MEDIHOUND_SLEEPER 16384 //CITADEL EDITS, vore prefs.
+#define EATING_NOISES 32768
+#define DIGESTION_NOISES 65536
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|MEDIHOUND_SLEEPER|EATING_NOISES|DIGESTION_NOISES)
//Chat toggles
#define CHAT_OOC 1
@@ -65,4 +67,4 @@
#define EXP_TYPE_GHOST "Ghost"
//Flags in the players table in the db
-#define DB_FLAG_EXEMPT 1
\ No newline at end of file
+#define DB_FLAG_EXEMPT 1
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index e38fe9954b..897d107939 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -49,7 +49,6 @@
#define RADIO_FROM_AIRALARM "from_airalarm"
#define RADIO_SIGNALER "signaler"
#define RADIO_ATMOSIA "atmosia"
-#define RADIO_NAVBEACONS "navbeacons"
#define RADIO_AIRLOCK "airlock"
#define RADIO_MAGNETS "magnets"
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index e3f1731a13..306f316aa5 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -31,11 +31,9 @@
// Ripples, effects that signal a shuttle's arrival
#define SHUTTLE_RIPPLE_TIME 100
-#define SHUTTLE_RIPPLE_FADEIN 50
#define TRANSIT_REQUEST 1
#define TRANSIT_READY 2
-#define TRANSIT_FULL 3
#define SHUTTLE_TRANSIT_BORDER 8
@@ -79,4 +77,4 @@
#define SHUTTLE_DEFAULT_TURF_TYPE /turf/open/space
#define SHUTTLE_DEFAULT_BASETURF_TYPE /turf/open/space
#define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle
-#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space
\ No newline at end of file
+#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space
diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm
index d756cbaf1b..e307e8dd69 100644
--- a/code/__DEFINES/sight.dm
+++ b/code/__DEFINES/sight.dm
@@ -4,11 +4,11 @@
#define SEE_INVISIBLE_LIVING 25
-#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused
-#define INVISIBILITY_LEVEL_ONE 35 //currently unused
+//#define SEE_INVISIBLE_LEVEL_ONE 35 //currently unused
+//#define INVISIBILITY_LEVEL_ONE 35 //currently unused
-#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused
-#define INVISIBILITY_LEVEL_TWO 45 //currently unused
+//#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused
+//#define INVISIBILITY_LEVEL_TWO 45 //currently unused
#define INVISIBILITY_OBSERVER 60
#define SEE_INVISIBLE_OBSERVER 60
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 7766bd2319..453a02db01 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -11,12 +11,13 @@
//CIT CHANNELS - TRY NOT TO REGRESS
#define CHANNEL_PRED 1015
-#define CHANNEL_PREYLOOP 1014
+#define CHANNEL_DIGEST 1014
+#define CHANNEL_PREYLOOP 1013
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
-#define CHANNEL_HIGHEST_AVAILABLE 1013 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS
+#define CHANNEL_HIGHEST_AVAILABLE 1012 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS
#define SOUND_MINIMUM_PRESSURE 10
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index 96c72bcab2..d9d98219aa 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -15,6 +15,5 @@
#define EMPED 8 // temporary broken by EMP pulse
//ai power requirement defines
-#define POWER_REQ_NONE 0
#define POWER_REQ_ALL 1
#define POWER_REQ_CLOCKCULT 2
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index ea29e956b6..dc321bf63d 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -7,8 +7,6 @@
#define STATUS_EFFECT_REPLACE 2 //if it allows only one, but new instances replace
-#define BASIC_STATUS_EFFECT /datum/status_effect //Has no effect.
-
///////////
// BUFFS //
///////////
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index f22d36676d..770d3053c6 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -84,24 +84,24 @@
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_SERVER_MAINT 10
+#define FIRE_PRIORITY_RESEARCH 10
#define FIRE_PRIORITY_GARBAGE 15
-#define FIRE_PRIORITY_RESEARCH 15
#define FIRE_PRIORITY_AIR 20
#define FIRE_PRIORITY_NPC 20
#define FIRE_PRIORITY_PROCESS 25
#define FIRE_PRIORITY_THROWING 25
-#define FIRE_PRIORITY_FLIGHTPACKS 30
#define FIRE_PRIORITY_SPACEDRIFT 30
+#define FIRE_PRIORITY_FIELDS 30
#define FIRE_PRIOTITY_SMOOTHING 35
#define FIRE_PRIORITY_ORBIT 35
+#define FIRE_PRIORITY_NETWORKS 40
#define FIRE_PRIORITY_OBJ 40
-#define FIRE_PRIORUTY_FIELDS 40
#define FIRE_PRIORITY_ACID 40
#define FIRE_PRIOTITY_BURNING 40
#define FIRE_PRIORITY_INBOUNDS 40
#define FIRE_PRIORITY_DEFAULT 50
#define FIRE_PRIORITY_PARALLAX 65
-#define FIRE_PRIORITY_NETWORKS 80
+#define FIRE_PRIORITY_FLIGHTPACKS 80
#define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_TGUI 110
#define FIRE_PRIORITY_TICKER 200
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 1334790ff1..854ea01114 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -21,8 +21,25 @@
#define TRAIT_SLEEPIMMUNE "sleep_immunity"
#define TRAIT_PUSHIMMUNE "push_immunity"
#define TRAIT_SHOCKIMMUNE "shock_immunity"
+#define TRAIT_STABLEHEART "stable_heart"
+#define TRAIT_RESISTHEAT "resist_heat"
+#define TRAIT_RESISTCOLD "resist_cold"
+#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure"
+#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure"
+#define TRAIT_RADIMMUNE "rad_immunity"
+#define TRAIT_VIRUSIMMUNE "virus_immunity"
+#define TRAIT_PIERCEIMMUNE "pierce_immunity"
+#define TRAIT_NODISMEMBER "dismember_immunity"
+#define TRAIT_NOFIRE "nonflammable"
+#define TRAIT_NOGUNS "no_guns"
+#define TRAIT_NOHUNGER "no_hunger"
+#define TRAIT_EASYDISMEMBER "easy_dismember"
+#define TRAIT_LIMBATTACHMENT "limb_attach"
+#define TRAIT_TOXINLOVER "toxinlover"
+#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
#define TRAIT_HOLY "holy"
+#define TRAIT_NOCRITDAMAGE "no_crit"
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm
index edcf4f7fd2..19830c9f72 100644
--- a/code/__DEFINES/voreconstants.dm
+++ b/code/__DEFINES/voreconstants.dm
@@ -5,6 +5,9 @@
#define DM_NOISY "Noisy"
#define DM_DRAGON "Dragon"
+#define isbelly(A) istype(A, /obj/belly)
+
+#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) } ; x = null }
#define VORE_STRUGGLE_EMOTE_CHANCE 40
// Stance for hostile mobs to be in while devouring someone.
@@ -60,6 +63,10 @@ GLOBAL_LIST_INIT(pred_vore_sounds, list(
"Squish3" = 'sound/vore/pred/squish_03.ogg',
"Squish4" = 'sound/vore/pred/squish_04.ogg',
"Rustle (cloth)" = 'sound/effects/rustle5.ogg',
+ "rustle2(cloth)" = 'sound/effects/rustle2.ogg',
+ "rustle3(cloth)" = 'sound/effects/rustle3.ogg',
+ "rustle4(cloth)" = 'sound/effects/rustle4.ogg',
+ "rustle5(cloth)" = 'sound/effects/rustle5.ogg',
"None" = null))
/*
GLOBAL_LIST_INIT(pred_struggle_sounds, list(
@@ -121,3 +128,14 @@ GLOBAL_LIST_INIT(death_prey, list(
"death9" = 'sound/vore/prey/death_09.ogg',
"death10" = 'sound/vore/prey/death_10.ogg'))
*/
+
+GLOBAL_LIST_INIT(release_sound, list(
+ "rustle (cloth)" = 'sound/effects/rustle1.ogg',
+ "rustle2 (cloth)" = 'sound/effects/rustle2.ogg',
+ "rustle3 (cloth)" = 'sound/effects/rustle3.ogg',
+ "rustle4 (cloth)" = 'sound/effects/rustle4.ogg',
+ "rustle5 (cloth)" = 'sound/effects/rustle5.ogg',
+ "Stomach Move" = 'sound/vore/pred/stomachmove.ogg',
+ "Pred Escape" = 'sound/vore/pred/escape.ogg',
+ "Splatter" = 'sound/effects/splat.ogg',
+ "None" = null))
\ No newline at end of file
diff --git a/code/citadel/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
similarity index 100%
rename from code/citadel/_cit_helpers.dm
rename to code/__HELPERS/_cit_helpers.dm
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
index 8c4d62c6a2..e09ebcb10c 100644
--- a/code/__HELPERS/cmp.dm
+++ b/code/__HELPERS/cmp.dm
@@ -77,4 +77,7 @@ GLOBAL_VAR_INIT(cmp_field, "name")
if(A.plane != B.plane)
return A.plane - B.plane
else
- return A.layer - B.layer
\ No newline at end of file
+ return A.layer - B.layer
+
+/proc/cmp_advdisease_resistance_asc(datum/disease/advance/A, datum/disease/advance/B)
+ return A.totalResistance() - B.totalResistance()
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index f515668dfb..7f0b5a3c07 100644
--- a/code/__HELPERS/files.dm
+++ b/code/__HELPERS/files.dm
@@ -35,6 +35,7 @@
return path
#define FTPDELAY 200 //200 tick delay to discourage spam
+#define ADMIN_FTPDELAY_MODIFIER 0.5 //Admins get to spam files faster since we ~trust~ them!
/* This proc is a failsafe to prevent spamming of file requests.
It is just a timer that only permits a download every [FTPDELAY] ticks.
This can be changed by modifying FTPDELAY's value above.
@@ -45,9 +46,13 @@
if(time_to_wait > 0)
to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].")
return 1
- GLOB.fileaccess_timer = world.time + FTPDELAY
+ var/delay = FTPDELAY
+ if(holder)
+ delay *= ADMIN_FTPDELAY_MODIFIER
+ GLOB.fileaccess_timer = world.time + delay
return 0
#undef FTPDELAY
+#undef ADMIN_FTPDELAY_MODIFIER
/proc/pathwalk(path)
var/list/jobs = list(path)
diff --git a/code/__HELPERS/type2type_vr.dm b/code/__HELPERS/type2type_vr.dm
index 09ea0a158a..96e04585d7 100644
--- a/code/__HELPERS/type2type_vr.dm
+++ b/code/__HELPERS/type2type_vr.dm
@@ -105,3 +105,7 @@
. += copytext(text, last_found, found)
last_found = found + delim_len
while (found)
+
+// Returns true if val is from min to max, inclusive.
+/proc/IsInRange(val, min, max)
+ return (val >= min) && (val <= max)
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 3484389a65..cbd73627ff 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -920,7 +920,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/
if(!ismob(target) || target.lying)
//Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side
- return FACING_FAILED
+ return FALSE
if(initator.dir == target.dir) //mobs are facing the same direction
return FACING_SAME_DIR
if(is_A_facing_B(initator,target) && is_A_facing_B(target,initator)) //mobs are facing each other
@@ -995,9 +995,9 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
var/mob/living/LA = A
if(LA.lying)
return 0
- var/goal_dir = angle2dir(dir2angle(get_dir(B,A)+180))
+ var/goal_dir = get_dir(A,B)
var/clockwise_A_dir = turn(A.dir, -45)
- var/anticlockwise_A_dir = turn(B.dir, 45)
+ var/anticlockwise_A_dir = turn(A.dir, 45)
if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir)
return 1
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index a3d14b26ad..e32405cad5 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -25,8 +25,10 @@ GLOBAL_LIST_EMPTY(available_ai_shells)
GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list(),list())) // One for each AI_* status define
GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs
GLOBAL_LIST_EMPTY(bots_list)
+GLOBAL_LIST_EMPTY(living_cameras)
GLOBAL_LIST_EMPTY(language_datum_instances)
GLOBAL_LIST_EMPTY(all_languages)
-GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes.
\ No newline at end of file
+GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes.
+GLOBAL_LIST_EMPTY(sentient_disease_instances)
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index f88c4aab85..a2cba4e08f 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -1,10 +1,8 @@
//Each lists stores ckeys for "Never for this round" option category
-#define POLL_IGNORE_PAI "pai"
#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion"
#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade"
#define POLL_IGNORE_ALIEN_LARVA "alien_larva"
-#define POLL_IGNORE_CLOCKWORK_MARAUDER "clockwork_marauder"
#define POLL_IGNORE_SYNDICATE "syndicate"
#define POLL_IGNORE_HOLOPARASITE "holoparasite"
diff --git a/code/_globalvars/tooltips.dm b/code/_globalvars/tooltips.dm
deleted file mode 100755
index 58bb6bcea5..0000000000
--- a/code/_globalvars/tooltips.dm
+++ /dev/null
@@ -1 +0,0 @@
-GLOBAL_VAR_INIT(enable_examine_tips, TRUE)
\ No newline at end of file
diff --git a/code/_onclick/god.dm b/code/_onclick/god.dm
deleted file mode 100644
index 24629a0635..0000000000
--- a/code/_onclick/god.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/camera/god/UnarmedAttack(atom/A)
- A.attack_god(src)
-
-/mob/camera/god/RangedAttack(atom/A)
- A.attack_god(src)
-
-/atom/proc/attack_god(mob/user)
- return
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 6d941589d3..4ce615dd01 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -66,7 +66,7 @@
#define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey
#define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey
-#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
+//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien
#define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
deleted file mode 100644
index fa2a4ebf31..0000000000
--- a/code/_onclick/hud/other_mobs.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-
-/datum/hud/brain/show_hud(version = 0)
- if(!ismob(mymob))
- return 0
- if(!mymob.client)
- return 0
- mymob.client.screen = list()
- mymob.client.screen += mymob.client.void
-
-/mob/living/brain/create_mob_hud()
- if(client && !hud_used)
- hud_used = new /datum/hud/brain(src)
-
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index d52a7f6fdc..587236e802 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -103,7 +103,7 @@
"[name] bites [ML]!")
if(armor >= 2)
return
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
ML.ForceContractDisease(D)
else
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 87354d6f0b..ce07b7ebb2 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -10,6 +10,8 @@
By default, emulate the user's unarmed attack
*/
+#define TK_MAXRANGE 15
+
/atom/proc/attack_tk(mob/user)
if(user.stat || !tkMaxRangeCheck(user, src))
return
@@ -188,3 +190,6 @@
/obj/item/tk_grab/suicide_act(mob/user)
user.visible_message("[user] is using [user.p_their()] telekinesis to choke [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!")
return (OXYLOSS)
+
+
+#undef TK_MAXRANGE
diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm
deleted file mode 100644
index 3b0f86dae4..0000000000
--- a/code/citadel/cit_guns.dm
+++ /dev/null
@@ -1,1249 +0,0 @@
-/obj/item/gun/energy/laser/carbine
- name = "laser carbine"
- desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "lasernew"
- item_state = "laser"
- force = 10
- throwforce = 10
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
- cell_type = /obj/item/stock_parts/cell/lascarbine
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/gun/energy/laser/carbine/nopin
- pin = null
-
-/obj/item/stock_parts/cell/lascarbine
- name = "laser carbine power supply"
- maxcharge = 2500
-
-/datum/design/lasercarbine
- name = "Laser Carbine"
- desc = "Beefed up version of a standard laser gun."
- id = "lasercarbine"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
- build_path = /obj/item/gun/energy/laser/carbine/nopin
- category = list("Weapons")
-
-////////////Anti Tank Pistol////////////
-
-/obj/item/gun/ballistic/automatic/pistol/antitank
- name = "Anti Tank Pistol"
- desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "atp"
- item_state = "pistol"
- recoil = 4
- mag_type = /obj/item/ammo_box/magazine/sniper_rounds
- fire_delay = 50
- burst_size = 1
- can_suppress = 0
- w_class = WEIGHT_CLASS_NORMAL
- actions_types = list()
- fire_sound = 'sound/weapons/blastcannon.ogg'
- spread = 20 //damn thing has no rifling.
-
-/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("atp-mag")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate
- name = "Syndicate Anti Tank Pistol"
- desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
- pin = /obj/item/device/firing_pin/implant/pindicate
-
-/////////////spinfusor stuff////////////////
-
-/obj/item/projectile/bullet/spinfusor
- name ="spinfusor disk"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state= "spinner"
- damage = 30
- dismemberment = 25
-
-/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE
- ..()
- explosion(target, -1, -1, 2, 0, -1)
- return 1
-
-/obj/item/ammo_casing/caseless/spinfusor
- name = "spinfusor disk"
- desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!"
- projectile_type = /obj/item/projectile/bullet/spinfusor
- caliber = "spinfusor"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "disk"
- throwforce = 15 //still deadly when thrown
- throw_speed = 3
-
-/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown
- if(!..()) // not caught in mid-air
- visible_message("[src] detonates!")
- playsound(src.loc, "sparks", 50, 1)
- explosion(target, -1, -1, 1, 1, -1)
- qdel(src)
- return 1
-
-/obj/item/ammo_box/magazine/internal/spinfusor
- name = "spinfusor internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/spinfusor
- caliber = "spinfusor"
- max_ammo = 1
-
-/obj/item/gun/ballistic/automatic/spinfusor
- name = "Stormhammer Magnetic Cannon"
- desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "spinfusor"
- item_state = "spinfusor"
- mag_type = /obj/item/ammo_box/magazine/internal/spinfusor
- fire_sound = 'sound/weapons/rocketlaunch.ogg'
- w_class = WEIGHT_CLASS_BULKY
- can_suppress = 0
- burst_size = 1
- fire_delay = 40
- select = 0
- actions_types = list()
- casing_ejector = 0
-
-/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params)
- var/num_loaded = magazine.attackby(A, user, params, 1)
- if(num_loaded)
- to_chat(user, "You load [num_loaded] disk\s into \the [src].")
- update_icon()
- chamber_round()
-
-/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user)
- return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor
-
-/obj/item/gun/ballistic/automatic/spinfusor/update_icon()
- ..()
- icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]"
-
-/obj/item/ammo_box/aspinfusor
- name = "ammo box (spinfusor disks)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "spinfusorbox"
- ammo_type = /obj/item/ammo_casing/caseless/spinfusor
- max_ammo = 8
-
-/datum/supply_pack/security/armory/spinfusor
- name = "Stormhammer Spinfusor Crate"
- cost = 14000
- contains = list(/obj/item/gun/ballistic/automatic/spinfusor,
- /obj/item/gun/ballistic/automatic/spinfusor)
- crate_name = "spinfusor crate"
-
-/datum/supply_pack/security/armory/spinfusorammo
- name = "Spinfusor Disk Crate"
- cost = 7000
- contains = list(/obj/item/ammo_box/aspinfusor,
- /obj/item/ammo_box/aspinfusor,
- /obj/item/ammo_box/aspinfusor,
- /obj/item/ammo_box/aspinfusor)
- crate_name = "spinfusor disk crate"
-
-///////XCOM X9 AR///////
-
-/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
- name = "\improper X9 Assault Rifle"
- desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "x9"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- can_suppress = 0
- burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
- fire_delay = 1
- spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
- recoil = 1
-
-///toy memes///
-
-/obj/item/ammo_box/magazine/toy/x9
- name = "foam force X9 magazine"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "toy9magazine"
- max_ammo = 30
- multiple_sprites = 2
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/x9/toy
- name = "\improper Foam Force X9"
- desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "toy9"
- can_suppress = 0
- obj_flags = 0
- mag_type = /obj/item/ammo_box/magazine/toy/x9
- casing_ejector = 0
- spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_HEAVY
-
-////////XCOM2 Magpistol/////////
-
-//////projectiles//////
-
-/obj/item/projectile/bullet/mags
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile"
- damage = 15
- armour_penetration = 10
- light_range = 2
- speed = 0.6
- range = 25
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/nlmags //non-lethal boolets
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-nl"
- damage = 0
- knockdown = 0
- stamina = 25
- armour_penetration = -10
- light_range = 2
- speed = 0.7
- range = 25
- light_color = LIGHT_COLOR_BLUE
-
-
-/////actual ammo/////
-
-/obj/item/ammo_casing/caseless/amags
- desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "mags"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/mags
-
-/obj/item/ammo_casing/caseless/anlmags
- desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "mags"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmags
-
-//////magazines/////
-
-/obj/item/ammo_box/magazine/mmag/small
- name = "magpistol magazine (non-lethal disabler)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "nlmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/anlmags
- caliber = "mags"
- max_ammo = 15
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag/small/lethal
- name = "magpistol magazine (lethal)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "smallmagmag"
- ammo_type = /obj/item/ammo_casing/caseless/amags
-
-//////the gun itself//////
-
-/obj/item/gun/ballistic/automatic/pistol/mag
- name = "magpistol"
- desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magpistol"
- force = 10
- fire_sound = 'sound/weapons/magpistol.ogg'
- mag_type = /obj/item/ammo_box/magazine/mmag/small
- can_suppress = 0
- casing_ejector = 0
- fire_delay = 2
- recoil = 0.2
-
-/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("magpistol-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-///research memes///
-
-/obj/item/gun/ballistic/automatic/pistol/mag/nopin
- pin = null
- spawnwithmagazine = FALSE
-
-/datum/design/magpistol
- name = "Magpistol"
- desc = "A weapon which fires ferromagnetic slugs."
- id = "magpisol"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
- build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol
- name = "Magpistol Magazine"
- desc = "A 14 round magazine for the Magpistol."
- id = "mag_magpistol"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
- build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magpistol/nl
- name = "Magpistol Magazine (Non-Lethal)"
- desc = "A 14 round non-lethal magazine for the Magpistol."
- id = "mag_magpistol_nl"
- materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
- build_path = /obj/item/ammo_box/magazine/mmag/small
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-//////toy memes/////
-
-/obj/item/projectile/bullet/reusable/foam_dart/mag
- name = "magfoam dart"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-toy"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- light_range = 2
- light_color = LIGHT_COLOR_YELLOW
-
-/obj/item/ammo_casing/caseless/foam_dart/mag
- name = "magfoam dart"
- desc = "A foam dart with fun light-up projectiles powered by magnets!"
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag
-
-/obj/item/ammo_box/magazine/internal/shot/toy/mag
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- max_ammo = 14
-
-/obj/item/gun/ballistic/shotgun/toy/mag
- name = "foam force magpistol"
- desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "toymag"
- item_state = "gun"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
- fire_sound = 'sound/weapons/magpistol.ogg'
- slot_flags = SLOT_BELT
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/ammo_box/foambox/mag
- name = "ammo box (Magnetic Foam Darts)"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foambox"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- max_ammo = 42
-
-//////Magrifle//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/magrifle
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-large"
- damage = 20
- armour_penetration = 25
- light_range = 3
- speed = 0.7
- range = 35
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-large-nl"
- damage = 0
- knockdown = 0
- stamina = 25
- armour_penetration = -10
- light_range = 3
- speed = 0.65
- range = 35
- light_color = LIGHT_COLOR_BLUE
-
-///ammo casings///
-
-/obj/item/ammo_casing/caseless/amagm
- desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
- caliber = "magm"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/magrifle
-
-/obj/item/ammo_casing/caseless/anlmagm
- desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
- caliber = "magm"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mag-casing-live"
- projectile_type = /obj/item/projectile/bullet/nlmagrifle
-
-///magazines///
-
-/obj/item/ammo_box/magazine/mmag/
- name = "magrifle magazine (non-lethal disabler)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/anlmagm
- caliber = "magm"
- max_ammo = 24
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/mmag/lethal
- name = "magrifle magazine (lethal)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "mediummagmag"
- ammo_type = /obj/item/ammo_casing/caseless/amagm
- max_ammo = 24
-
-///the gun itself///
-
-/obj/item/gun/ballistic/automatic/magrifle
- name = "\improper Magnetic Rifle"
- desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magrifle"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/mmag
- fire_sound = 'sound/weapons/magrifle.ogg'
- can_suppress = 0
- burst_size = 3
- fire_delay = 2
- spread = 5
- recoil = 0.15
- casing_ejector = 0
-
-///research///
-
-/obj/item/gun/ballistic/automatic/magrifle/nopin
- pin = null
- spawnwithmagazine = FALSE
-
-/datum/design/magrifle
- name = "Magrifle"
- desc = "An upscaled Magpistol in rifle form."
- id = "magrifle"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
- build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
- category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle
- name = "Magrifle Magazine (Lethal)"
- desc = "A 24-round magazine for the Magrifle."
- id = "mag_magrifle"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
- build_path = /obj/item/ammo_box/magazine/mmag/lethal
- category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/mag_magrifle/nl
- name = "Magrifle Magazine (Non-Lethal)"
- desc = "A 24- round non-lethal magazine for the Magrifle."
- id = "mag_magrifle_nl"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
- build_path = /obj/item/ammo_box/magazine/mmag
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-
-///foamagrifle///
-
-/obj/item/ammo_box/magazine/toy/foamag
- name = "foam force magrifle magazine"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "foamagmag"
- max_ammo = 24
- multiple_sprites = 2
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/magrifle/toy
- name = "foamag rifle"
- desc = "A foam launching magnetic rifle. Ages 8 and up."
- icon_state = "foamagrifle"
- obj_flags = 0
- mag_type = /obj/item/ammo_box/magazine/toy/foamag
- casing_ejector = FALSE
- spread = 60
- w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_HEAVY
-
-/*
-// TECHWEBS IMPLEMENTATION
-*/
-
-/datum/techweb_node/magnetic_weapons
- id = "magnetic_weapons"
- display_name = "Magnetic Weapons"
- description = "Weapons using magnetic technology"
- prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
- design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
- research_cost = 2500
- export_price = 5000
-
-
-//////Hyper-Burst Rifle//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/mags/hyper
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile"
- damage = 10
- armour_penetration = 10
- stamina = 10
- forcedodge = TRUE
- range = 6
- light_range = 1
- light_color = LIGHT_COLOR_RED
-
-/obj/item/projectile/bullet/mags/hyper/inferno
- icon_state = "magjectile-large"
- stamina = 0
- forcedodge = FALSE
- range = 25
- light_range = 4
-
-/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 1, 2, 4, 5)
- return 1
-
-///ammo casings///
-
-/obj/item/ammo_casing/caseless/ahyper
- desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
- caliber = "hypermag"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "hyper-casing-live"
- projectile_type = /obj/item/projectile/bullet/mags/hyper
- pellets = 12
- variance = 40
-
-/obj/item/ammo_casing/caseless/ahyper/inferno
- projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
- pellets = 1
- variance = 0
-
-///magazines///
-
-/obj/item/ammo_box/magazine/mhyper
- name = "hyper-burst rifle magazine"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "hypermag-4"
- ammo_type = /obj/item/ammo_casing/caseless/ahyper
- caliber = "hypermag"
- desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/mhyper/update_icon()
- ..()
- icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
-
-/obj/item/ammo_box/magazine/mhyper/inferno
- name = "hyper-burst rifle magazine (inferno)"
- ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
- desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
-
-///gun itself///
-
-/obj/item/gun/ballistic/automatic/hyperburst
- name = "\improper Hyper-Burst Rifle"
- desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "hyperburst"
- item_state = "arg"
- slot_flags = 0
- mag_type = /obj/item/ammo_box/magazine/mhyper
- fire_sound = 'sound/weapons/magburst.ogg'
- can_suppress = 0
- burst_size = 1
- fire_delay = 40
- recoil = 2
- casing_ejector = 0
- weapon_weight = WEAPON_HEAVY
-
-/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
- ..()
- icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
-
-///toy memes///
-
-/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "magjectile-toy"
- name = "lasertag magbolt"
- forcedodge = TRUE //for penetration memes
- range = 5 //so it isn't super annoying
- light_range = 2
- light_color = LIGHT_COLOR_YELLOW
- eyeblur = 0
-
-/obj/item/ammo_casing/energy/laser/magtag
- projectile_type = /obj/item/projectile/beam/lasertag/mag
- select_name = "magtag"
- pellets = 3
- variance = 30
- e_cost = 1000
- fire_sound = 'sound/weapons/magburst.ogg'
-
-/obj/item/gun/energy/laser/practice/hyperburst
- name = "toy hyper-burst launcher"
- desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
- ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "toyburst"
- clumsy_check = FALSE
- obj_flags = 0
- fire_delay = 40
- weapon_weight = WEAPON_HEAVY
- selfcharge = TRUE
- charge_delay = 2
- recoil = 2
- cell_type = /obj/item/stock_parts/cell/toymagburst
-
-/obj/item/stock_parts/cell/toymagburst
- name = "toy mag burst rifle power supply"
- maxcharge = 4000
-
-/* made redundant by reskinnable stetchkins
-//////Stealth Pistol//////
-
-/obj/item/gun/ballistic/automatic/pistol/stealth
- name = "stealth pistol"
- desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "stealthpistol"
- w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/m10mm
- can_suppress = 0
- fire_sound = 'sound/weapons/gunshot_silenced.ogg'
- suppressed = 1
- burst_size = 1
-
-/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("stealthpistol-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-*/
-
-///foam stealth pistol///
-
-/obj/item/gun/ballistic/automatic/toy/pistol/stealth
- name = "foam force stealth pistol"
- desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "foamsp"
- w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/toy/pistol
- can_suppress = FALSE
- fire_sound = 'sound/weapons/gunshot_silenced.ogg'
- suppressed = TRUE
- burst_size = 1
- fire_delay = 0
- spread = 20
- actions_types = list()
-
-/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("foamsp-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-//////10mm soporific bullets//////
-
-obj/item/projectile/bullet/c10mm/soporific
- name ="10mm soporific bullet"
- armour_penetration = 0
- nodamage = TRUE
- dismemberment = 0
- knockdown = 0
-
-/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && isliving(target))
- var/mob/living/L = target
- L.blur_eyes(6)
- if(L.getStaminaLoss() >= 60)
- L.Sleeping(300)
- else
- L.adjustStaminaLoss(25)
- return 1
-
-/obj/item/ammo_casing/c10mm/soporific
- name = ".10mm soporific bullet casing"
- desc = "A 10mm soporific bullet casing."
- projectile_type = /obj/item/projectile/bullet/c10mm/soporific
-
-/obj/item/ammo_box/magazine/m10mm/soporific
- name = "pistol magazine (10mm soporific)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "9x19pS"
- desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target."
- ammo_type = /obj/item/ammo_casing/c10mm/soporific
-
-/obj/item/ammo_box/c10mm/soporific
- name = "ammo box (10mm soporific)"
- ammo_type = /obj/item/ammo_casing/c10mm/soporific
- max_ammo = 24
-
-//////Flechette Launcher//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/cflechetteap //shreds armor
- name = "flechette (armor piercing)"
- damage = 8
- armour_penetration = 80
-
-/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
- name = "flechette (serrated)"
- damage = 15
- dismemberment = 10
- armour_penetration = -80
-
-/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && iscarbon(target))
- var/mob/living/carbon/C = target
- C.bleed(10)
- return ..()
-
-///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
-
-/obj/item/ammo_casing/caseless/flechetteap
- name = "flechette (armor piercing)"
- desc = "A flechette made with a tungsten alloy."
- projectile_type = /obj/item/projectile/bullet/cflechetteap
- caliber = "flechette"
- throwforce = 1
- throw_speed = 3
-
-/obj/item/ammo_casing/caseless/flechettes
- name = "flechette (serrated)"
- desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
- projectile_type = /obj/item/projectile/bullet/cflechettes
- caliber = "flechette"
- throwforce = 2
- throw_speed = 3
- embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
-
-///magazine///
-
-/obj/item/ammo_box/magazine/flechette
- name = "flechette magazine (armor piercing)"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "flechettemag"
- ammo_type = /obj/item/ammo_casing/caseless/flechetteap
- caliber = "flechette"
- max_ammo = 40
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/flechette/s
- name = "flechette magazine (serrated)"
- ammo_type = /obj/item/ammo_casing/caseless/flechettes
-
-///the gun itself///
-
-/obj/item/gun/ballistic/automatic/flechette
- name = "\improper CX Flechette Launcher"
- desc = "A flechette launching machine pistol with an unconventional bullpup frame."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "flechettegun"
- item_state = "gun"
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = 0
- /obj/item/device/firing_pin/implant/pindicate
- mag_type = /obj/item/ammo_box/magazine/flechette/
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- can_suppress = 0
- burst_size = 5
- fire_delay = 1
- casing_ejector = 0
- spread = 10
- recoil = 0.05
-
-/obj/item/gun/ballistic/automatic/flechette/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("flechettegun-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-///unique variant///
-
-/obj/item/projectile/bullet/cflechetteshredder
- name = "flechette (shredder)"
- damage = 5
- dismemberment = 40
-
-/obj/item/ammo_casing/caseless/flechetteshredder
- name = "flechette (shredder)"
- desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
- projectile_type = /obj/item/projectile/bullet/cflechettes
-
-/obj/item/ammo_box/magazine/flechette/shredder
- name = "flechette magazine (shredder)"
- icon_state = "shreddermag"
- ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
-
-/obj/item/gun/ballistic/automatic/flechette/shredder
- name = "\improper CX Shredder"
- desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
- w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/flechette/shredder
- spread = 15
- recoil = 0.1
-
-/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("shreddergun-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-//////modular pistol////// (reskinnable stetchkins)
-
-/obj/item/gun/ballistic/automatic/pistol/modular
- name = "modular pistol"
- desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "cde"
- can_unsuppress = TRUE
- obj_flags = UNIQUE_RENAME
- unique_reskin = list("Default" = "cde",
- "NT-99" = "n99",
- "Stealth" = "stealthpistol",
- "HKVP-78" = "vp78",
- "Luger" = "p08b",
- "Mk.58" = "secguncomp",
- "PX4 Storm" = "px4"
- )
-
-/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
- ..()
- if(current_skin)
- icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
- else
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
- if(magazine && suppressed)
- cut_overlays()
- add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
- else if (magazine)
- cut_overlays()
- add_overlay("[unique_reskin[current_skin]]-magazine")
- else
- cut_overlays()
-
-/////////RAYGUN MEMES/////////
-
-/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "ray"
- name = "ray bolt"
- eyeblur = 0
-
-/obj/item/ammo_casing/energy/laser/raytag
- projectile_type = /obj/item/projectile/beam/lasertag/ray
- select_name = "raytag"
- fire_sound = 'sound/weapons/raygun.ogg'
-
-/obj/item/gun/energy/laser/practice/raygun
- name = "toy ray gun"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "raygun"
- desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems."
- ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
- selfcharge = TRUE
-
-/*/////////////////////////////////////////////////////////////////////////////////////////////
- The Recolourable Gun
-*//////////////////////////////////////////////////////////////////////////////////////////////
-
-/obj/item/gun/ballistic/automatic/pistol/p37
- name = "\improper CX Mk.37P"
- desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \
- This model is coated with a special polychromic material. \
- Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \
- Uses 9mm bullets loaded into proprietary magazines."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "p37"
- w_class = WEIGHT_CLASS_NORMAL
- spawnwithmagazine = FALSE
- mag_type = /obj/item/ammo_box/magazine/m9mm/p37
- can_suppress = FALSE
- pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it
- actions_types = list(/datum/action/item_action/pick_color)
-
- var/frame_color = "#808080" //RGB
- var/receiver_color = "#808080"
- var/body_color = "#0098FF"
- var/barrel_color = "#808080"
- var/tip_color = "#808080"
- var/arm_color = "#808080"
- var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it
- var/energy_color = "#00FFCB"
-
-///Defining all the colourable bits and displaying them///
-
-/obj/item/gun/ballistic/automatic/pistol/p37/update_icon()
- var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame")
- var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver")
- var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body")
- var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel")
- var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip")
- var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip")
- var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light")
- var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm")
- var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e")
-
- if(frame_color)
- frame_overlay.color = frame_color
- if(receiver_color)
- receiver_overlay.color = receiver_color
- if(body_color)
- body_overlay.color = body_color
- if(barrel_color)
- barrel_overlay.color = barrel_color
- if(tip_color)
- tip_overlay.color = tip_color
- if(grip_color)
- grip_overlay.color = grip_color
- if(energy_color)
- energy_overlay.color = energy_color
- if(arm_color)
- arm_overlay.color = arm_color
- if(arm_color)
- arm_overlay_e.color = arm_color
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(frame_overlay)
- add_overlay(receiver_overlay)
- add_overlay(body_overlay)
- add_overlay(barrel_overlay)
- add_overlay(tip_overlay)
- add_overlay(grip_overlay)
- add_overlay(energy_overlay)
-
- if(magazine) //does not need a cut_overlays proc call here because it's already called further up
- add_overlay("p37_mag")
-
- if(chambered)
- cut_overlay(arm_overlay_e)
- add_overlay(arm_overlay)
- else
- cut_overlay(arm_overlay)
- add_overlay(arm_overlay_e)
-
-///letting you actually recolor things///
-
-/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A)
- if(istype(A, /datum/action/item_action/pick_color))
-
- var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color",
- "Barrel Color", "Barrel Tip Color", "Grip Light Color",
- "Light Color", "Arm Color", "*CANCEL*")
-
- switch(choice)
-
- if("Frame Color")
- var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null
- if(frame_color_input)
- frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Receiver Color")
- var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null
- if(receiver_color_input)
- receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Body Color")
- var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
- if(body_color_input)
- body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Barrel Color")
- var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null
- if(barrel_color_input)
- barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Barrel Tip Color")
- var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null
- if(tip_color_input)
- tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Grip Light Color")
- var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null
- if(grip_color_input)
- grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Light Color")
- var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null
- if(energy_color_input)
- energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
- if("Arm Color")
- var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null
- if(arm_color_input)
- arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1)
- update_icon()
- A.UpdateButtonIcon()
-
- else
- ..()
-
-///boolets///
-
-/obj/item/projectile/bullet/c9mm/frangible
- name = "9mm frangible bullet"
- damage = 15
- stamina = 0
- speed = 1.0
- range = 20
- armour_penetration = -25
-
-/obj/item/projectile/bullet/c9mm/rubber
- name = "9mm rubber bullet"
- damage = 5
- stamina = 30
- speed = 1.2
- range = 14
- knockdown = 0
-
-/obj/item/ammo_casing/c9mm/frangible
- name = "9mm frangible bullet casing"
- desc = "A 9mm frangible bullet casing."
- projectile_type = /obj/item/projectile/bullet/c9mm/frangible
-
-/obj/item/ammo_casing/c9mm/rubber
- name = "9mm rubber bullet casing"
- desc = "A 9mm rubber bullet casing."
- projectile_type = /obj/item/projectile/bullet/c9mm/rubber
-
-/obj/item/ammo_box/magazine/m9mm/p37
- name = "\improper P37 magazine (9mm frangible)"
- desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "11mm" //topkek
- ammo_type = /obj/item/ammo_casing/c9mm/frangible
- caliber = "9mm"
- max_ammo = 11
- multiple_sprites = 1
-
-/obj/item/ammo_box/magazine/m9mm/p37/fmj
- name = "\improper P37 magazine (9mm)"
- ammo_type = /obj/item/ammo_casing/c9mm
- desc = "A gun magazine. Loaded with conventional full metal jacket rounds."
-
-/obj/item/ammo_box/magazine/m9mm/p37/rubber
- name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)"
- ammo_type = /obj/item/ammo_casing/c9mm/rubber
- desc = "A gun magazine. Loaded with less-than-lethal rubber bullets."
-
-/obj/item/ammo_box/c9mm/frangible
- name = "ammo box (9mm frangible)"
- ammo_type = /obj/item/ammo_casing/c9mm/frangible
-
-/obj/item/ammo_box/c9mm/rubber
- name = "ammo box (9mm non-lethal rubbershot)"
- ammo_type = /obj/item/ammo_casing/c9mm/rubber
-
-/datum/design/c9mmfrag
- name = "Box of 9mm Frangible Bullets"
- id = "9mm_frag"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 25000)
- build_path = /obj/item/ammo_box/c9mm/frangible
- category = list("hacked", "Security")
-
-/datum/design/c9mmrubber
- name = "Box of 9mm Rubber Bullets"
- id = "9mm_rubber"
- build_type = AUTOLATHE
- materials = list(MAT_METAL = 30000)
- build_path = /obj/item/ammo_box/c9mm/rubber
- category = list("initial", "Security")
-
-
-///Security Variant///
-
-/obj/item/gun/ballistic/automatic/pistol/p37/sec
- name = "\improper CX Mk.37S"
- desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines."
- spawnwithmagazine = FALSE
- pin = /obj/item/device/firing_pin/implant/mindshield
- actions_types = list() //so you can't recolor it
-
- frame_color = "#808080" //RGB
- receiver_color = "#808080"
- body_color = "#282828"
- barrel_color = "#808080"
- tip_color = "#808080"
- arm_color = "#800000"
- grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it
- energy_color = "#FFFF00"
-
-///Foam Variant because WE NEED MEMES///
-
-/obj/item/gun/ballistic/automatic/pistol/p37/foam
- name = "\improper Foam Force Mk.37F"
- desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines."
- icon_state = "p37_foam"
- pin = /obj/item/device/firing_pin
- spawnwithmagazine = TRUE
- obj_flags = 0
- casing_ejector = FALSE
- mag_type = /obj/item/ammo_box/magazine/toy/pistol
- can_suppress = FALSE
- actions_types = list(/datum/action/item_action/pick_color)
-
-/*/////////////////////////////////////////////////////////////////////////////////////////////
- The Recolourable Energy Gun
-*//////////////////////////////////////////////////////////////////////////////////////////////
-
-obj/item/gun/energy/e_gun/cx
- name = "\improper CX Model D Energy Gun"
- desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "cxe"
- lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi'
- righthand_file = 'icons/mob/citadel/guns_righthand.dmi'
- ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
- flight_x_offset = 15
- flight_y_offset = 10
- var/body_color = "#252528"
-
-obj/item/gun/energy/e_gun/cx/update_icon()
- ..()
- var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body")
- if(body_color)
- body_overlay.color = body_color
- add_overlay(body_overlay)
-
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
-
-obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- return
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
- if(body_color_input)
- body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
-obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
- . = ..()
- if(isinhands)
- var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body")
- body_inhand.color = body_color
- . += body_inhand
-
-/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit
- materials = list(MAT_METAL = 200)
-
-/*/////////////////////////////////////////////////////////////
-//////////////////////// Zero's Meme //////////////////////////
-*//////////////////////////////////////////////////////////////
-/obj/item/ammo_box/magazine/toy/AM4B
- name = "foam force AM4-B magazine"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "AM4MAG-60"
- max_ammo = 60
- multiple_sprites = 0
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/AM4B
- name = "AM4-B"
- desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "AM4"
- item_state = "arg"
- mag_type = /obj/item/ammo_box/magazine/toy/AM4B
- can_suppress = 0
- item_flags = NEEDS_PERMIT
- casing_ejector = 0
- spread = 30 //Assault Rifleeeeeee
- w_class = WEIGHT_CLASS_NORMAL
- burst_size = 4 //Shh.
- fire_delay = 1
- var/body_color = "#3333aa"
-
-/obj/item/gun/ballistic/automatic/AM4B/update_icon()
- ..()
- var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body")
- if(body_color)
- body_overlay.color = body_color
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
- add_overlay(body_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
-/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- return
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null
- if(body_color_input)
- body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
- update_icon()
-/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it.")
-
-/obj/item/ammo_box/magazine/toy/AM4C
- name = "foam force AM4-C magazine"
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "AM4MAG-32"
- max_ammo = 32
- multiple_sprites = 0
- materials = list(MAT_METAL = 200)
-
-/obj/item/gun/ballistic/automatic/AM4C
- name = "AM4-C"
- desc = "A Relic from a bygone age. This one seems newer, yet less effective."
- icon = 'icons/obj/guns/cit_guns.dmi'
- icon_state = "AM4C"
- item_state = "arg"
- mag_type = /obj/item/ammo_box/magazine/toy/AM4C
- can_suppress = 0
- item_flags = NEEDS_PERMIT
- casing_ejector = 0
- spread = 45 //Assault Rifleeeeeee
- w_class = WEIGHT_CLASS_NORMAL
- burst_size = 4 //Shh.
- fire_delay = 1
diff --git a/code/citadel/cit_uniforms.dm b/code/citadel/cit_uniforms.dm
deleted file mode 100644
index fc7e03a676..0000000000
--- a/code/citadel/cit_uniforms.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/obj/item/clothing/under/bb_sweater
- name = "cream sweater"
- desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north."
- icon_state = "bb_turtle"
- item_state = "w_suit"
- item_color = "bb_turtle"
- body_parts_covered = CHEST|ARMS
- can_adjust = 1
- icon = 'icons/obj/clothing/turtlenecks.dmi'
- icon_override = 'icons/mob/citadel/uniforms.dmi'
-
-/obj/item/clothing/under/bb_sweater/black
- name = "black sweater"
- icon_state = "bb_turtleblk"
- item_state = "bl_suit"
- item_color = "bb_turtleblk"
-
-/obj/item/clothing/under/bb_sweater/purple
- name = "purple sweater"
- icon_state = "bb_turtlepur"
- item_state = "p_suit"
- item_color = "bb_turtlepur"
-
-/obj/item/clothing/under/bb_sweater/green
- name = "green sweater"
- icon_state = "bb_turtlegrn"
- item_state = "g_suit"
- item_color = "bb_turtlegrn"
-
-/obj/item/clothing/under/bb_sweater/red
- name = "red sweater"
- icon_state = "bb_turtlered"
- item_state = "r_suit"
- item_color = "bb_turtlered"
-
-/obj/item/clothing/under/bb_sweater/blue
- name = "blue sweater"
- icon_state = "bb_turtleblu"
- item_state = "b_suit"
- item_color = "bb_turtleblu"
diff --git a/code/citadel/cit_vendors.dm b/code/citadel/cit_vendors.dm
deleted file mode 100644
index c8ae48c251..0000000000
--- a/code/citadel/cit_vendors.dm
+++ /dev/null
@@ -1,102 +0,0 @@
-#define STANDARD_CHARGE 1
-#define CONTRABAND_CHARGE 2
-#define COIN_CHARGE 3
-
-/obj/machinery/vending/kink
- name = "KinkMate"
- desc = "A vending machine for all your unmentionable desires."
- icon = 'icons/obj/citvending.dmi'
- icon_state = "kink"
- product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
- vend_reply = "Have fun, you shameless pervert!"
- products = list(
- /obj/item/clothing/under/maid = 5,
- /obj/item/clothing/under/stripper_pink = 5,
- /obj/item/clothing/under/stripper_green = 5,
- /obj/item/dildo/custom = 5
- )
- contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
- /obj/item/clothing/neck/petcollar = 5,
- /obj/item/clothing/under/mankini = 1,
- /obj/item/dildo/flared/huge = 1
- )
- premium = list(/obj/item/device/electropack/shockcollar = 1)
- refill_canister = /obj/item/vending_refill/kink
-/*
-/obj/machinery/vending/nazivend
- name = "Nazivend"
- desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\""
- icon = 'icons/obj/citvending.dmi'
- icon_state = "nazi"
- vend_reply = "SIEG HEIL!"
- product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*"
- products = list(
- /obj/item/clothing/head/stalhelm = 20,
- /obj/item/clothing/head/panzer = 20,
- /obj/item/clothing/suit/soldiercoat = 20,
- // /obj/item/clothing/under/soldieruniform = 20,
- /obj/item/clothing/shoes/jackboots = 20
- )
- contraband = list(
- /obj/item/clothing/head/naziofficer = 10,
- // /obj/item/clothing/suit/officercoat = 10,
- // /obj/item/clothing/under/officeruniform = 10,
- /obj/item/clothing/suit/space/hardsuit/nazi = 3,
- /obj/item/gun/energy/plasma/MP40k = 4
- )
- premium = list()
-
- refill_canister = /obj/item/vending_refill/nazi
-*/
-/obj/machinery/vending/sovietvend
- name = "KomradeVendtink"
- desc = "Rodina-mat' zovyot!"
- icon = 'icons/obj/citvending.dmi'
- icon_state = "soviet"
- vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!"
- product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!"
- products = list(
- /obj/item/clothing/under/soviet = 20,
- /obj/item/clothing/head/ushanka = 20,
- /obj/item/clothing/shoes/jackboots = 20,
- /obj/item/clothing/head/squatter_hat = 20,
- /obj/item/clothing/under/squatter_outfit = 20,
- /obj/item/clothing/under/russobluecamooutfit = 20,
- /obj/item/clothing/head/russobluecamohat = 20
- )
- contraband = list(
- /obj/item/clothing/under/syndicate/tacticool = 4,
- /obj/item/clothing/mask/balaclava = 4,
- /obj/item/clothing/suit/russofurcoat = 4,
- /obj/item/clothing/head/russofurhat = 4,
- /obj/item/clothing/suit/space/hardsuit/soviet = 3,
- /obj/item/gun/energy/laser/LaserAK = 4
- )
- premium = list()
-
- refill_canister = /obj/item/vending_refill/soviet
-
-
-#undef STANDARD_CHARGE
-#undef CONTRABAND_CHARGE
-#undef COIN_CHARGE
-
-
-/obj/item/vending_refill/kink
- machine_name = "KinkMate"
- icon = 'modular_citadel/icons/vending_restock.dmi'
- icon_state = "refill_kink"
- charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
- init_charges = list(8, 5, 0)
-
-/obj/item/vending_refill/nazi
- machine_name = "nazivend"
- icon_state = "refill_nazi"
- charges = list(33, 13, 0)
- init_charges = list(33, 13, 0)
-
-/obj/item/vending_refill/soviet
- machine_name = "sovietvend"
- icon_state = "refill_soviet"
- charges = list(47, 7, 0)
- init_charges = list(47, 7, 0)
diff --git a/code/citadel/discordbot.dm b/code/citadel/discordbot.dm
deleted file mode 100644
index 41c0f21b49..0000000000
--- a/code/citadel/discordbot.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/proc/send2maindiscord(var/msg)
- send2discord(msg, FALSE)
-
-/proc/send2admindiscord(var/msg, var/ping = FALSE)
- send2discord(msg, TRUE, ping)
-
-/proc/send2discord(var/msg, var/admin = FALSE, var/ping = FALSE)
-// if (!config.discord_url || !config.discord_password)
-// return
-
-// var/url = "[config.discord_url]?pass=[url_encode(config.discord_password)]&admin=[admin ? "true" : "false"]&content=[url_encode(msg)]&ping=[ping ? "true" : "false"]"
-// world.Export(url)
- return
\ No newline at end of file
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
deleted file mode 100644
index 1e4a574e13..0000000000
--- a/code/controllers/configuration.dm
+++ /dev/null
@@ -1,287 +0,0 @@
-GLOBAL_VAR_INIT(config_dir, "config/")
-GLOBAL_PROTECT(config_dir)
-
-/datum/controller/configuration
- name = "Configuration"
-
- var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it
- var/list/entries
- var/list/entries_by_type
-
- var/list/maplist
- var/datum/map_config/defaultmap
-
- var/list/modes // allowed modes
- var/list/gamemode_cache
- var/list/votable_modes // votable modes
- var/list/mode_names
- var/list/mode_reports
- var/list/mode_false_report_weight
-
-/datum/controller/configuration/New()
- config = src
- var/list/config_files = InitEntries()
- LoadModes()
- for(var/I in config_files)
- LoadEntries(I)
- if(Get(/datum/config_entry/flag/maprotation))
- loadmaplist(CONFIG_MAPS_FILE)
-
-/datum/controller/configuration/Destroy()
- entries_by_type.Cut()
- QDEL_LIST_ASSOC_VAL(entries)
- QDEL_LIST_ASSOC_VAL(maplist)
- QDEL_NULL(defaultmap)
-
- config = null
-
- return ..()
-
-/datum/controller/configuration/proc/InitEntries()
- var/list/_entries = list()
- entries = _entries
- var/list/_entries_by_type = list()
- entries_by_type = _entries_by_type
-
- . = list()
-
- for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case
- var/datum/config_entry/E = I
- if(initial(E.abstract_type) == I)
- continue
- E = new I
- _entries_by_type[I] = E
- var/esname = E.name
- var/datum/config_entry/test = _entries[esname]
- if(test)
- log_config("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!")
- qdel(E)
- continue
- _entries[esname] = E
- .[E.resident_file] = TRUE
-
-/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE)
- entries -= CE.name
- entries_by_type -= CE.type
-
-/datum/controller/configuration/proc/LoadEntries(filename)
- log_config("Loading config file [filename]...")
- var/list/lines = world.file2list("[GLOB.config_dir][filename]")
- var/list/_entries = entries
- for(var/L in lines)
- if(!L)
- continue
-
- if(copytext(L, 1, 2) == "#")
- continue
-
- var/pos = findtext(L, " ")
- var/entry = null
- var/value = null
-
- if(pos)
- entry = lowertext(copytext(L, 1, pos))
- value = copytext(L, pos + 1)
- else
- entry = lowertext(L)
-
- if(!entry)
- continue
-
- var/datum/config_entry/E = _entries[entry]
- if(!E)
- log_config("Unknown setting in configuration: '[entry]'")
- continue
-
- if(filename != E.resident_file)
- log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.")
- continue
-
- var/validated = E.ValidateAndSet(value)
- if(!validated)
- log_config("Failed to validate setting \"[value]\" for [entry]")
- else if(E.modified && !E.dupes_allowed)
- log_config("Duplicate setting for [entry] ([value]) detected! Using latest.")
-
- if(validated)
- E.modified = TRUE
-
-/datum/controller/configuration/can_vv_get(var_name)
- return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..()
-
-/datum/controller/configuration/vv_edit_var(var_name, var_value)
- return !(var_name in list("entries_by_type", "entries")) && ..()
-
-/datum/controller/configuration/stat_entry()
- if(!statclick)
- statclick = new/obj/effect/statclick/debug(null, "Edit", src)
- stat("[name]:", statclick)
-
-/datum/controller/configuration/proc/Get(entry_type)
- if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "\ref[src]")
- log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]")
- return
- var/datum/config_entry/E = entry_type
- var/entry_is_abstract = initial(E.abstract_type) == entry_type
- if(entry_is_abstract)
- CRASH("Tried to retrieve an abstract config_entry: [entry_type]")
- E = entries_by_type[entry_type]
- if(!E)
- CRASH("Missing config entry for [entry_type]!")
- return E.value
-
-/datum/controller/configuration/proc/Set(entry_type, new_val)
- if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "\ref[src]")
- log_admin_private("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]")
- return
- var/datum/config_entry/E = entry_type
- var/entry_is_abstract = initial(E.abstract_type) == entry_type
- if(entry_is_abstract)
- CRASH("Tried to retrieve an abstract config_entry: [entry_type]")
- E = entries_by_type[entry_type]
- if(!E)
- CRASH("Missing config entry for [entry_type]!")
- return E.ValidateAndSet(new_val)
-
-/datum/controller/configuration/proc/LoadModes()
- gamemode_cache = typecacheof(/datum/game_mode, TRUE)
- modes = list()
- mode_names = list()
- mode_reports = list()
- mode_false_report_weight = list()
- votable_modes = list()
- var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability)
- for(var/T in gamemode_cache)
- // I wish I didn't have to instance the game modes in order to look up
- // their information, but it is the only way (at least that I know of).
- var/datum/game_mode/M = new T()
-
- if(M.config_tag)
- if(!(M.config_tag in modes)) // ensure each mode is added only once
- modes += M.config_tag
- mode_names[M.config_tag] = M.name
- probabilities[M.config_tag] = M.probability
- mode_reports[M.config_tag] = M.generate_report()
- mode_false_report_weight[M.config_tag] = M.false_report_weight
- if(M.votable)
- votable_modes += M.config_tag
- qdel(M)
- votable_modes += "secret"
-
-/datum/controller/configuration/proc/loadmaplist(filename)
- filename = "[GLOB.config_dir][filename]"
- var/list/Lines = world.file2list(filename)
-
- var/datum/map_config/currentmap = null
- for(var/t in Lines)
- if(!t)
- continue
-
- t = trim(t)
- if(length(t) == 0)
- continue
- else if(copytext(t, 1, 2) == "#")
- continue
-
- var/pos = findtext(t, " ")
- var/command = null
- var/data = null
-
- if(pos)
- command = lowertext(copytext(t, 1, pos))
- data = copytext(t, pos + 1)
- else
- command = lowertext(t)
-
- if(!command)
- continue
-
- if (!currentmap && command != "map")
- continue
-
- switch (command)
- if ("map")
- currentmap = new ("_maps/[data].json")
- if(currentmap.defaulted)
- log_config("Failed to load map config for [data]!")
- if ("minplayers","minplayer")
- currentmap.config_min_users = text2num(data)
- if ("maxplayers","maxplayer")
- currentmap.config_max_users = text2num(data)
- if ("weight","voteweight")
- currentmap.voteweight = text2num(data)
- if ("default","defaultmap")
- defaultmap = currentmap
- if ("endmap")
- LAZYINITLIST(maplist)
- maplist[currentmap.map_name] = currentmap
- currentmap = null
- if ("disabled")
- currentmap = null
- else
- WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'")
-
-
-/datum/controller/configuration/proc/pick_mode(mode_name)
- // I wish I didn't have to instance the game modes in order to look up
- // their information, but it is the only way (at least that I know of).
- // ^ This guy didn't try hard enough
- for(var/T in gamemode_cache)
- var/datum/game_mode/M = T
- var/ct = initial(M.config_tag)
- if(ct && ct == mode_name)
- return new T
- return new /datum/game_mode/extended()
-
-/datum/controller/configuration/proc/get_runnable_modes()
- var/list/datum/game_mode/runnable_modes = new
- var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability)
- var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop)
- var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop)
- var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
- for(var/T in gamemode_cache)
- var/datum/game_mode/M = new T()
- if(!(M.config_tag in modes))
- qdel(M)
- continue
- if(probabilities[M.config_tag]<=0)
- qdel(M)
- continue
- if(min_pop[M.config_tag])
- M.required_players = min_pop[M.config_tag]
- if(max_pop[M.config_tag])
- M.maximum_players = max_pop[M.config_tag]
- if(M.can_start())
- var/final_weight = probabilities[M.config_tag]
- if(SSpersistence.saved_modes.len == 3 && repeated_mode_adjust.len == 3)
- var/recent_round = min(SSpersistence.saved_modes.Find(M.config_tag),3)
- var/adjustment = 0
- while(recent_round)
- adjustment += repeated_mode_adjust[recent_round]
- recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0)
- final_weight *= ((100-adjustment)/100)
- runnable_modes[M] = final_weight
- return runnable_modes
-
-/datum/controller/configuration/proc/get_runnable_midround_modes(crew)
- var/list/datum/game_mode/runnable_modes = new
- var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability)
- var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop)
- var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop)
- for(var/T in (gamemode_cache - SSticker.mode.type))
- var/datum/game_mode/M = new T()
- if(!(M.config_tag in modes))
- qdel(M)
- continue
- if(probabilities[M.config_tag]<=0)
- qdel(M)
- continue
- if(min_pop[M.config_tag])
- M.required_players = min_pop[M.config_tag]
- if(max_pop[M.config_tag])
- M.maximum_players = max_pop[M.config_tag]
- if(M.required_players <= crew)
- if(M.maximum_players >= 0 && M.maximum_players < crew)
- continue
- runnable_modes[M] = probabilities[M.config_tag]
- return runnable_modes
diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm
deleted file mode 100644
index 42212e266c..0000000000
--- a/code/controllers/hooks-defs.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * Startup hook.
- * Called in world.dm when the server starts.
- */
-/hook/startup
-
-/**
- * Roundstart hook.
- * Called in gameticker.dm when a round starts.
- */
-/hook/roundstart
-
-/**
- * Roundend hook.
- * Called in gameticker.dm when a round ends.
- */
-/hook/roundend
-
-/**
- * Death hook.
- * Called in death.dm when someone dies.
- * Parameters: var/mob/living/carbon/human, var/gibbed
- */
-/hook/death
-
-/**
- * Cloning hook.
- * Called in cloning.dm when someone is brought back by the wonders of modern science.
- * Parameters: var/mob/living/carbon/human
- */
-/hook/clone
-
-/**
- * Debrained hook.
- * Called in brain_item.dm when someone gets debrained.
- * Parameters: var/obj/item/organ/brain
- */
-/hook/debrain
-
-/**
- * Borged hook.
- * Called in robot_parts.dm when someone gets turned into a cyborg.
- * Parameters: var/mob/living/silicon/robot
- */
-/hook/borgify
-
-/**
- * Podman hook.
- * Called in podmen.dm when someone is brought back as a Diona.
- * Parameters: var/mob/living/carbon/alien/diona
- */
-/hook/harvest_podman
-
-/**
- * Payroll revoked hook.
- * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal.
- * Parameters: var/datum/money_account
- */
-/hook/revoke_payroll
-
-/**
- * Account suspension hook.
- * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal.
- * Parameters: var/datum/money_account
- */
-/hook/change_account_status
-
-/**
- * Employee reassignment hook.
- * Called in card.dm when someone's card is reassigned at the HoP's desk.
- * Parameters: var/obj/item/card/id
- */
-/hook/reassign_employee
-
-/**
- * Employee terminated hook.
- * Called in card.dm when someone's card is terminated at the HoP's desk.
- * Parameters: var/obj/item/card/id
- */
-/hook/terminate_employee
-
-/**
- * Crate sold hook.
- * Called in supplyshuttle.dm when a crate is sold on the shuttle.
- * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle
- */
-/hook/sell_crate
diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm
deleted file mode 100644
index 1e3a6f8a6e..0000000000
--- a/code/controllers/subsystem/explosion.dm
+++ /dev/null
@@ -1,510 +0,0 @@
-SUBSYSTEM_DEF(explosion)
- priority = 99
- wait = 1
- flags = SS_TICKER|SS_NO_INIT
-
- var/list/explosions
-
- var/rebuild_tick_split_count = FALSE
- var/tick_portions_required = 0
-
- var/list/logs
-
- var/list/zlevels_that_ignore_bombcap
- var/list/doppler_arrays
-
- //legacy caps, set by config
- var/devastation_cap = 3
- var/heavy_cap = 7
- var/light_cap = 14
- var/flash_cap = 14
- var/flame_cap = 14
- var/dyn_ex_scale = 0.5
-
- var/id_counter = 0
-
-/datum/controller/subsystem/explosion/PreInit()
- doppler_arrays = list()
- logs = list()
- explosions = list()
- zlevels_that_ignore_bombcap = list("[ZLEVEL_MINING]")
-
-/datum/controller/subsystem/explosion/Shutdown()
- QDEL_LIST(explosions)
- QDEL_LIST(logs)
- zlevels_that_ignore_bombcap.Cut()
-
-/datum/controller/subsystem/explosion/Recover()
- explosions = SSexplosion.explosions
- logs = SSexplosion.logs
- id_counter = SSexplosion.id_counter
- rebuild_tick_split_count = TRUE
- zlevels_that_ignore_bombcap = SSexplosion.zlevels_that_ignore_bombcap
- doppler_arrays = SSexplosion.doppler_arrays
-
- devastation_cap = SSexplosion.devastation_cap
- heavy_cap = SSexplosion.heavy_cap
- light_cap = SSexplosion.light_cap
- flash_cap = SSexplosion.flash_cap
- flame_cap = SSexplosion.flame_cap
- dyn_ex_scale = SSexplosion.dyn_ex_scale
-
-/datum/controller/subsystem/explosion/fire()
- var/list/cached_explosions = explosions
- var/num_explosions = cached_explosions.len
- if(!num_explosions)
- return
-
- //figure exactly how many tick splits are required
- var/num_splits
- if(rebuild_tick_split_count)
- var/reactionary = config.reactionary_explosions
- num_splits = num_explosions
- for(var/I in cached_explosions)
- var/datum/explosion/E = I
- if(!E.turfs_processed)
- ++num_splits
- if(reactionary && !E.densities_processed)
- ++num_splits
- tick_portions_required = num_splits
- else
- num_splits = tick_portions_required
-
- MC_SPLIT_TICK_INIT(num_splits)
-
- for(var/I in cached_explosions)
- var/datum/explosion/E = I
-
- var/etp = E.turfs_processed
- if(!etp)
- if(GatherTurfs(E))
- --tick_portions_required
- etp = TRUE
- MC_SPLIT_TICK
-
- var/edp = E.densities_processed
- if(!edp)
- if(DensityCalculate(E, etp))
- --tick_portions_required
- edp = TRUE
- MC_SPLIT_TICK
-
- if(ProcessExplosion(E, edp)) //splits the tick
- --tick_portions_required
- explosions -= E
- logs += E
- NotifyDopplers(E)
- MC_SPLIT_TICK
-
-/datum/controller/subsystem/explosion/proc/NotifyDopplers(datum/explosion/E)
- for(var/array in doppler_arrays)
- var/obj/machinery/doppler_array/A = array
- A.sense_explosion(E.epicenter, E.devastation, E.heavy, E.light, E.finished_at - E.started_at, E.orig_dev_range, E.orig_heavy_range, E.orig_light_range)
-
-/datum/controller/subsystem/explosion/proc/Create(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = TRUE, ignorecap = FALSE, flame_range = 0 , silent = FALSE, smoke = FALSE)
- epicenter = get_turf(epicenter)
- if(!epicenter)
- return
-
- if(adminlog)
- message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [get_area(epicenter)] [ADMIN_COORDJMP(epicenter)]")
- log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
-
- var/datum/explosion/E = new(++id_counter, epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap)
-
- if(heavy_impact_range > 1)
- var/datum/effect_system/explosion/Eff
- if(smoke)
- Eff = new /datum/effect_system/explosion/smoke
- else
- Eff = new
- Eff.set_up(epicenter)
- Eff.start()
-
- //flash mobs
- if(flash_range)
- for(var/mob/living/L in viewers(flash_range, epicenter))
- L.flash_act()
-
- if(!silent)
- ExplosionSound(epicenter, devastation_range, heavy_impact_range, E.extent)
-
- //add to SS
- if(E.extent)
- tick_portions_required += 2 + (config.reactionary_explosions ? 1 : 0)
- explosions += E
- else
- logs += E //Already done processing
-
-/datum/controller/subsystem/explosion/proc/CreateDynamic(atom/epicenter, power, flash_range, adminlog = TRUE, ignorecap = TRUE, flame_range = 0 , silent = FALSE, smoke = TRUE)
- if(!power)
- return
- var/range = round((2 * power) ** dyn_ex_scale)
- Create(epicenter, round(range * 0.25), round(range * 0.5), round(range), flash_range*range, adminlog, ignorecap, flame_range*range, silent, smoke)
-
-// Using default dyn_ex scale:
-// 100 explosion power is a (5, 10, 20) explosion.
-// 75 explosion power is a (4, 8, 17) explosion.
-// 50 explosion power is a (3, 7, 14) explosion.
-// 25 explosion power is a (2, 5, 10) explosion.
-// 10 explosion power is a (1, 3, 6) explosion.
-// 5 explosion power is a (0, 1, 3) explosion.
-// 1 explosion power is a (0, 0, 1) explosion.
-
-/datum/explosion
- var/explosion_id
- var/turf/epicenter
-
- var/started_at
- var/finished_at
- var/tick_started
- var/tick_finished
-
- var/turfs_processed = FALSE
- var/densities_processed = FALSE
-
- var/orig_dev_range
- var/orig_heavy_range
- var/orig_light_range
- var/orig_flash_range
- var/orig_flame_range
-
- var/devastation
- var/heavy
- var/light
- var/extent
-
- var/flash
- var/flame
-
- var/gather_dist = 0
-
- var/list/gathered_turfs
- var/list/calculated_turfs
-
- var/list/unsafe_turfs
-
-/datum/explosion/New(id, turf/epi, devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range, silent, smoke, ignorecap)
- explosion_id = id
- epicenter = epi
-
- densities_processed = !config.reactionary_explosions
-
- orig_dev_range = devastation_range
- orig_heavy_range = heavy_impact_range
- orig_light_range = light_impact_range
- orig_flash_range = flash_range
- orig_flame_range = flame_range
-
- if(!ignorecap && !("[epicenter.z]" in SSexplosion.zlevels_that_ignore_bombcap))
- //Clamp all values
- devastation_range = min(SSexplosion.devastation_cap, devastation_range)
- heavy_impact_range = min(SSexplosion.heavy_cap, heavy_impact_range)
- light_impact_range = min(SSexplosion.light_cap, light_impact_range)
- flash_range = min(SSexplosion.flash_cap, flash_range)
- flame_range = min(SSexplosion.flame_cap, flame_range)
-
- //store this
- devastation = devastation_range
- heavy = heavy_impact_range
- light = light_impact_range
-
- extent = max(devastation_range, heavy_impact_range, light_impact_range, flame_range)
-
- flash = flash_range
- flame = flame_range
-
- started_at = REALTIMEOFDAY
- tick_started = world.time
-
- gathered_turfs = list()
- calculated_turfs = list()
- unsafe_turfs = list()
-
-// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
-// Stereo users will also hear the direction of the explosion!
-
-// Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions.
-// 3/7/14 will calculate to 80 + 35
-/proc/ExplosionSound(turf/epicenter, devastation_range, heavy_impact_range, extent)
- var/far_dist = 0
- far_dist += heavy_impact_range * 5
- far_dist += devastation_range * 20
-
- var/z0 = epicenter.z
-
- var/frequency = get_rand_frequency()
- var/ex_sound = get_sfx("explosion")
- for(var/mob/M in GLOB.player_list)
- // Double check for client
- var/turf/M_turf = get_turf(M)
- if(M_turf && M_turf.z == z0)
- var/dist = get_dist(M_turf, epicenter)
- // If inside the blast radius + world.view - 2
- if(dist <= round(extent + world.view - 2, 1))
- M.playsound_local(epicenter, ex_sound, 100, 1, frequency, falloff = 5)
- // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
- else if(dist <= far_dist)
- var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
- far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
- M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
-
-/datum/explosion/Destroy()
- SSexplosion.explosions -= src
- SSexplosion.logs -= src
- LAZYCLEARLIST(gathered_turfs)
- LAZYCLEARLIST(calculated_turfs)
- LAZYCLEARLIST(unsafe_turfs)
- return ..()
-
-/datum/controller/subsystem/explosion/proc/GatherTurfs(datum/explosion/E)
- var/turf/epicenter = E.epicenter
-
- var/x0 = epicenter.x
- var/y0 = epicenter.y
- var/z0 = epicenter.z
-
- var/c_dist = E.gather_dist
- var/dist = E.extent
-
- var/list/L = E.gathered_turfs
-
- if(!c_dist)
- L += epicenter
- ++c_dist
-
- while( c_dist <= dist )
- var/y = y0 + c_dist
- var/x = x0 - c_dist + 1
- for(x in x to x0 + c_dist)
- var/turf/T = locate(x, y, z0)
- if(T)
- L += T
-
- y = y0 + c_dist - 1
- x = x0 + c_dist
- for(y in y0 - c_dist to y)
- var/turf/T = locate(x, y, z0)
- if(T)
- L += T
-
- y = y0 - c_dist
- x = x0 + c_dist - 1
- for(x in x0 - c_dist to x)
- var/turf/T = locate(x, y, z0)
- if(T)
- L += T
-
- y = y0 - c_dist + 1
- x = x0 - c_dist
- for(y in y to y0 + c_dist)
- var/turf/T = locate(x, y, z0)
- if(T)
- L += T
- ++c_dist
-
- if(MC_TICK_CHECK)
- break
-
- if(c_dist > dist)
- E.turfs_processed = TRUE
- return TRUE
- else
- E.gather_dist = c_dist
- return FALSE
-
-/datum/controller/subsystem/explosion/proc/DensityCalculate(datum/explosion/E, done_gathering_turfs)
- var/list/L = E.calculated_turfs
- var/cut_to = 1
- for(var/I in E.gathered_turfs) // we cache the explosion block rating of every turf in the explosion area
- var/turf/T = I
- ++cut_to
-
- var/current_exp_block = T.density ? T.explosion_block : 0
-
- for(var/obj/machinery/door/D in T)
- if(D.density)
- current_exp_block += D.explosion_block
-
- for(var/obj/structure/window/W in T)
- if(W.reinf && W.fulltile)
- current_exp_block += W.explosion_block
-
- for(var/obj/structure/blob/B in T)
- current_exp_block += B.explosion_block
-
- L[T] = current_exp_block
-
- if(MC_TICK_CHECK)
- E.gathered_turfs.Cut(1, cut_to)
- return FALSE
-
- E.gathered_turfs.Cut()
- return done_gathering_turfs
-
-/datum/controller/subsystem/explosion/proc/ProcessExplosion(datum/explosion/E, done_calculating_turfs)
- //cache shit for speed
- var/id = E.explosion_id
-
- var/list/cached_unsafe = E.unsafe_turfs
- var/list/cached_exp_block = E.calculated_turfs
- var/list/affected_turfs = cached_exp_block ? cached_exp_block : E.gathered_turfs
-
- var/devastation_range = E.devastation
- var/heavy_impact_range = E.heavy
- var/light_impact_range = E.light
-
- var/flame_range = E.flame
- var/throw_range_max = E.extent
-
- var/turf/epi = E.epicenter
-
- var/x0 = epi.x
- var/y0 = epi.y
-
- var/cut_to = 1
- for(var/TI in affected_turfs)
- var/turf/T = TI
- ++cut_to
-
- var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0)
- var/dist = init_dist
-
- if(cached_exp_block)
- var/turf/Trajectory = T
- while(Trajectory != epi)
- Trajectory = get_step_towards(Trajectory, epi)
- dist += cached_exp_block[Trajectory]
-
- var/flame_dist = dist < flame_range
- var/throw_dist = dist
-
- if(dist < devastation_range)
- dist = 1
- else if(dist < heavy_impact_range)
- dist = 2
- else if(dist < light_impact_range)
- dist = 3
- else
- dist = 0
-
- //------- EX_ACT AND TURF FIRES -------
-
- if(flame_dist && prob(40) && !isspaceturf(T) && !T.density)
- new /obj/effect/hotspot(T) //Mostly for ambience!
-
- if(dist > 0)
- T.explosion_level = max(T.explosion_level, dist) //let the bigger one have it
- T.explosion_id = id
- T.ex_act(dist)
- cached_unsafe += T
-
- //--- THROW ITEMS AROUND ---
-
- var/throw_dir = get_dir(epi, T)
- for(var/obj/item/I in T)
- if(!I.anchored)
- var/throw_range = rand(throw_dist, throw_range_max)
- var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range)
- I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Resets when it finishes throwing, regardless of hitting anything)
- I.throw_at(throw_at, throw_range, 4)
-
- if(MC_TICK_CHECK)
- var/circumference = (PI * (init_dist + 4) * 2) //+4 to radius to prevent shit gaps
- if(cached_unsafe.len > circumference) //only do this every revolution
- for(var/Unexplode in cached_unsafe)
- var/turf/UnexplodeT = Unexplode
- UnexplodeT.explosion_level = 0
- cached_unsafe.Cut()
- done_calculating_turfs = FALSE
- break
-
- affected_turfs.Cut(1, cut_to)
-
- if(!done_calculating_turfs)
- return FALSE
-
- //unfuck the shit
- for(var/Unexplode in cached_unsafe)
- var/turf/UnexplodeT = Unexplode
- UnexplodeT.explosion_level = 0
- cached_unsafe.Cut()
-
- E.finished_at = REALTIMEOFDAY
- E.tick_finished = world.time
-
- return TRUE
-
-/client/proc/check_bomb_impacts()
- set name = "Check Bomb Impact"
- set category = "Debug"
-
- var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No")
- var/turf/epicenter = get_turf(mob)
- if(!epicenter)
- return
-
- var/x0 = epicenter.x
- var/y0 = epicenter.y
-
- var/dev = 0
- var/heavy = 0
- var/light = 0
- var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb")
- var/choice = input("Bomb Size?") in choices
- switch(choice)
- if(null)
- return 0
- if("Small Bomb")
- dev = 1
- heavy = 2
- light = 3
- if("Medium Bomb")
- dev = 2
- heavy = 3
- light = 4
- if("Big Bomb")
- dev = 3
- heavy = 5
- light = 7
- if("Custom Bomb")
- dev = input("Devestation range (Tiles):") as num
- heavy = input("Heavy impact range (Tiles):") as num
- light = input("Light impact range (Tiles):") as num
- else
- return
-
- var/datum/explosion/E = new(null, epicenter, dev, heavy, light, ignorecap = TRUE)
-
- while(!SSexplosion.GatherTurfs(E))
- stoplag()
- var/list/turfs
- if(newmode)
- while(!SSexplosion.DensityCalculate(E, TRUE))
- stoplag()
- turfs = E.calculated_turfs.Copy()
- else
- turfs = E.gathered_turfs.Copy()
-
- qdel(E)
-
- for(var/I in turfs)
- var/turf/T = I
- var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + turfs[T]
-
- if(dist < dev)
- T.color = "red"
- T.maptext = "Dev"
- else if (dist < heavy)
- T.color = "yellow"
- T.maptext = "Heavy"
- else if (dist < light)
- T.color = "blue"
- T.maptext = "Light"
- CHECK_TICK
-
- sleep(100)
- for(var/I in turfs)
- var/turf/T = I
- T.color = null
- T.maptext = null
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index cd47adf476..c0837ec76b 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -21,8 +21,8 @@ SUBSYSTEM_DEF(mobs)
var/seconds = wait * 0.1
if (!resumed)
src.currentrun = GLOB.mob_living_list.Copy()
- if (GLOB.overminds.len) // blob cameras need to Life()
- src.currentrun += GLOB.overminds
+ if (GLOB.living_cameras.len)
+ src.currentrun += GLOB.living_cameras
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm
index 93003c4634..bb21968463 100644
--- a/code/controllers/subsystem/nightshift.dm
+++ b/code/controllers/subsystem/nightshift.dm
@@ -8,7 +8,6 @@ SUBSYSTEM_DEF(nightshift)
var/nightshift_end_time = 270000 //7:30 AM, station time
var/nightshift_first_check = 30 SECONDS
- var/obey_security_level = TRUE
var/high_security_mode = FALSE
/datum/controller/subsystem/nightshift/Initialize()
@@ -21,48 +20,38 @@ SUBSYSTEM_DEF(nightshift)
return
check_nightshift()
+/datum/controller/subsystem/nightshift/proc/announce(message)
+ priority_announce(message, sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement")
+
/datum/controller/subsystem/nightshift/proc/check_nightshift(force_set = FALSE)
- var/time = station_time()
- var/nightshift = time < nightshift_end_time || time > nightshift_start_time
- var/red_or_delta = GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA
+ var/emergency = GLOB.security_level >= SEC_LEVEL_RED
+ var/nightshift = FALSE
+ if (!emergency)
+ var/time = station_time()
+ nightshift = time < nightshift_end_time || time > nightshift_start_time
+
var/announcing = TRUE
- if(nightshift && red_or_delta)
- nightshift = FALSE
- if(high_security_mode && !red_or_delta)
+ if(high_security_mode && !emergency)
high_security_mode = FALSE
- priority_announce("Restoring night lighting configuration to normal operation.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement")
+ announce("Restoring night lighting configuration to normal operation.")
announcing = FALSE
- else if(!high_security_mode && red_or_delta)
+ else if(!high_security_mode && emergency)
high_security_mode = TRUE
- priority_announce("Night lighting disabled: Station is in a state of emergency.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement")
+ announce("Night lighting disabled: Station is in a state of emergency.")
announcing = FALSE
if((nightshift_active != nightshift) || force_set)
- nightshift? activate_nightshift(announcing) : deactivate_nightshift(announcing)
+ update_nightshift(nightshift, announcing)
-/datum/controller/subsystem/nightshift/proc/activate_nightshift(announce = TRUE)
- if(!nightshift_active)
- if(announce)
- priority_announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement")
- nightshift_active = TRUE
- var/list/area/affected = return_nightshift_area_types()
- for(var/i in affected)
- var/area/A = locate(i) in GLOB.sortedAreas
- for(var/obj/machinery/power/apc/APC in A)
- APC.set_nightshift(TRUE)
+/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE)
+ nightshift_active = active
+ if(announce)
+ if (active)
+ announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.")
+ else
+ announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.")
+ for(var/A in GLOB.apcs_list)
+ var/obj/machinery/power/apc/APC = A
+ if (APC.area && (APC.area.type in GLOB.the_station_areas))
+ APC.set_nightshift(active)
CHECK_TICK
-
-/datum/controller/subsystem/nightshift/proc/deactivate_nightshift(announce = TRUE)
- if(nightshift_active)
- if(announce)
- priority_announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.", sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement")
- nightshift_active = FALSE
- var/list/area/affected = return_nightshift_area_types()
- for(var/i in affected)
- var/area/A = locate(i) in GLOB.sortedAreas
- for(var/obj/machinery/power/apc/APC in A)
- APC.set_nightshift(FALSE)
- CHECK_TICK
-
-/datum/controller/subsystem/nightshift/proc/return_nightshift_area_types()
- return GLOB.the_station_areas.Copy()
diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm
deleted file mode 100644
index a6b444c4e7..0000000000
--- a/code/controllers/subsystem/ping.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-#define PING_BUFFER_TIME 25
-
-SUBSYSTEM_DEF(ping)
- name = "Ping"
- wait = 6
- flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
- priority = 10
- var/list/currentrun
-
-/datum/controller/subsystem/ping/Initialize()
- if (config.hub)
- world.visibility = 1
- ..()
-
-/datum/controller/subsystem/ping/fire(resumed = FALSE)
- if (!resumed)
- src.currentrun = GLOB.clients.Copy()
-
- var/round_started = Master.round_started
- var/list/currentrun = src.currentrun
- while (length(currentrun))
- var/client/C = currentrun[currentrun.len]
- currentrun.len--
- if (!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))
- if (MC_TICK_CHECK)
- return
- continue
-
- if(round_started && C.is_afk(INACTIVITY_KICK))
- if(!istype(C.mob, /mob/dead))
- log_access("AFK: [key_name(C)]")
- to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.")
- qdel(C)
-
- winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
-
- if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
- return
-
- currentrun = null
-
-#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm
index b6996377b5..a4c58b883a 100644
--- a/code/controllers/subsystem/processing/fields.dm
+++ b/code/controllers/subsystem/processing/fields.dm
@@ -1,6 +1,6 @@
PROCESSING_SUBSYSTEM_DEF(fields)
name = "Fields"
wait = 2
- priority = FIRE_PRIORUTY_FIELDS
+ priority = FIRE_PRIORITY_FIELDS
flags = SS_KEEP_TIMING | SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm
index 43e014061c..3f6f42f833 100644
--- a/code/controllers/subsystem/research.dm
+++ b/code/controllers/subsystem/research.dm
@@ -1,7 +1,6 @@
SUBSYSTEM_DEF(research)
name = "Research"
- flags = SS_KEEP_TIMING
priority = FIRE_PRIORITY_RESEARCH
wait = 10
init_order = INIT_ORDER_RESEARCH
diff --git a/code/controllers/subsystem/vore.dm b/code/controllers/subsystem/vore.dm
new file mode 100644
index 0000000000..faaa297ca3
--- /dev/null
+++ b/code/controllers/subsystem/vore.dm
@@ -0,0 +1,41 @@
+#define SSBELLIES_PROCESSED 1
+#define SSBELLIES_IGNORED 2
+
+//
+// Bellies subsystem - Process vore bellies
+//
+
+SUBSYSTEM_DEF(bellies)
+ name = "Bellies"
+ priority = 5
+ wait = 1 SECONDS
+ flags = SS_KEEP_TIMING|SS_NO_INIT
+ runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME
+
+ var/static/list/belly_list = list()
+ var/list/currentrun = list()
+ var/ignored_bellies = 0
+
+/datum/controller/subsystem/bellies/stat_entry()
+ ..("#: [belly_list.len] | P: [ignored_bellies]")
+
+/datum/controller/subsystem/bellies/fire(resumed = 0)
+ if (!resumed)
+ ignored_bellies = 0
+ src.currentrun = belly_list.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ var/times_fired = src.times_fired
+ while(currentrun.len)
+ var/obj/belly/B = currentrun[currentrun.len]
+ currentrun.len--
+
+ if(QDELETED(B))
+ belly_list -= B
+ else
+ if(B.process_belly(times_fired,wait) == SSBELLIES_IGNORED)
+ ignored_bellies++
+
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 15f62b20b7..a7437a0440 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -11,6 +11,7 @@
var/processing = FALSE
var/obj/screen/movable/action_button/button = null
var/buttontooltipstyle = ""
+ var/transparent_when_unavailable = TRUE
var/button_icon = 'icons/mob/actions/backgrounds.dmi' //This is the file for the BACKGROUND icon
var/background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND //And this is the state for the background icon
@@ -124,7 +125,7 @@
ApplyIcon(button, force)
if(!IsAvailable())
- button.color = rgb(128,0,0,128)
+ button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0)
else
button.color = rgb(255,255,255,255)
return 1
@@ -572,6 +573,52 @@
call(target, procname)(usr)
return 1
+
+//Preset for an action with a cooldown
+
+/datum/action/cooldown
+ check_flags = 0
+ transparent_when_unavailable = FALSE
+ var/cooldown_time = 0
+ var/next_use_time = 0
+
+/datum/action/cooldown/New()
+ ..()
+ button.maptext = ""
+ button.maptext_x = 8
+ button.maptext_y = 0
+ button.maptext_width = 24
+ button.maptext_height = 12
+
+/datum/action/cooldown/IsAvailable()
+ return next_use_time <= world.time
+
+/datum/action/cooldown/proc/StartCooldown()
+ next_use_time = world.time + cooldown_time
+ button.maptext = "[round(cooldown_time/10, 0.1)]"
+ UpdateButtonIcon()
+ START_PROCESSING(SSfastprocess, src)
+
+/datum/action/cooldown/process()
+ if(!owner)
+ button.maptext = ""
+ STOP_PROCESSING(SSfastprocess, src)
+ var/timeleft = max(next_use_time - world.time, 0)
+ if(timeleft == 0)
+ button.maptext = ""
+ UpdateButtonIcon()
+ STOP_PROCESSING(SSfastprocess, src)
+ else
+ button.maptext = "[round(timeleft/10, 0.1)]"
+
+/datum/action/cooldown/Grant(mob/M)
+ ..()
+ if(owner)
+ UpdateButtonIcon()
+ if(next_use_time > world.time)
+ START_PROCESSING(SSfastprocess, src)
+
+
//Stickmemes
/datum/action/item_action/stickmen
name = "Summon Stick Minions"
diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm
deleted file mode 100644
index fde8d0059b..0000000000
--- a/code/datums/antagonists/abductor.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-#define ABDUCTOR_MAX_TEAMS 4
-
-/datum/antagonist/abductor
- name = "Abductor"
- roundend_category = "abductors"
- antagpanel_category = "Abductor"
- job_rank = ROLE_ABDUCTOR
- show_in_antagpanel = FALSE //should only show subtypes
- var/datum/team/abductor_team/team
- var/sub_role
- var/outfit
- var/landmark_type
- var/greet_text
-
-
-/datum/antagonist/abductor/agent
- name = "Abductor Agent"
- sub_role = "Agent"
- outfit = /datum/outfit/abductor/agent
- landmark_type = /obj/effect/landmark/abductor/agent
- greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve."
- show_in_antagpanel = TRUE
-
-/datum/antagonist/abductor/scientist
- name = "Abductor Scientist"
- sub_role = "Scientist"
- outfit = /datum/outfit/abductor/scientist
- landmark_type = /obj/effect/landmark/abductor/scientist
- greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve."
- show_in_antagpanel = TRUE
-
-/datum/antagonist/abductor/create_team(datum/team/abductor_team/new_team)
- if(!new_team)
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- team = new_team
-
-/datum/antagonist/abductor/get_team()
- return team
-
-/datum/antagonist/abductor/on_gain()
- SSticker.mode.abductors += owner
- owner.special_role = "[name] [sub_role]"
- owner.assigned_role = "[name] [sub_role]"
- owner.objectives += team.objectives
- finalize_abductor()
- return ..()
-
-/datum/antagonist/abductor/on_removal()
- SSticker.mode.abductors -= owner
- owner.objectives -= team.objectives
- if(owner.current)
- to_chat(owner.current,"You are no longer the [owner.special_role]!")
- owner.special_role = null
- return ..()
-
-/datum/antagonist/abductor/greet()
- to_chat(owner.current, "You are the [owner.special_role]!")
- to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!")
- to_chat(owner.current, "[greet_text]")
- owner.announce_objectives()
-
-/datum/antagonist/abductor/proc/finalize_abductor()
- //Equip
- var/mob/living/carbon/human/H = owner.current
- H.set_species(/datum/species/abductor)
- H.real_name = "[team.name] [sub_role]"
- H.equipOutfit(outfit)
-
- //Teleport to ship
- for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list)
- if(istype(LM, landmark_type) && LM.team_number == team.team_number)
- H.forceMove(LM.loc)
- break
-
- SSticker.mode.update_abductor_icons_added(owner)
-
-/datum/antagonist/abductor/scientist/finalize_abductor()
- ..()
- var/mob/living/carbon/human/H = owner.current
- var/datum/species/abductor/A = H.dna.species
- A.scientist = TRUE
-
-/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin)
- var/list/current_teams = list()
- for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team))
- current_teams[T.name] = T
- var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team")
- if (choice == "new team")
- team = new
- else if(choice in current_teams)
- team = current_teams[choice]
- else
- return
- new_owner.add_antag_datum(src)
- log_admin("[key_name(usr)] made [key_name(new_owner.current)] [name] on [choice]!")
- message_admins("[key_name_admin(usr)] made [key_name_admin(new_owner.current)] [name] on [choice] !")
-
-/datum/antagonist/abductor/get_admin_commands()
- . = ..()
- .["Equip"] = CALLBACK(src,.proc/admin_equip)
-
-/datum/antagonist/abductor/proc/admin_equip(mob/admin)
- if(!ishuman(owner.current))
- to_chat(admin, "This only works on humans!")
- return
- var/mob/living/carbon/human/H = owner.current
- var/gear = alert(admin,"Agent or Scientist Gear","Gear","Agent","Scientist")
- if(gear)
- if(gear=="Agent")
- H.equipOutfit(/datum/outfit/abductor/agent)
- else
- H.equipOutfit(/datum/outfit/abductor/scientist)
-
-/datum/team/abductor_team
- member_name = "abductor"
- var/team_number
- var/list/datum/mind/abductees = list()
- var/static/team_count = 1
-
-/datum/team/abductor_team/New()
- ..()
- team_number = team_count++
- name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names
- add_objective(new/datum/objective/experiment)
-
-/datum/team/abductor_team/is_solo()
- return FALSE
-
-/datum/team/abductor_team/proc/add_objective(datum/objective/O)
- O.team = src
- O.update_explanation_text()
- objectives += O
-
-/datum/team/abductor_team/roundend_report()
- var/list/result = list()
-
- var/won = TRUE
- for(var/datum/objective/O in objectives)
- if(!O.check_completion())
- won = FALSE
- if(won)
- result += "[name] team fulfilled its mission!"
- else
- result += "[name] team failed its mission."
-
- result += ""
- for(var/datum/mind/abductor_mind in members)
- result += printplayer(abductor_mind)
- result += printobjectives(abductor_mind)
-
- return result.Join("
")
-
-/datum/antagonist/abductee
- name = "Abductee"
- roundend_category = "abductees"
- antagpanel_category = "Abductee"
-
-/datum/antagonist/abductee/on_gain()
- give_objective()
- . = ..()
-
-/datum/antagonist/abductee/greet()
- to_chat(owner, "Your mind snaps!")
- to_chat(owner, "You can't remember how you got here...")
- owner.announce_objectives()
-
-/datum/antagonist/abductee/proc/give_objective()
- var/mob/living/carbon/human/H = owner.current
- if(istype(H))
- H.gain_trauma_type(BRAIN_TRAUMA_MILD)
- var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
- var/datum/objective/abductee/O = new objtype()
- objectives += O
- owner.objectives += objectives
-
-/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override)
- SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner)
-
-/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override)
- SSticker.mode.update_abductor_icons_removed(mob_override ? mob_override.mind : owner)
\ No newline at end of file
diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm
deleted file mode 100644
index 5f12d02398..0000000000
--- a/code/datums/antagonists/antag_datum.dm
+++ /dev/null
@@ -1,246 +0,0 @@
-GLOBAL_LIST_EMPTY(antagonists)
-
-/datum/antagonist
- var/name = "Antagonist"
- var/roundend_category = "other antagonists" //Section of roundend report, datums with same category will be displayed together, also default header for the section
- var/show_in_roundend = TRUE //Set to false to hide the antagonists from roundend report
- var/datum/mind/owner //Mind that owns this datum
- var/silent = FALSE //Silent will prevent the gain/lose texts to show
- var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum
- var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with
- var/delete_on_mind_deletion = TRUE
- var/job_rank
- var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted.
- var/list/objectives = list()
- var/antag_memory = ""//These will be removed with antag datum
-
- //Antag panel properties
- var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
- var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
-
-/datum/antagonist/New()
- GLOB.antagonists += src
- typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
-
-/datum/antagonist/Destroy()
- GLOB.antagonists -= src
- if(owner)
- LAZYREMOVE(owner.antag_datums, src)
- owner = null
- return ..()
-
-/datum/antagonist/proc/can_be_owned(datum/mind/new_owner)
- . = TRUE
- var/datum/mind/tested = new_owner || owner
- if(tested.has_antag_datum(type))
- return FALSE
- for(var/i in tested.antag_datums)
- var/datum/antagonist/A = i
- if(is_type_in_typecache(src, A.typecache_datum_blacklist))
- return FALSE
-
-//This will be called in add_antag_datum before owner assignment.
-//Should return antag datum without owner.
-/datum/antagonist/proc/specialization(datum/mind/new_owner)
- return src
-
-/datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body)
- remove_innate_effects(old_body)
- apply_innate_effects(new_body)
-
-//This handles the application of antag huds/special abilities
-/datum/antagonist/proc/apply_innate_effects(mob/living/mob_override)
- return
-
-//This handles the removal of antag huds/special abilities
-/datum/antagonist/proc/remove_innate_effects(mob/living/mob_override)
- return
-
-//Assign default team and creates one for one of a kind team antagonists
-/datum/antagonist/proc/create_team(datum/team/team)
- return
-
-//Proc called when the datum is given to a mind.
-/datum/antagonist/proc/on_gain()
- if(owner && owner.current)
- if(!silent)
- greet()
- apply_innate_effects()
- if(is_banned(owner.current) && replace_banned)
- replace_banned_player()
-
-/datum/antagonist/proc/is_banned(mob/M)
- if(!M)
- return FALSE
- . = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank)))
-
-/datum/antagonist/proc/replace_banned_player()
- set waitfor = FALSE
-
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current)
- if(LAZYLEN(candidates))
- var/client/C = pick(candidates)
- to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
- message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.")
- owner.current.ghostize(0)
- owner.current.key = C.key
-
-/datum/antagonist/proc/on_removal()
- remove_innate_effects()
- if(owner)
- LAZYREMOVE(owner.antag_datums, src)
- if(!silent && owner.current)
- farewell()
- var/datum/team/team = get_team()
- if(team)
- team.remove_member(owner)
- qdel(src)
-
-/datum/antagonist/proc/greet()
- return
-
-/datum/antagonist/proc/farewell()
- return
-
-//Returns the team antagonist belongs to if any.
-/datum/antagonist/proc/get_team()
- return
-
-//Individual roundend report
-/datum/antagonist/proc/roundend_report()
- var/list/report = list()
-
- if(!owner)
- CRASH("antagonist datum without owner")
-
- report += printplayer(owner)
-
- var/objectives_complete = TRUE
- if(owner.objectives.len)
- report += printobjectives(owner)
- for(var/datum/objective/objective in owner.objectives)
- if(!objective.check_completion())
- objectives_complete = FALSE
- break
-
- if(owner.objectives.len == 0 || objectives_complete)
- report += "The [name] was successful!"
- else
- report += "The [name] has failed!"
-
- return report.Join("
")
-
-//Displayed at the start of roundend_category section, default to roundend_category header
-/datum/antagonist/proc/roundend_report_header()
- return "
"
-
-//Displayed at the end of roundend_category section
-/datum/antagonist/proc/roundend_report_footer()
- return
-
-
-//ADMIN TOOLS
-
-//Called when using admin tools to give antag status
-/datum/antagonist/proc/admin_add(datum/mind/new_owner,mob/admin)
- message_admins("[key_name_admin(admin)] made [new_owner.current] into [name].")
- log_admin("[key_name(admin)] made [new_owner.current] into [name].")
- new_owner.add_antag_datum(src)
-
-//Called when removing antagonist using admin tools
-/datum/antagonist/proc/admin_remove(mob/user)
- if(!user)
- return
- message_admins("[key_name_admin(user)] has removed [name] antagonist status from [owner.current].")
- log_admin("[key_name(user)] has removed [name] antagonist status from [owner.current].")
- on_removal()
-
-//gamemode/proc/is_mode_antag(antagonist/A) => TRUE/FALSE
-
-//Additional data to display in antagonist panel section
-//nuke disk code, genome count, etc
-/datum/antagonist/proc/antag_panel_data()
- return ""
-
-/datum/antagonist/proc/enabled_in_preferences(datum/mind/M)
- if(job_rank)
- if(M.current && M.current.client && (job_rank in M.current.client.prefs.be_special))
- return TRUE
- else
- return FALSE
- return TRUE
-
-// List if ["Command"] = CALLBACK(), user will be appeneded to callback arguments on execution
-/datum/antagonist/proc/get_admin_commands()
- . = list()
-
-/datum/antagonist/Topic(href,href_list)
- if(!check_rights(R_ADMIN))
- return
- //Antag memory edit
- if (href_list["memory_edit"])
- edit_memory(usr)
- owner.traitor_panel()
- return
-
- //Some commands might delete/modify this datum clearing or changing owner
- var/datum/mind/persistent_owner = owner
-
- var/commands = get_admin_commands()
- for(var/admin_command in commands)
- if(href_list["command"] == admin_command)
- var/datum/callback/C = commands[admin_command]
- C.Invoke(usr)
- persistent_owner.traitor_panel()
- return
-
-/datum/antagonist/proc/edit_memory(mob/user)
- var/new_memo = copytext(trim(input(user,"Write new memory", "Memory", antag_memory) as null|message),1,MAX_MESSAGE_LEN)
- if (isnull(new_memo))
- return
- antag_memory = new_memo
-
-//Should probably be on ticker or job ss ?
-/proc/get_antagonists(antag_type,specific = FALSE)
- . = list()
- for(var/datum/antagonist/A in GLOB.antagonists)
- if(!A.owner)
- continue
- if(!antag_type || !specific && istype(A,antag_type) || specific && A.type == antag_type)
- . += A.owner
-
-//This datum will autofill the name with special_role
-//Used as placeholder for minor antagonists, please create proper datums for these
-/datum/antagonist/auto_custom
- show_in_antagpanel = FALSE
- antagpanel_category = "Other"
-
-/datum/antagonist/auto_custom/on_gain()
- ..()
- name = owner.special_role
- //Add all objectives not already owned by other datums to this one.
- var/list/already_registered_objectives = list()
- for(var/datum/antagonist/A in owner.antag_datums)
- if(A == src)
- continue
- else
- already_registered_objectives |= A.objectives
- objectives = owner.objectives - already_registered_objectives
-
-/datum/antagonist/auto_custom/antag_listing_name()
- return ..() + "([name])"
-
-//This one is created by admin tools for custom objectives
-/datum/antagonist/custom
- antagpanel_category = "Custom"
-
-/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
- var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
- if(custom_name)
- name = custom_name
- else
- return
- ..()
-
-/datum/antagonist/custom/antag_listing_name()
- return ..() + "([name])"
\ No newline at end of file
diff --git a/code/datums/antagonists/blob.dm b/code/datums/antagonists/blob.dm
deleted file mode 100644
index 964bc99311..0000000000
--- a/code/datums/antagonists/blob.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-/datum/antagonist/blob
- name = "Blob"
- roundend_category = "blobs"
- antagpanel_category = "Blob"
- job_rank = ROLE_BLOB
-
- var/datum/action/innate/blobpop/pop_action
- var/starting_points_human_blob = 60
- var/point_rate_human_blob = 2
-
-/datum/antagonist/blob/roundend_report()
- var/basic_report = ..()
- //Display max blobpoints for blebs that lost
- if(isovermind(owner.current)) //embarrasing if not
- var/mob/camera/blob/overmind = owner.current
- if(!overmind.victory_in_progress) //if it won this doesn't really matter
- var/point_report = "
[owner.name] took over [overmind.max_count] tiles at the height of its growth."
- return basic_report+point_report
- return basic_report
-
-/datum/antagonist/blob/greet()
- if(!isovermind(owner.current))
- to_chat(owner,"You feel bloated.")
-
-/datum/antagonist/blob/on_gain()
- create_objectives()
- . = ..()
-
-/datum/antagonist/blob/proc/create_objectives()
- var/datum/objective/blob_takeover/main = new
- main.owner = owner
- objectives += main
- owner.objectives |= objectives
-
-/datum/antagonist/blob/apply_innate_effects(mob/living/mob_override)
- if(!isovermind(owner.current))
- if(!pop_action)
- pop_action = new
- pop_action.Grant(owner.current)
-
-/datum/objective/blob_takeover
- explanation_text = "Reach critical mass!"
-
-//Non-overminds get this on blob antag assignment
-/datum/action/innate/blobpop
- name = "Pop"
- desc = "Unleash the blob"
- icon_icon = 'icons/mob/blob.dmi'
- button_icon_state = "blob"
-
-/datum/action/innate/blobpop/Activate()
- var/mob/old_body = owner
- var/datum/antagonist/blob/blobtag = owner.mind.has_antag_datum(/datum/antagonist/blob)
- if(!blobtag)
- Remove()
- return
- var/mob/camera/blob/B = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob)
- owner.mind.transfer_to(B)
- old_body.gib()
- B.place_blob_core(blobtag.point_rate_human_blob, pop_override = TRUE)
-
-/datum/antagonist/blob/antag_listing_status()
- . = ..()
- if(owner && owner.current)
- var/mob/camera/blob/B = owner.current
- if(istype(B))
- . += "(Progress: [B.blobs_legit.len]/[B.blobwincount])"
\ No newline at end of file
diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm
deleted file mode 100644
index d8371d3751..0000000000
--- a/code/datums/antagonists/brother.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-/datum/antagonist/brother
- name = "Brother"
- antagpanel_category = "Brother"
- job_rank = ROLE_BROTHER
- var/special_role = ROLE_BROTHER
- var/datum/team/brother_team/team
-
-/datum/antagonist/brother/create_team(datum/team/brother_team/new_team)
- if(!new_team)
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- team = new_team
-
-/datum/antagonist/brother/get_team()
- return team
-
-/datum/antagonist/brother/on_gain()
- SSticker.mode.brothers += owner
- objectives += team.objectives
- owner.objectives += objectives
- owner.special_role = special_role
- finalize_brother()
- return ..()
-
-/datum/antagonist/brother/on_removal()
- SSticker.mode.brothers -= owner
- owner.objectives -= objectives
- if(owner.current)
- to_chat(owner.current,"You are no longer the [special_role]!")
- owner.special_role = null
- return ..()
-
-/datum/antagonist/brother/proc/give_meeting_area()
- if(!owner.current || !team || !team.meeting_area)
- return
- to_chat(owner.current, "Your designated meeting area: [team.meeting_area]")
- antag_memory += "Meeting Area: [team.meeting_area]
"
-
-/datum/antagonist/brother/greet()
- var/brother_text = ""
- var/list/brothers = team.members - owner
- for(var/i = 1 to brothers.len)
- var/datum/mind/M = brothers[i]
- brother_text += M.name
- if(i == brothers.len - 1)
- brother_text += " and "
- else if(i != brothers.len)
- brother_text += ", "
- to_chat(owner.current, "You are the [owner.special_role] of [brother_text].")
- to_chat(owner.current, "The Syndicate only accepts those that have proven themself. Prove yourself and prove your [team.member_name]s by completing your objectives together!")
- owner.announce_objectives()
- give_meeting_area()
-
-/datum/antagonist/brother/proc/finalize_brother()
- SSticker.mode.update_brother_icons_added(owner)
-
-/datum/antagonist/brother/admin_add(datum/mind/new_owner,mob/admin)
- //show list of possible brothers
- var/list/candidates = list()
- for(var/mob/living/L in GLOB.alive_mob_list)
- if(!L.mind || L.mind == new_owner || !can_be_owned(L.mind))
- continue
- candidates[L.mind.name] = L.mind
-
- var/choice = input(admin,"Choose the blood brother.", "Brother") as null|anything in candidates
- if(!choice)
- return
- var/datum/mind/bro = candidates[choice]
- var/datum/team/brother_team/T = new
- T.add_member(new_owner)
- T.add_member(bro)
- T.pick_meeting_area()
- T.forge_brother_objectives()
- new_owner.add_antag_datum(/datum/antagonist/brother,T)
- bro.add_antag_datum(/datum/antagonist/brother, T)
- T.update_name()
- message_admins("[key_name_admin(admin)] made [new_owner.current] and [bro.current] into blood brothers.")
- log_admin("[key_name(admin)] made [new_owner.current] and [bro.current] into blood brothers.")
-
-/datum/team/brother_team
- name = "brotherhood"
- member_name = "blood brother"
- var/meeting_area
- var/static/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library")
-
-/datum/team/brother_team/is_solo()
- return FALSE
-
-/datum/team/brother_team/proc/pick_meeting_area()
- meeting_area = pick(meeting_areas)
- meeting_areas -= meeting_area
-
-/datum/team/brother_team/proc/update_name()
- var/list/last_names = list()
- for(var/datum/mind/M in members)
- var/list/split_name = splittext(M.name," ")
- last_names += split_name[split_name.len]
-
- name = last_names.Join(" & ")
-
-/datum/team/brother_team/roundend_report()
- var/list/parts = list()
-
- parts += ""
- for(var/datum/mind/M in members)
- parts += printplayer(M)
- var/win = TRUE
- var/objective_count = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- parts += "Objective #[objective_count]: [objective.explanation_text] Success!"
- else
- parts += "Objective #[objective_count]: [objective.explanation_text] Fail."
- win = FALSE
- objective_count++
- if(win)
- parts += "The blood brothers were successful!"
- else
- parts += "The blood brothers have failed!"
-
- return "
[parts.Join("
")]
"
-
-/datum/team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE)
- O.team = src
- if(needs_target)
- O.find_target()
- O.update_explanation_text()
- objectives += O
-
-/datum/team/brother_team/proc/forge_brother_objectives()
- objectives = list()
- var/is_hijacker = prob(10)
- for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker))
- forge_single_objective()
- if(is_hijacker)
- if(!locate(/datum/objective/hijack) in objectives)
- add_objective(new/datum/objective/hijack)
- else if(!locate(/datum/objective/escape) in objectives)
- add_objective(new/datum/objective/escape)
-
-/datum/team/brother_team/proc/forge_single_objective()
- if(prob(50))
- if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len))
- add_objective(new/datum/objective/destroy, TRUE)
- else if(prob(30))
- add_objective(new/datum/objective/maroon, TRUE)
- else
- add_objective(new/datum/objective/assassinate, TRUE)
- else
- add_objective(new/datum/objective/steal, TRUE)
-
-/datum/team/brother_team/antag_listing_name()
- return "[name] blood brothers"
\ No newline at end of file
diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm
deleted file mode 100644
index 2bc4900ac5..0000000000
--- a/code/datums/antagonists/changeling.dm
+++ /dev/null
@@ -1,545 +0,0 @@
-#define LING_FAKEDEATH_TIME 400 //40 seconds
-#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead.
-#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
-
-/datum/antagonist/changeling
- name = "Changeling"
- roundend_category = "changelings"
- antagpanel_category = "Changeling"
- job_rank = ROLE_CHANGELING
-
- var/you_are_greet = TRUE
- var/give_objectives = TRUE
- var/team_mode = FALSE //Should assign team objectives ?
-
- //Changeling Stuff
-
- var/list/stored_profiles = list() //list of datum/changelingprofile
- var/datum/changelingprofile/first_prof = null
- var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation.
- var/absorbedcount = 0
- var/chem_charges = 20
- var/chem_storage = 75
- var/chem_recharge_rate = 1
- var/chem_recharge_slowdown = 0
- var/sting_range = 2
- var/changelingID = "Changeling"
- var/geneticdamage = 0
- var/isabsorbing = 0
- var/islinking = 0
- var/geneticpoints = 10
- var/purchasedpowers = list()
- var/mimicing = ""
- var/canrespec = 0
- var/changeling_speak = 0
- var/datum/dna/chosen_dna
- var/obj/effect/proc_holder/changeling/sting/chosen_sting
- var/datum/cellular_emporium/cellular_emporium
- var/datum/action/innate/cellular_emporium/emporium_action
-
- // wip stuff
- var/static/list/all_powers = typecacheof(/obj/effect/proc_holder/changeling,TRUE)
-
-
-/datum/antagonist/changeling/Destroy()
- QDEL_NULL(cellular_emporium)
- QDEL_NULL(emporium_action)
- . = ..()
-
-/datum/antagonist/changeling/proc/generate_name()
- var/honorific
- if(owner.current.gender == FEMALE)
- honorific = "Ms."
- else
- honorific = "Mr."
- if(GLOB.possible_changeling_IDs.len)
- changelingID = pick(GLOB.possible_changeling_IDs)
- GLOB.possible_changeling_IDs -= changelingID
- changelingID = "[honorific] [changelingID]"
- else
- changelingID = "[honorific] [rand(1,999)]"
-
-/datum/antagonist/changeling/proc/create_actions()
- cellular_emporium = new(src)
- emporium_action = new(cellular_emporium)
-
-/datum/antagonist/changeling/on_gain()
- generate_name()
- create_actions()
- reset_powers()
- create_initial_profile()
- if(give_objectives)
- if(team_mode)
- forge_team_objectives()
- forge_objectives()
- remove_clownmut()
- . = ..()
-
-/datum/antagonist/changeling/on_removal()
- //We'll be using this from now on
- var/mob/living/carbon/C = owner.current
- if(istype(C))
- var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
- if(B && (B.decoy_override != initial(B.decoy_override)))
- B.vital = TRUE
- B.decoy_override = FALSE
- remove_changeling_powers()
- owner.objectives -= objectives
- . = ..()
-
-/datum/antagonist/changeling/proc/remove_clownmut()
- if (owner)
- var/mob/living/carbon/human/H = owner.current
- if(istype(H) && owner.assigned_role == "Clown")
- to_chat(H, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.")
- H.dna.remove_mutation(CLOWNMUT)
-
-/datum/antagonist/changeling/proc/reset_properties()
- changeling_speak = 0
- chosen_sting = null
- geneticpoints = initial(geneticpoints)
- sting_range = initial(sting_range)
- chem_storage = initial(chem_storage)
- chem_recharge_rate = initial(chem_recharge_rate)
- chem_charges = min(chem_charges, chem_storage)
- chem_recharge_slowdown = initial(chem_recharge_slowdown)
- mimicing = ""
-
-/datum/antagonist/changeling/proc/remove_changeling_powers()
- if(ishuman(owner.current) || ismonkey(owner.current))
- reset_properties()
- for(var/obj/effect/proc_holder/changeling/p in purchasedpowers)
- if(p.always_keep)
- continue
- purchasedpowers -= p
- p.on_refund(owner.current)
-
- //MOVE THIS
- if(owner.current.hud_used)
- owner.current.hud_used.lingstingdisplay.icon_state = null
- owner.current.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT
-
-/datum/antagonist/changeling/proc/reset_powers()
- if(purchasedpowers)
- remove_changeling_powers()
- //Repurchase free powers.
- for(var/path in all_powers)
- var/obj/effect/proc_holder/changeling/S = new path()
- if(!S.dna_cost)
- if(!has_sting(S))
- purchasedpowers += S
- S.on_purchase(owner.current,TRUE)
-
-/datum/antagonist/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power)
- for(var/obj/effect/proc_holder/changeling/P in purchasedpowers)
- if(initial(power.name) == P.name)
- return TRUE
- return FALSE
-
-
-/datum/antagonist/changeling/proc/purchase_power(sting_name)
- var/obj/effect/proc_holder/changeling/thepower = null
-
- for(var/path in all_powers)
- var/obj/effect/proc_holder/changeling/S = path
- if(initial(S.name) == sting_name)
- thepower = new path()
- break
-
- if(!thepower)
- to_chat(owner.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
- return
-
- if(absorbedcount < thepower.req_dna)
- to_chat(owner.current, "We lack the energy to evolve this ability!")
- return
-
- if(has_sting(thepower))
- to_chat(owner.current, "We have already evolved this ability!")
- return
-
- if(thepower.dna_cost < 0)
- to_chat(owner.current, "We cannot evolve this ability.")
- return
-
- if(geneticpoints < thepower.dna_cost)
- to_chat(owner.current, "We have reached our capacity for abilities.")
- return
-
- if(owner.current.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist.
- to_chat(owner.current, "We lack the energy to evolve new abilities right now.")
- return
-
- geneticpoints -= thepower.dna_cost
- purchasedpowers += thepower
- thepower.on_purchase(owner.current)
-
-/datum/antagonist/changeling/proc/readapt()
- if(!ishuman(owner.current))
- to_chat(owner.current, "We can't remove our evolutions in this form!")
- return
- if(canrespec)
- to_chat(owner.current, "We have removed our evolutions from this form, and are now ready to readapt.")
- reset_powers()
- canrespec = 0
- SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt")
- return 1
- else
- to_chat(owner.current, "You lack the power to readapt your evolutions!")
- return 0
-
-//Called in life()
-/datum/antagonist/changeling/proc/regenerate()
- var/mob/living/carbon/the_ling = owner.current
- if(istype(the_ling))
- emporium_action.Grant(the_ling)
- if(the_ling.stat == DEAD)
- chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5))
- geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1)
- else //not dead? no chem/geneticdamage caps.
- chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage)
- geneticdamage = max(0, geneticdamage-1)
-
-
-/datum/antagonist/changeling/proc/get_dna(dna_owner)
- for(var/datum/changelingprofile/prof in stored_profiles)
- if(dna_owner == prof.name)
- return prof
-
-/datum/antagonist/changeling/proc/has_dna(datum/dna/tDNA)
- for(var/datum/changelingprofile/prof in stored_profiles)
- if(tDNA.is_same_as(prof.dna))
- return TRUE
- return FALSE
-
-/datum/antagonist/changeling/proc/can_absorb_dna(mob/living/carbon/human/target, var/verbose=1)
- var/mob/living/carbon/user = owner.current
- if(!istype(user))
- return
- if(stored_profiles.len)
- var/datum/changelingprofile/prof = stored_profiles[1]
- if(prof.dna == user.dna && stored_profiles.len >= dna_max)//If our current DNA is the stalest, we gotta ditch it.
- if(verbose)
- to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.")
- return
- if(!target)
- return
- if(NO_DNA_COPY in target.dna.species.species_traits)
- if(verbose)
- to_chat(user, "[target] is not compatible with our biology.")
- return
- if((target.has_disability(DISABILITY_NOCLONE)) || (target.has_disability(DISABILITY_NOCLONE)))
- if(verbose)
- to_chat(user, "DNA of [target] is ruined beyond usability!")
- return
- if(!ishuman(target))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
- if(verbose)
- to_chat(user, "We could gain no benefit from absorbing a lesser creature.")
- return
- if(has_dna(target.dna))
- if(verbose)
- to_chat(user, "We already have this DNA in storage!")
- return
- if(!target.has_dna())
- if(verbose)
- to_chat(user, "[target] is not compatible with our biology.")
- return
- return 1
-
-
-/datum/antagonist/changeling/proc/create_profile(mob/living/carbon/human/H, protect = 0)
- var/datum/changelingprofile/prof = new
-
- H.dna.real_name = H.real_name //Set this again, just to be sure that it's properly set.
- var/datum/dna/new_dna = new H.dna.type
- H.dna.copy_dna(new_dna)
- prof.dna = new_dna
- prof.name = H.real_name
- prof.protected = protect
-
- prof.underwear = H.underwear
- prof.undershirt = H.undershirt
- prof.socks = H.socks
-
- var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
- for(var/slot in slots)
- if(slot in H.vars)
- var/obj/item/I = H.vars[slot]
- if(!I)
- continue
- prof.name_list[slot] = I.name
- prof.appearance_list[slot] = I.appearance
- prof.flags_cover_list[slot] = I.flags_cover
- prof.item_color_list[slot] = I.item_color
- prof.item_state_list[slot] = I.item_state
- prof.exists_list[slot] = 1
- else
- continue
-
- return prof
-
-/datum/antagonist/changeling/proc/add_profile(datum/changelingprofile/prof)
- if(stored_profiles.len > dna_max)
- if(!push_out_profile())
- return
-
- if(!first_prof)
- first_prof = prof
-
- stored_profiles += prof
- absorbedcount++
-
-/datum/antagonist/changeling/proc/add_new_profile(mob/living/carbon/human/H, protect = 0)
- var/datum/changelingprofile/prof = create_profile(H, protect)
- add_profile(prof)
- return prof
-
-/datum/antagonist/changeling/proc/remove_profile(mob/living/carbon/human/H, force = 0)
- for(var/datum/changelingprofile/prof in stored_profiles)
- if(H.real_name == prof.name)
- if(prof.protected && !force)
- continue
- stored_profiles -= prof
- qdel(prof)
-
-/datum/antagonist/changeling/proc/get_profile_to_remove()
- for(var/datum/changelingprofile/prof in stored_profiles)
- if(!prof.protected)
- return prof
-
-/datum/antagonist/changeling/proc/push_out_profile()
- var/datum/changelingprofile/removeprofile = get_profile_to_remove()
- if(removeprofile)
- stored_profiles -= removeprofile
- return 1
- return 0
-
-
-/datum/antagonist/changeling/proc/create_initial_profile()
- var/mob/living/carbon/C = owner.current //only carbons have dna now, so we have to typecaste
- if(ishuman(C))
- add_new_profile(C)
-
-/datum/antagonist/changeling/apply_innate_effects()
- //Brains optional.
- var/mob/living/carbon/C = owner.current
- if(istype(C))
- var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
- if(B)
- B.vital = FALSE
- B.decoy_override = TRUE
- update_changeling_icons_added()
- return
-
-/datum/antagonist/changeling/remove_innate_effects()
- update_changeling_icons_removed()
- return
-
-
-/datum/antagonist/changeling/greet()
- if (you_are_greet)
- to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.")
- to_chat(owner.current, "Use say \":g message\" to communicate with your fellow changelings.")
- to_chat(owner.current, "You must complete the following tasks:")
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE)
-
- owner.announce_objectives()
-
-/datum/antagonist/changeling/farewell()
- to_chat(owner.current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!")
-
-/datum/antagonist/changeling/proc/forge_team_objectives()
- if(GLOB.changeling_team_objective_type)
- var/datum/objective/changeling_team_objective/team_objective = new GLOB.changeling_team_objective_type
- team_objective.owner = owner
- objectives += team_objective
- return
-
-/datum/antagonist/changeling/proc/forge_objectives()
- //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft".
- //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
- //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone
-
- var/escape_objective_possible = TRUE
-
- //if there's a team objective, check if it's compatible with escape objectives
- for(var/datum/objective/changeling_team_objective/CTO in objectives)
- if(!CTO.escape_objective_compatible)
- escape_objective_possible = FALSE
- break
-
- var/datum/objective/absorb/absorb_objective = new
- absorb_objective.owner = owner
- absorb_objective.gen_amount_goal(6, 8)
- objectives += absorb_objective
-
- if(prob(60))
- if(prob(85))
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = owner
- steal_objective.find_target()
- objectives += steal_objective
- else
- var/datum/objective/download/download_objective = new
- download_objective.owner = owner
- download_objective.gen_amount_goal()
- objectives += download_objective
-
- var/list/active_ais = active_ais()
- if(active_ais.len && prob(100/GLOB.joined_player_list.len))
- var/datum/objective/destroy/destroy_objective = new
- destroy_objective.owner = owner
- destroy_objective.find_target()
- objectives += destroy_objective
- else
- if(prob(70))
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = owner
- if(team_mode) //No backstabbing while in a team
- kill_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
- else
- kill_objective.find_target()
- objectives += kill_objective
- else
- var/datum/objective/maroon/maroon_objective = new
- maroon_objective.owner = owner
- if(team_mode)
- maroon_objective.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
- else
- maroon_objective.find_target()
- objectives += maroon_objective
-
- if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
- var/datum/objective/escape/escape_with_identity/identity_theft = new
- identity_theft.owner = owner
- identity_theft.target = maroon_objective.target
- identity_theft.update_explanation_text()
- objectives += identity_theft
- escape_objective_possible = FALSE
-
- if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible)
- if(prob(50))
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- objectives += escape_objective
- else
- var/datum/objective/escape/escape_with_identity/identity_theft = new
- identity_theft.owner = owner
- if(team_mode)
- identity_theft.find_target_by_role(role = ROLE_CHANGELING, role_type = 1, invert = 1)
- else
- identity_theft.find_target()
- objectives += identity_theft
- escape_objective_possible = FALSE
-
- owner.objectives |= objectives
-
-/datum/antagonist/changeling/proc/update_changeling_icons_added()
- var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
- hud.join_hud(owner.current)
- set_antag_hud(owner.current, "changling")
-
-/datum/antagonist/changeling/proc/update_changeling_icons_removed()
- var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
- hud.leave_hud(owner.current)
- set_antag_hud(owner.current, null)
-
-/datum/antagonist/changeling/admin_add(datum/mind/new_owner,mob/admin)
- . = ..()
- to_chat(new_owner.current, "Our powers have awoken. A flash of memory returns to us...we are [changelingID], a changeling!")
-
-/datum/antagonist/changeling/get_admin_commands()
- . = ..()
- if(stored_profiles.len && (owner.current.real_name != first_prof.name))
- .["Transform to initial appearance."] = CALLBACK(src,.proc/admin_restore_appearance)
-
-/datum/antagonist/changeling/proc/admin_restore_appearance(mob/admin)
- if(!stored_profiles.len || !iscarbon(owner.current))
- to_chat(admin, "Resetting DNA failed!")
- else
- var/mob/living/carbon/C = owner.current
- first_prof.dna.transfer_identity(C, transfer_SE=1)
- C.real_name = first_prof.name
- C.updateappearance(mutcolor_update=1)
- C.domutcheck()
-
-// Profile
-
-/datum/changelingprofile
- var/name = "a bug"
-
- var/protected = 0
-
- var/datum/dna/dna = null
- var/list/name_list = list() //associative list of slotname = itemname
- var/list/appearance_list = list()
- var/list/flags_cover_list = list()
- var/list/exists_list = list()
- var/list/item_color_list = list()
- var/list/item_state_list = list()
-
- var/underwear
- var/undershirt
- var/socks
-
-/datum/changelingprofile/Destroy()
- qdel(dna)
- . = ..()
-
-/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/newprofile)
- newprofile.name = name
- newprofile.protected = protected
- newprofile.dna = new dna.type
- dna.copy_dna(newprofile.dna)
- newprofile.name_list = name_list.Copy()
- newprofile.appearance_list = appearance_list.Copy()
- newprofile.flags_cover_list = flags_cover_list.Copy()
- newprofile.exists_list = exists_list.Copy()
- newprofile.item_color_list = item_color_list.Copy()
- newprofile.item_state_list = item_state_list.Copy()
- newprofile.underwear = underwear
- newprofile.undershirt = undershirt
- newprofile.socks = socks
-
-
-/datum/antagonist/changeling/xenobio
- name = "Xenobio Changeling"
- give_objectives = FALSE
- show_in_roundend = FALSE //These are here for admin tracking purposes only
- you_are_greet = FALSE
-
-/datum/antagonist/changeling/roundend_report()
- var/list/parts = list()
-
- var/changelingwin = 1
- if(!owner.current)
- changelingwin = 0
-
- parts += printplayer(owner)
-
- //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed.
- parts += "Changeling ID: [changelingID]."
- parts += "Genomes Extracted: [absorbedcount]"
- parts += " "
- if(objectives.len)
- var/count = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- parts += "Objective #[count]: [objective.explanation_text] Success!"
- else
- parts += "Objective #[count]: [objective.explanation_text] Fail."
- changelingwin = 0
- count++
-
- if(changelingwin)
- parts += "The changeling was successful!"
- else
- parts += "The changeling has failed."
-
- return parts.Join("
")
-
-/datum/antagonist/changeling/antag_listing_name()
- return ..() + "([changelingID])"
-
-/datum/antagonist/changeling/xenobio/antag_listing_name()
- return ..() + "(Xenobio)"
\ No newline at end of file
diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm
deleted file mode 100644
index 067801677b..0000000000
--- a/code/datums/antagonists/clockcult.dm
+++ /dev/null
@@ -1,219 +0,0 @@
-//CLOCKCULT PROOF OF CONCEPT
-/datum/antagonist/clockcult
- name = "Clock Cultist"
- roundend_category = "clock cultists"
- antagpanel_category = "Clockcult"
- job_rank = ROLE_SERVANT_OF_RATVAR
- var/datum/action/innate/hierophant/hierophant_network = new()
- var/datum/team/clockcult/clock_team
- var/make_team = TRUE //This should be only false for tutorial scarabs
-
-/datum/antagonist/clockcult/silent
- silent = TRUE
- show_in_antagpanel = FALSE //internal
-
-/datum/antagonist/clockcult/Destroy()
- qdel(hierophant_network)
- return ..()
-
-/datum/antagonist/clockcult/get_team()
- return clock_team
-
-/datum/antagonist/clockcult/create_team(datum/team/clockcult/new_team)
- if(!new_team && make_team)
- //TODO blah blah same as the others, allow multiple
- for(var/datum/antagonist/clockcult/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.clock_team)
- clock_team = H.clock_team
- return
- clock_team = new /datum/team/clockcult
- return
- if(make_team && !istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- clock_team = new_team
-
-/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner)
- . = ..()
- if(.)
- . = is_eligible_servant(new_owner.current)
-
-/datum/antagonist/clockcult/greet()
- if(!owner.current || silent)
- return
- owner.current.visible_message("[owner.current]'s eyes glow a blazing yellow!", null, null, 7, owner.current) //don't show the owner this message
- to_chat(owner.current, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \
- Justiciar above all else. Perform his every whim without hesitation.")
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE)
-
-/datum/antagonist/clockcult/on_gain()
- var/mob/living/current = owner.current
- SSticker.mode.servants_of_ratvar += owner
- SSticker.mode.update_servant_icons_added(owner)
- owner.special_role = ROLE_SERVANT_OF_RATVAR
- owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
- if(issilicon(current))
- if(iscyborg(current) && !silent)
- var/mob/living/silicon/robot/R = current
- if(R.connected_ai && !is_servant_of_ratvar(R.connected_ai))
- to_chat(R, "You have been desynced from your master AI.
\
- In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.")
- else
- to_chat(R, "Your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.")
- if(isAI(current))
- to_chat(current, "You are now able to use your cameras to listen in on conversations, but can no longer speak in anything but Ratvarian.")
- to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
- else if(isbrain(current) || isclockmob(current))
- to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.")
- ..()
- to_chat(current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]")
- antag_memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
" //Memorize the objectives
-
-/datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(istype(mob_override))
- current = mob_override
- GLOB.all_clockwork_mobs += current
- current.faction |= "ratvar"
- current.grant_language(/datum/language/ratvar)
- current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
- if(issilicon(current))
- var/mob/living/silicon/S = current
- if(iscyborg(S))
- var/mob/living/silicon/robot/R = S
- if(!R.shell)
- R.UnlinkSelf()
- R.module.rebuild_modules()
- else if(isAI(S))
- var/mob/living/silicon/ai/A = S
- A.can_be_carded = FALSE
- A.requires_power = POWER_REQ_CLOCKCULT
- var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame
- for(var/d in GLOB.cardinals)
- AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow
- A.add_overlay(AI_frame)
- if(!A.lacks_power())
- A.ai_restore_power()
- if(A.eyeobj)
- A.eyeobj.relay_speech = TRUE
- for(var/mob/living/silicon/robot/R in A.connected_robots)
- if(R.connected_ai == A)
- add_servant_of_ratvar(R)
- S.laws = new/datum/ai_laws/ratvar
- S.laws.associate(S)
- S.update_icons()
- S.show_laws()
- hierophant_network.title = "Silicon"
- hierophant_network.span_for_name = "nezbere"
- hierophant_network.span_for_message = "brass"
- else if(isbrain(current))
- hierophant_network.title = "Vessel"
- hierophant_network.span_for_name = "nezbere"
- hierophant_network.span_for_message = "alloy"
- else if(isclockmob(current))
- hierophant_network.title = "Construct"
- hierophant_network.span_for_name = "nezbere"
- hierophant_network.span_for_message = "brass"
- hierophant_network.Grant(current)
- current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump)
- var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
- if(G.active && ishuman(current))
- current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER))
-
-/datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override)
- var/mob/living/current = owner.current
- if(istype(mob_override))
- current = mob_override
- GLOB.all_clockwork_mobs -= current
- current.faction -= "ratvar"
- current.remove_language(/datum/language/ratvar)
- current.clear_alert("clockinfo")
- for(var/datum/action/innate/clockwork_armaments/C in owner.current.actions) //Removes any bound clockwork armor
- qdel(C)
- for(var/datum/action/innate/call_weapon/W in owner.current.actions) //and weapons too
- qdel(W)
- if(issilicon(current))
- var/mob/living/silicon/S = current
- if(isAI(S))
- var/mob/living/silicon/ai/A = S
- A.can_be_carded = initial(A.can_be_carded)
- A.requires_power = initial(A.requires_power)
- A.cut_overlays()
- S.make_laws()
- S.update_icons()
- S.show_laws()
- var/mob/living/temp_owner = current
- ..()
- if(iscyborg(temp_owner))
- var/mob/living/silicon/robot/R = temp_owner
- R.module.rebuild_modules()
- if(temp_owner)
- temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
- temp_owner.cut_overlays()
- temp_owner.regenerate_icons()
-
-/datum/antagonist/clockcult/on_removal()
- SSticker.mode.servants_of_ratvar -= owner
- SSticker.mode.update_servant_icons_removed(owner)
- if(!silent)
- owner.current.visible_message("[owner] seems to have remembered their true allegiance!", null, null, null, owner.current)
- to_chat(owner, "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
- owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG)
- owner.special_role = null
- if(iscyborg(owner.current))
- to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.")
- . = ..()
-
-
-/datum/antagonist/clockcult/admin_add(datum/mind/new_owner,mob/admin)
- add_servant_of_ratvar(new_owner.current, TRUE)
- message_admins("[key_name_admin(admin)] has made [new_owner.current] into a servant of Ratvar.")
- log_admin("[key_name(admin)] has made [new_owner.current] into a servant of Ratvar.")
-
-/datum/antagonist/clockcult/admin_remove(mob/user)
- remove_servant_of_ratvar(owner.current, TRUE)
- message_admins("[key_name_admin(user)] has removed clockwork servant status from [owner.current].")
- log_admin("[key_name(user)] has removed clockwork servant status from [owner.current].")
-
-/datum/antagonist/clockcult/get_admin_commands()
- . = ..()
- .["Give slab"] = CALLBACK(src,.proc/admin_give_slab)
-
-/datum/antagonist/clockcult/proc/admin_give_slab(mob/admin)
- if(!SSticker.mode.equip_servant(owner.current))
- to_chat(admin, "Failed to outfit [owner.current]!")
- else
- to_chat(admin, "Successfully gave [owner.current] servant equipment!")
-
-/datum/team/clockcult
- name = "Clockcult"
- var/list/objective
- var/datum/mind/eminence
-
-/datum/team/clockcult/proc/check_clockwork_victory()
- if(GLOB.clockwork_gateway_activated)
- return TRUE
- return FALSE
-
-/datum/team/clockcult/roundend_report()
- var/list/parts = list()
-
- if(check_clockwork_victory())
- parts += "Ratvar's servants defended the Ark until its activation!"
- else
- parts += "The Ark was destroyed! Ratvar will rust away for all eternity!"
- parts += " "
- parts += "The servants' objective was: [CLOCKCULT_OBJECTIVE]."
- parts += "Construction Value(CV) was: [GLOB.clockwork_construction_value]"
- for(var/i in SSticker.scripture_states)
- if(i != SCRIPTURE_DRIVER)
- parts += "[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED"
- if(eminence)
- parts += " [printplayer(eminence)]"
- if(members.len)
- parts += ""
- parts += printplayerlist(members - eminence)
-
- return "[parts.Join("
")]
"
\ No newline at end of file
diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm
deleted file mode 100644
index 3b9fa7b8c4..0000000000
--- a/code/datums/antagonists/cult.dm
+++ /dev/null
@@ -1,329 +0,0 @@
-#define SUMMON_POSSIBILITIES 3
-
-/datum/antagonist/cult
- name = "Cultist"
- roundend_category = "cultists"
- antagpanel_category = "Cult"
- var/datum/action/innate/cult/comm/communion = new
- var/datum/action/innate/cult/mastervote/vote = new
- job_rank = ROLE_CULTIST
- var/ignore_implant = FALSE
- var/give_equipment = FALSE
-
- var/datum/team/cult/cult_team
-
-/datum/antagonist/cult/get_team()
- return cult_team
-
-/datum/antagonist/cult/create_team(datum/team/cult/new_team)
- if(!new_team)
- //todo remove this and allow admin buttons to create more than one cult
- for(var/datum/antagonist/cult/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.cult_team)
- cult_team = H.cult_team
- return
- cult_team = new /datum/team/cult
- cult_team.setup_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- cult_team = new_team
-
-/datum/antagonist/cult/proc/add_objectives()
- objectives |= cult_team.objectives
- owner.objectives |= objectives
-
-/datum/antagonist/cult/proc/remove_objectives()
- owner.objectives -= objectives
-
-/datum/antagonist/cult/Destroy()
- QDEL_NULL(communion)
- QDEL_NULL(vote)
- return ..()
-
-/datum/antagonist/cult/can_be_owned(datum/mind/new_owner)
- . = ..()
- if(. && !ignore_implant)
- . = is_convertable_to_cult(new_owner.current,cult_team)
-
-/datum/antagonist/cult/greet()
- to_chat(owner, "You are a member of the cult!")
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change
- owner.announce_objectives()
-
-/datum/antagonist/cult/on_gain()
- . = ..()
- var/mob/living/current = owner.current
- add_objectives()
- if(give_equipment)
- equip_cultist()
- SSticker.mode.cult += owner // Only add after they've been given objectives
- SSticker.mode.update_cult_icons_added(owner)
- current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
-
- if(cult_team.blood_target && cult_team.blood_target_image && current.client)
- current.client.images += cult_team.blood_target_image
-
-
-/datum/antagonist/cult/proc/equip_cultist(tome=FALSE)
- var/mob/living/carbon/H = owner.current
- if(!istype(H))
- return
- if (owner.assigned_role == "Clown")
- to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
- H.dna.remove_mutation(CLOWNMUT)
-
- if(tome)
- . += cult_give_item(/obj/item/tome, H)
- else
- . += cult_give_item(/obj/item/paper/talisman/supply, H)
- to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.")
-
-
-/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
- var/list/slots = list(
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
- )
-
- var/T = new item_path(mob)
- var/item_name = initial(item_path.name)
- var/where = mob.equip_in_one_of_slots(T, slots)
- if(!where)
- to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).")
- return 0
- else
- to_chat(mob, "You have a [item_name] in your [where].")
- if(where == "backpack")
- var/obj/item/storage/B = mob.back
- B.orient2hud(mob)
- B.show_to(mob)
- return 1
-
-/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- current.faction |= "cult"
- current.grant_language(/datum/language/narsie)
- current.verbs += /mob/living/proc/cult_help
- if(!cult_team.cult_mastered)
- vote.Grant(current)
- communion.Grant(current)
- current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
-
-/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- current.faction -= "cult"
- current.remove_language(/datum/language/narsie)
- current.verbs -= /mob/living/proc/cult_help
- vote.Remove(current)
- communion.Remove(current)
- current.clear_alert("bloodsense")
-
-/datum/antagonist/cult/on_removal()
- remove_objectives()
- SSticker.mode.cult -= owner
- SSticker.mode.update_cult_icons_removed(owner)
- if(!silent)
- owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!", null, null, null, owner.current)
- to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.")
- owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG)
- if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client)
- owner.current.client.images -= cult_team.blood_target_image
- . = ..()
-
-/datum/antagonist/cult/admin_add(datum/mind/new_owner,mob/admin)
- give_equipment = FALSE
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has cult'ed [new_owner.current].")
- log_admin("[key_name(admin)] has cult'ed [new_owner.current].")
-
-/datum/antagonist/cult/admin_remove(mob/user)
- message_admins("[key_name_admin(user)] has decult'ed [owner.current].")
- log_admin("[key_name(user)] has decult'ed [owner.current].")
- SSticker.mode.remove_cultist(owner,silent=TRUE) //disgusting
-
-/datum/antagonist/cult/get_admin_commands()
- . = ..()
- .["Tome"] = CALLBACK(src,.proc/admin_give_tome)
- .["Amulet"] = CALLBACK(src,.proc/admin_give_amulet)
-
-/datum/antagonist/cult/proc/admin_give_tome(mob/admin)
- if(equip_cultist(owner.current,1))
- to_chat(admin, "Spawning tome failed!")
-
-/datum/antagonist/cult/proc/admin_give_amulet(mob/admin)
- if (equip_cultist(owner.current))
- to_chat(admin, "Spawning amulet failed!")
-
-/datum/antagonist/cult/master
- ignore_implant = TRUE
- show_in_antagpanel = FALSE //Feel free to add this later
- var/datum/action/innate/cult/master/finalreck/reckoning = new
- var/datum/action/innate/cult/master/cultmark/bloodmark = new
- var/datum/action/innate/cult/master/pulse/throwing = new
-
-/datum/antagonist/cult/master/Destroy()
- QDEL_NULL(reckoning)
- QDEL_NULL(bloodmark)
- QDEL_NULL(throwing)
- return ..()
-
-/datum/antagonist/cult/master/on_gain()
- . = ..()
- var/mob/living/current = owner.current
- set_antag_hud(current, "cultmaster")
-
-/datum/antagonist/cult/master/greet()
- to_chat(owner.current, "You are the cult's Master. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \
- targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location once.")
- to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.")
-
-/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- if(!cult_team.reckoning_complete)
- reckoning.Grant(current)
- bloodmark.Grant(current)
- throwing.Grant(current)
- current.update_action_buttons_icon()
- current.apply_status_effect(/datum/status_effect/cult_master)
-
-/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- reckoning.Remove(current)
- bloodmark.Remove(current)
- throwing.Remove(current)
- current.update_action_buttons_icon()
- current.remove_status_effect(/datum/status_effect/cult_master)
-
-/datum/team/cult
- name = "Cult"
-
- var/blood_target
- var/image/blood_target_image
- var/blood_target_reset_timer
-
- var/cult_vote_called = FALSE
- var/cult_mastered = FALSE
- var/reckoning_complete = FALSE
-
-
-/datum/team/cult/proc/setup_objectives()
- //SAC OBJECTIVE , todo: move this to objective internals
- var/list/target_candidates = list()
- var/datum/objective/sacrifice/sac_objective = new
- sac_objective.team = src
-
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
- target_candidates += player.mind
-
- if(target_candidates.len == 0)
- message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
- target_candidates += player.mind
- listclearnulls(target_candidates)
- if(LAZYLEN(target_candidates))
- sac_objective.target = pick(target_candidates)
- sac_objective.update_explanation_text()
-
- var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
- var/datum/preferences/sacface = sac_objective.target.current.client.prefs
- var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
- reshape.Shift(SOUTH, 4)
- reshape.Shift(EAST, 1)
- reshape.Crop(7,4,26,31)
- reshape.Crop(-5,-3,26,30)
- sac_objective.sac_image = reshape
-
- objectives += sac_objective
- else
- message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
-
-
- //SUMMON OBJECTIVE
-
- var/datum/objective/eldergod/summon_objective = new()
- summon_objective.team = src
- objectives += summon_objective
-
-/datum/objective/sacrifice
- var/sacced = FALSE
- var/sac_image
-
-/datum/objective/sacrifice/check_completion()
- return sacced || completed
-
-/datum/objective/sacrifice/update_explanation_text()
- if(target)
- explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it."
- else
- explanation_text = "The veil has already been weakened here, proceed to the final objective."
-
-/datum/objective/eldergod
- var/summoned = FALSE
- var/list/summon_spots = list()
-
-/datum/objective/eldergod/New()
- ..()
- var/sanity = 0
- while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100)
- var/area/summon = pick(GLOB.sortedAreas - summon_spots)
- if(summon && is_station_level(summon.z) && summon.valid_territory)
- summon_spots += summon
- sanity++
- update_explanation_text()
-
-/datum/objective/eldergod/update_explanation_text()
- explanation_text = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin."
-
-/datum/objective/eldergod/check_completion()
- return summoned || completed
-
-/datum/team/cult/proc/check_cult_victory()
- for(var/datum/objective/O in objectives)
- if(!O.check_completion())
- return FALSE
- return TRUE
-
-/datum/team/cult/roundend_report()
- var/list/parts = list()
-
- if(check_cult_victory())
- parts += "The cult has succeeded! Nar-sie has snuffed out another torch in the void!"
- else
- parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!"
-
- if(objectives.len)
- parts += "The cultists' objectives were:"
- var/count = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- parts += "Objective #[count]: [objective.explanation_text] Success!"
- else
- parts += "Objective #[count]: [objective.explanation_text] Fail."
- count++
-
- if(members.len)
- parts += ""
- parts += printplayerlist(members)
-
- return "[parts.Join("
")]
"
-
-/datum/team/cult/is_gamemode_hero()
- return SSticker.mode.name == "cult"
\ No newline at end of file
diff --git a/code/datums/antagonists/datum_iaa.dm b/code/datums/antagonists/datum_iaa.dm
deleted file mode 100644
index fd2c4e89a0..0000000000
--- a/code/datums/antagonists/datum_iaa.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/antagonist/iaa
-
-/datum/antagonist/iaa/apply_innate_effects()
- .=..() //in case the base is used in future
- if(owner&&owner.current)
- give_pinpointer(owner.current)
-
-/datum/antagonist/iaa/remove_innate_effects()
- .=..()
- if(owner&&owner.current)
- owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer)
\ No newline at end of file
diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm
deleted file mode 100644
index da34debf95..0000000000
--- a/code/datums/antagonists/datum_traitor.dm
+++ /dev/null
@@ -1,352 +0,0 @@
-/datum/antagonist/traitor
- name = "Traitor"
- roundend_category = "traitors"
- antagpanel_category = "Traitor"
- job_rank = ROLE_TRAITOR
- var/should_specialise = TRUE //do we split into AI and human, set to true on inital assignment only
- var/ai_datum = /datum/antagonist/traitor/AI
- var/human_datum = /datum/antagonist/traitor/human
- var/special_role = ROLE_TRAITOR
- var/employer = "The Syndicate"
- var/give_objectives = TRUE
- var/should_give_codewords = TRUE
-
-
-
-/datum/antagonist/traitor/human
- show_in_antagpanel = FALSE
- should_specialise = FALSE
- var/should_equip = TRUE
-
-
-/datum/antagonist/traitor/AI
- show_in_antagpanel = FALSE
- should_specialise = FALSE
-
-/datum/antagonist/traitor/specialization(datum/mind/new_owner)
- if(should_specialise)
- if(new_owner.current && isAI(new_owner.current))
- return new ai_datum()
- else
- return new human_datum()
- else
- return ..()
-
-/datum/antagonist/traitor/on_gain()
- SSticker.mode.traitors += owner
- owner.special_role = special_role
- if(give_objectives)
- forge_traitor_objectives()
- finalize_traitor()
- ..()
-
-/datum/antagonist/traitor/apply_innate_effects()
- if(owner.assigned_role == "Clown")
- var/mob/living/carbon/human/traitor_mob = owner.current
- if(traitor_mob && istype(traitor_mob))
- if(!silent)
- to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
- traitor_mob.dna.remove_mutation(CLOWNMUT)
-
-/datum/antagonist/traitor/remove_innate_effects()
- if(owner.assigned_role == "Clown")
- var/mob/living/carbon/human/traitor_mob = owner.current
- if(traitor_mob && istype(traitor_mob))
- traitor_mob.dna.add_mutation(CLOWNMUT)
-
-/datum/antagonist/traitor/on_removal()
- SSticker.mode.traitors -= owner
- for(var/O in objectives)
- owner.objectives -= O
- objectives = list()
- if(!silent && owner.current)
- to_chat(owner.current," You are no longer the [special_role]! ")
- owner.special_role = null
- ..()
-
-/datum/antagonist/traitor/AI/on_removal()
- if(owner.current && isAI(owner.current))
- var/mob/living/silicon/ai/A = owner.current
- A.set_zeroth_law("")
- A.verbs -= /mob/living/silicon/ai/proc/choose_modules
- A.malf_picker.remove_malf_verbs(A)
- qdel(A.malf_picker)
- ..()
-
-/datum/antagonist/traitor/proc/add_objective(var/datum/objective/O)
- owner.objectives += O
- objectives += O
-
-/datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O)
- owner.objectives -= O
- objectives -= O
-
-/datum/antagonist/traitor/proc/forge_traitor_objectives()
- return
-
-/datum/antagonist/traitor/human/forge_traitor_objectives()
- var/is_hijacker = FALSE
- if (GLOB.joined_player_list.len >= 30) // Less murderboning on lowpop thanks
- is_hijacker = prob(10)
- var/martyr_chance = prob(20)
- var/objective_count = is_hijacker //Hijacking counts towards number of objectives
- if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors
- if(!SSticker.mode.exchange_red)
- SSticker.mode.exchange_red = owner
- else
- SSticker.mode.exchange_blue = owner
- assign_exchange_role(SSticker.mode.exchange_red)
- assign_exchange_role(SSticker.mode.exchange_blue)
- objective_count += 1 //Exchange counts towards number of objectives
- var/toa = CONFIG_GET(number/traitor_objectives_amount)
- for(var/i = objective_count, i < toa, i++)
- forge_single_objective()
-
- if(is_hijacker && objective_count <= toa) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount
- if (!(locate(/datum/objective/hijack) in owner.objectives))
- var/datum/objective/hijack/hijack_objective = new
- hijack_objective.owner = owner
- add_objective(hijack_objective)
- return
-
-
- var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead.
- for(var/datum/objective/O in owner.objectives)
- if(!O.martyr_compatible)
- martyr_compatibility = 0
- break
-
- if(martyr_compatibility && martyr_chance)
- var/datum/objective/martyr/martyr_objective = new
- martyr_objective.owner = owner
- add_objective(martyr_objective)
- return
-
- else
- if(!(locate(/datum/objective/escape) in owner.objectives))
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- add_objective(escape_objective)
- return
-
-/datum/antagonist/traitor/AI/forge_traitor_objectives()
- var/objective_count = 0
-
- if(prob(30))
- objective_count += forge_single_objective()
-
- for(var/i = objective_count, i < CONFIG_GET(number/traitor_objectives_amount), i++)
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = owner
- kill_objective.find_target()
- add_objective(kill_objective)
-
- var/datum/objective/survive/exist/exist_objective = new
- exist_objective.owner = owner
- add_objective(exist_objective)
-/datum/antagonist/traitor/proc/forge_single_objective()
- return 0
-/datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added
- .=1
- if(prob(50))
- var/list/active_ais = active_ais()
- if(active_ais.len && prob(100/GLOB.joined_player_list.len))
- var/datum/objective/destroy/destroy_objective = new
- destroy_objective.owner = owner
- destroy_objective.find_target()
- add_objective(destroy_objective)
- else if(prob(30))
- var/datum/objective/maroon/maroon_objective = new
- maroon_objective.owner = owner
- maroon_objective.find_target()
- add_objective(maroon_objective)
- else
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = owner
- kill_objective.find_target()
- add_objective(kill_objective)
- else
- if(prob(15) && !(locate(/datum/objective/download in owner.objectives)))
- var/datum/objective/download/download_objective = new
- download_objective.owner = owner
- download_objective.gen_amount_goal()
- add_objective(download_objective)
- else
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = owner
- steal_objective.find_target()
- add_objective(steal_objective)
-
-/datum/antagonist/traitor/AI/forge_single_objective()
- .=1
- var/special_pick = rand(1,4)
- switch(special_pick)
- if(1)
- var/datum/objective/block/block_objective = new
- block_objective.owner = owner
- add_objective(block_objective)
- if(2)
- var/datum/objective/purge/purge_objective = new
- purge_objective.owner = owner
- add_objective(purge_objective)
- if(3)
- var/datum/objective/robot_army/robot_objective = new
- robot_objective.owner = owner
- add_objective(robot_objective)
- if(4) //Protect and strand a target
- var/datum/objective/protect/yandere_one = new
- yandere_one.owner = owner
- add_objective(yandere_one)
- yandere_one.find_target()
- var/datum/objective/maroon/yandere_two = new
- yandere_two.owner = owner
- yandere_two.target = yandere_one.target
- yandere_two.update_explanation_text() // normally called in find_target()
- add_objective(yandere_two)
- .=2
-
-/datum/antagonist/traitor/greet()
- to_chat(owner.current, "You are the [owner.special_role].")
- owner.announce_objectives()
- if(should_give_codewords)
- give_codewords()
-
-/datum/antagonist/traitor/proc/finalize_traitor()
- SSticker.mode.update_traitor_icons_added(owner)
- return
-
-/datum/antagonist/traitor/AI/finalize_traitor()
- ..()
- add_law_zero()
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE)
- owner.current.grant_language(/datum/language/codespeak)
-
-/datum/antagonist/traitor/human/finalize_traitor()
- ..()
- if(should_equip)
- equip(silent)
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE)
-
-/datum/antagonist/traitor/proc/give_codewords()
- if(!owner.current)
- return
- var/mob/traitor_mob=owner.current
-
- to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:")
- to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]")
- to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]")
-
- antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
"
- antag_memory += "Code Response: [GLOB.syndicate_code_response]
"
-
- to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.")
-
-/datum/antagonist/traitor/AI/proc/add_law_zero()
- var/mob/living/silicon/ai/killer = owner.current
- if(!killer || !istype(killer))
- return
- var/law = "Accomplish your objectives at all costs."
- var/law_borg = "Accomplish your AI's objectives at all costs."
- killer.set_zeroth_law(law, law_borg)
- killer.set_syndie_radio()
- to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!")
- killer.add_malf_picker()
-
-/datum/antagonist/traitor/proc/equip(var/silent = FALSE)
- return
-
-/datum/antagonist/traitor/human/equip(var/silent = FALSE)
- owner.equip_traitor(employer, silent, src)
-
-/datum/antagonist/traitor/human/proc/assign_exchange_role()
- //set faction
- var/faction = "red"
- if(owner == SSticker.mode.exchange_blue)
- faction = "blue"
-
- //Assign objectives
- var/datum/objective/steal/exchange/exchange_objective = new
- exchange_objective.set_faction(faction,((faction == "red") ? SSticker.mode.exchange_blue : SSticker.mode.exchange_red))
- exchange_objective.owner = owner
- add_objective(exchange_objective)
-
- if(prob(20))
- var/datum/objective/steal/exchange/backstab/backstab_objective = new
- backstab_objective.set_faction(faction)
- backstab_objective.owner = owner
- add_objective(backstab_objective)
-
- //Spawn and equip documents
- var/mob/living/carbon/human/mob = owner.current
-
- var/obj/item/folder/syndicate/folder
- if(owner == SSticker.mode.exchange_red)
- folder = new/obj/item/folder/syndicate/red(mob.loc)
- else
- folder = new/obj/item/folder/syndicate/blue(mob.loc)
-
- var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
- )
-
- var/where = "At your feet"
- var/equipped_slot = mob.equip_in_one_of_slots(folder, slots)
- if (equipped_slot)
- where = "In your [equipped_slot]"
- to_chat(mob, "
[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
")
-
-//TODO Collate
-/datum/antagonist/traitor/roundend_report()
- var/list/result = list()
-
- var/traitorwin = TRUE
-
- result += printplayer(owner)
-
- var/TC_uses = 0
- var/uplink_true = FALSE
- var/purchases = ""
- var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[owner.key]
- if(H)
- TC_uses = H.total_spent
- uplink_true = TRUE
- purchases += H.generate_render(FALSE)
-
- var/objectives_text = ""
- if(objectives.len)//If the traitor had no objectives, don't need to process this.
- var/count = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- objectives_text += "
Objective #[count]: [objective.explanation_text] Success!"
- else
- objectives_text += "
Objective #[count]: [objective.explanation_text] Fail."
- traitorwin = FALSE
- count++
-
- if(uplink_true)
- var/uplink_text = "(used [TC_uses] TC) [purchases]"
- if(TC_uses==0 && traitorwin)
- var/static/icon/badass = icon('icons/badass.dmi', "badass")
- uplink_text += "[icon2html(badass, world)]"
- result += uplink_text
-
- result += objectives_text
-
- var/special_role_text = lowertext(name)
-
- if(traitorwin)
- result += "The [special_role_text] was successful!"
- else
- result += "The [special_role_text] has failed!"
- SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg')
-
- return result.Join("
")
-
-/datum/antagonist/traitor/roundend_report_footer()
- return "
The code phrases were: [GLOB.syndicate_code_phrase]
\
- The code responses were: [GLOB.syndicate_code_response]
"
-
-/datum/antagonist/traitor/is_gamemode_hero()
- return SSticker.mode.name == "traitor"
\ No newline at end of file
diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm
deleted file mode 100644
index 858b2d1ef1..0000000000
--- a/code/datums/antagonists/devil.dm
+++ /dev/null
@@ -1,582 +0,0 @@
-#define BLOOD_THRESHOLD 3 //How many souls are needed per stage.
-#define TRUE_THRESHOLD 7
-#define ARCH_THRESHOLD 12
-
-#define BASIC_DEVIL 0
-#define BLOOD_LIZARD 1
-#define TRUE_DEVIL 2
-#define ARCH_DEVIL 3
-
-#define LOSS_PER_DEATH 2
-
-#define SOULVALUE soulsOwned.len-reviveNumber
-
-#define DEVILRESURRECTTIME 600
-
-GLOBAL_LIST_EMPTY(allDevils)
-GLOBAL_LIST_INIT(lawlorify, list (
- LORE = list(
- OBLIGATION_FOOD = "This devil seems to always offer its victims food before slaughtering them.",
- OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.",
- OBLIGATION_DANCEOFF = "This devil will never turn down a dance off.",
- OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.",
- OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.",
- OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.",
- OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.",
- OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.",
- BANE_SILVER = "Silver seems to gravely injure this devil.",
- BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.",
- BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.",
- BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.",
- BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.",
- BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.",
- BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.",
- BAN_HURTWOMAN = "This devil seems to prefer hunting men.",
- BAN_CHAPEL = "This devil avoids holy ground.",
- BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.",
- BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.",
- BAN_STRIKEUNCONSCIOUS = "This devil only shows interest in those who are awake.",
- BAN_HURTLIZARD = "This devil will not strike a lizardman first.",
- BAN_HURTANIMAL = "This devil avoids hurting animals.",
- BANISH_WATER = "To banish the devil, you must infuse its body with holy water.",
- BANISH_COFFIN = "This devil will return to life if its remains are not placed within a coffin.",
- BANISH_FORMALDYHIDE = "To banish the devil, you must inject its lifeless body with embalming fluid.",
- BANISH_RUNES = "This devil will resurrect after death, unless its remains are within a rune.",
- BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.",
- BANISH_DESTRUCTION = "Its corpse must be utterly destroyed to prevent resurrection.",
- BANISH_FUNERAL_GARB = "If clad in funeral garments, this devil will be unable to resurrect. Should the clothes not fit, lay them gently on top of the devil's corpse."
- ),
- LAW = list(
- OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.",
- OBLIGATION_FIDDLE = "When not in immediate danger, if you are challenged to a musical duel, you must accept it. You are not obligated to duel the same person twice.",
- OBLIGATION_DANCEOFF = "When not in immediate danger, if you are challenged to a dance off, you must accept it. You are not obligated to face off with the same person twice.",
- OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.",
- OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.",
- OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.",
- OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.",
- OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.",
- BAN_HURTWOMAN = "You must never harm a female outside of self defense.",
- BAN_CHAPEL = "You must never attempt to enter the chapel.",
- BAN_HURTPRIEST = "You must never attack a priest.",
- BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
- BAN_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.",
- BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.",
- BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
- BANE_SILVER = "Silver, in all of its forms shall be your downfall.",
- BANE_SALT = "Salt will disrupt your magical abilities.",
- BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.",
- BANE_IRON = "Cold wrought iron shall act as poison to you.",
- BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.",
- BANE_HARVEST = "The fruits of the harvest shall be your downfall.",
- BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.",
- BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.",
- BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.",
- BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.",
- BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.",
- BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.",
- BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
- BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
- )
- ))
-
-//These are also used in the codex gigas, so let's declare them globally.
-GLOBAL_LIST_INIT(devil_pre_title, list("Dark ", "Hellish ", "Fallen ", "Fiery ", "Sinful ", "Blood ", "Fluffy "))
-GLOBAL_LIST_INIT(devil_title, list("Lord ", "Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept "))
-GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", "mya", "folth", "wren", "geyr", "hil", "niet", "twou", "phi", "coa"))
-GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr."))
-/datum/antagonist/devil
- name = "Devil"
- roundend_category = "devils"
- antagpanel_category = "Devil"
- job_rank = ROLE_DEVIL
- //Don't delete upon mind destruction, otherwise soul re-selling will break.
- delete_on_mind_deletion = FALSE
- var/obligation
- var/ban
- var/bane
- var/banish
- var/truename
- var/list/datum/mind/soulsOwned = new
- var/reviveNumber = 0
- var/form = BASIC_DEVIL
- var/static/list/devil_spells = typecacheof(list(
- /obj/effect/proc_holder/spell/aimed/fireball/hellish,
- /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork,
- /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater,
- /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended,
- /obj/effect/proc_holder/spell/targeted/infernal_jaunt,
- /obj/effect/proc_holder/spell/targeted/sintouch,
- /obj/effect/proc_holder/spell/targeted/sintouch/ascended,
- /obj/effect/proc_holder/spell/targeted/summon_contract,
- /obj/effect/proc_holder/spell/targeted/conjure_item/violin,
- /obj/effect/proc_holder/spell/targeted/summon_dancefloor))
- var/ascendable = FALSE
-
-/datum/antagonist/devil/can_be_owned(datum/mind/new_owner)
- . = ..()
- return . && (ishuman(new_owner.current) || iscyborg(new_owner.current))
-
-/datum/antagonist/devil/get_admin_commands()
- . = ..()
- .["Toggle ascendable"] = CALLBACK(src,.proc/admin_toggle_ascendable)
-
-
-/datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin)
- ascendable = !ascendable
- message_admins("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable]")
- log_admin("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable])")
-
-/datum/antagonist/devil/admin_add(datum/mind/new_owner,mob/admin)
- switch(alert(admin,"Should the devil be able to ascend",,"Yes","No","Cancel"))
- if("Yes")
- ascendable = TRUE
- if("No")
- ascendable = FALSE
- else
- return
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]")
- log_admin("[key_name(admin)] has devil'ed [new_owner.current]. [ascendable ? "(Ascendable)":""]")
-
-/datum/antagonist/devil/antag_listing_name()
- return ..() + "([truename])"
-
-/proc/devilInfo(name)
- if(GLOB.allDevils[lowertext(name)])
- return GLOB.allDevils[lowertext(name)]
- else
- var/datum/fakeDevil/devil = new /datum/fakeDevil(name)
- GLOB.allDevils[lowertext(name)] = devil
- return devil
-
-/proc/randomDevilName()
- var/name = ""
- if(prob(65))
- if(prob(35))
- name = pick(GLOB.devil_pre_title)
- name += pick(GLOB.devil_title)
- var/probability = 100
- name += pick(GLOB.devil_syllable)
- while(prob(probability))
- name += pick(GLOB.devil_syllable)
- probability -= 20
- if(prob(40))
- name += pick(GLOB.devil_suffix)
- return name
-
-/proc/randomdevilobligation()
- return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
-
-/proc/randomdevilban()
- return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
-
-/proc/randomdevilbane()
- return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX)
-
-/proc/randomdevilbanish()
- return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
-
-/datum/antagonist/devil/proc/add_soul(datum/mind/soul)
- if(soulsOwned.Find(soul))
- return
- soulsOwned += soul
- owner.current.nutrition = NUTRITION_LEVEL_FULL
- to_chat(owner.current, "You feel satiated as you received a new soul.")
- update_hud()
- switch(SOULVALUE)
- if(0)
- to_chat(owner.current, "Your hellish powers have been restored.")
- give_appropriate_spells()
- if(BLOOD_THRESHOLD)
- increase_blood_lizard()
- if(TRUE_THRESHOLD)
- increase_true_devil()
- if(ARCH_THRESHOLD)
- increase_arch_devil()
-
-/datum/antagonist/devil/proc/remove_soul(datum/mind/soul)
- if(soulsOwned.Remove(soul))
- check_regression()
- to_chat(owner.current, "You feel as though a soul has slipped from your grasp.")
- update_hud()
-
-/datum/antagonist/devil/proc/check_regression()
- if(form == ARCH_DEVIL)
- return //arch devil can't regress
- //Yes, fallthrough behavior is intended, so I can't use a switch statement.
- if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD)
- regress_blood_lizard()
- if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD)
- regress_humanoid()
- if(SOULVALUE < 0)
- give_appropriate_spells()
- to_chat(owner.current, "As punishment for your failures, all of your powers except contract creation have been revoked.")
-
-/datum/antagonist/devil/proc/regress_humanoid()
- to_chat(owner.current, "Your powers weaken, have more contracts be signed to regain power.")
- if(ishuman(owner.current))
- var/mob/living/carbon/human/H = owner.current
- H.set_species(/datum/species/human, 1)
- H.regenerate_icons()
- give_appropriate_spells()
- if(istype(owner.current.loc, /obj/effect/dummy/slaughter/))
- owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted.
- form = BASIC_DEVIL
-
-/datum/antagonist/devil/proc/regress_blood_lizard()
- var/mob/living/carbon/true_devil/D = owner.current
- to_chat(D, "Your powers weaken, have more contracts be signed to regain power.")
- D.oldform.forceMove(D.drop_location())
- owner.transfer_to(D.oldform)
- give_appropriate_spells()
- qdel(D)
- form = BLOOD_LIZARD
- update_hud()
-
-
-/datum/antagonist/devil/proc/increase_blood_lizard()
- to_chat(owner.current, "You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.")
- sleep(50)
- if(ishuman(owner.current))
- var/mob/living/carbon/human/H = owner.current
- H.set_species(/datum/species/lizard, 1)
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.dna.features["mcolor"] = "511" //A deep red
- H.regenerate_icons()
- else //Did the devil get hit by a staff of transmutation?
- owner.current.color = "#501010"
- give_appropriate_spells()
- form = BLOOD_LIZARD
-
-
-
-/datum/antagonist/devil/proc/increase_true_devil()
- to_chat(owner.current, "You feel as though your current form is about to shed. You will soon turn into a true devil.")
- sleep(50)
- var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
- A.faction |= "hell"
- owner.current.forceMove(A)
- A.oldform = owner.current
- owner.transfer_to(A)
- A.set_name()
- give_appropriate_spells()
- form = TRUE_DEVIL
- update_hud()
-
-/datum/antagonist/devil/proc/increase_arch_devil()
- if(!ascendable)
- return
- var/mob/living/carbon/true_devil/D = owner.current
- to_chat(D, "You feel as though your form is about to ascend.")
- sleep(50)
- if(!D)
- return
- D.visible_message("[D]'s skin begins to erupt with spikes.", \
- "Your flesh begins creating a shield around yourself.")
- sleep(100)
- if(!D)
- return
- D.visible_message("The horns on [D]'s head slowly grow and elongate.", \
- "Your body continues to mutate. Your telepathic abilities grow.")
- sleep(90)
- if(!D)
- return
- D.visible_message("[D]'s body begins to violently stretch and contort.", \
- "You begin to rend apart the final barriers to ultimate power.")
- sleep(40)
- if(!D)
- return
- to_chat(D, "Yes!")
- sleep(10)
- if(!D)
- return
- to_chat(D, "YES!!")
- sleep(10)
- if(!D)
- return
- to_chat(D, "YE--")
- sleep(1)
- if(!D)
- return
- to_chat(world, "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"")
- SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg'))
- give_appropriate_spells()
- D.convert_to_archdevil()
- if(istype(D.loc, /obj/effect/dummy/slaughter/))
- D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted.
- var/area/A = get_area(owner.current)
- if(A)
- notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK)
- sleep(50)
- if(!SSticker.mode.devil_ascended)
- SSshuttle.emergency.request(null, set_coefficient = 0.3)
- SSticker.mode.devil_ascended++
- form = ARCH_DEVIL
-
-/datum/antagonist/devil/proc/remove_spells()
- for(var/X in owner.spell_list)
- var/obj/effect/proc_holder/spell/S = X
- if(is_type_in_typecache(S, devil_spells))
- owner.RemoveSpell(S)
-
-/datum/antagonist/devil/proc/give_summon_contract()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null))
- if(obligation == OBLIGATION_FIDDLE)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/violin(null))
- else if(obligation == OBLIGATION_DANCEOFF)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_dancefloor(null))
-
-/datum/antagonist/devil/proc/give_appropriate_spells()
- remove_spells()
- give_summon_contract()
- if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
- give_arch_spells()
- else if(SOULVALUE >= TRUE_THRESHOLD)
- give_true_spells()
- else if(SOULVALUE >= BLOOD_THRESHOLD)
- give_blood_spells()
- else if(SOULVALUE >= 0)
- give_base_spells()
-
-/datum/antagonist/devil/proc/give_base_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null))
-
-/datum/antagonist/devil/proc/give_blood_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
-
-/datum/antagonist/devil/proc/give_true_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null))
-
-/datum/antagonist/devil/proc/give_arch_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null))
-
-/datum/antagonist/devil/proc/beginResurrectionCheck(mob/living/body)
- if(SOULVALUE>0)
- to_chat(owner.current, "Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.")
- sleep(DEVILRESURRECTTIME)
- if (!body || body.stat == DEAD)
- if(SOULVALUE>0)
- if(check_banishment(body))
- to_chat(owner.current, "Unfortunately, the mortals have finished a ritual that prevents your resurrection.")
- return -1
- else
- to_chat(owner.current, "WE LIVE AGAIN!")
- return hellish_resurrection(body)
- else
- to_chat(owner.current, "Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.")
- return -1
- else
- to_chat(owner.current, " You seem to have resurrected without your hellish powers.")
- else
- to_chat(owner.current, "Your hellish powers are too weak to resurrect yourself.")
-
-/datum/antagonist/devil/proc/check_banishment(mob/living/body)
- switch(banish)
- if(BANISH_WATER)
- if(iscarbon(body))
- var/mob/living/carbon/H = body
- return H.reagents.has_reagent("holy water")
- return 0
- if(BANISH_COFFIN)
- return (body && istype(body.loc, /obj/structure/closet/coffin))
- if(BANISH_FORMALDYHIDE)
- if(iscarbon(body))
- var/mob/living/carbon/H = body
- return H.reagents.has_reagent("formaldehyde")
- return 0
- if(BANISH_RUNES)
- if(body)
- for(var/obj/effect/decal/cleanable/crayon/R in range(0,body))
- if (R.name == "rune")
- return 1
- return 0
- if(BANISH_CANDLES)
- if(body)
- var/count = 0
- for(var/obj/item/candle/C in range(1,body))
- count += C.lit
- if(count>=4)
- return 1
- return 0
- if(BANISH_DESTRUCTION)
- if(body)
- return 0
- return 1
- if(BANISH_FUNERAL_GARB)
- if(ishuman(body))
- var/mob/living/carbon/human/H = body
- if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/burial))
- return 1
- return 0
- else
- for(var/obj/item/clothing/under/burial/B in range(0,body))
- if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something.
- return 1
- return 0
-
-/datum/antagonist/devil/proc/hellish_resurrection(mob/living/body)
- message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.")
- if(SOULVALUE < ARCH_THRESHOLD || !ascendable) // once ascended, arch devils do not go down in power by any means.
- reviveNumber += LOSS_PER_DEATH
- update_hud()
- if(body)
- body.revive(TRUE, TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart.
- if(istype(body.loc, /obj/effect/dummy/slaughter/))
- body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
- if(istype(body, /mob/living/carbon/true_devil))
- var/mob/living/carbon/true_devil/D = body
- if(D.oldform)
- D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
- if(body.stat == DEAD)
- create_new_body()
- else
- create_new_body()
- check_regression()
-
-/datum/antagonist/devil/proc/create_new_body()
- if(GLOB.blobstart.len > 0)
- var/turf/targetturf = get_turf(pick(GLOB.blobstart))
- var/mob/currentMob = owner.current
- if(!currentMob)
- currentMob = owner.get_ghost()
- if(!currentMob)
- message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
- return -1
- if(currentMob.mind != owner)
- message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
- return -1
- currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1)
- var/mob/living/carbon/human/H = owner.current
- H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
- H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
- if(SOULVALUE >= BLOOD_THRESHOLD)
- H.set_species(/datum/species/lizard, 1)
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.dna.features["mcolor"] = "511"
- H.regenerate_icons()
- if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
- var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
- A.faction |= "hell"
- H.forceMove(A)
- A.oldform = H
- owner.transfer_to(A, TRUE)
- A.set_name()
- if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
- A.convert_to_archdevil()
- else
- throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
-
-
-/datum/antagonist/devil/proc/update_hud()
- if(iscarbon(owner.current))
- var/mob/living/C = owner.current
- if(C.hud_used && C.hud_used.devilsouldisplay)
- C.hud_used.devilsouldisplay.update_counter(SOULVALUE)
-
-/datum/antagonist/devil/greet()
- to_chat(owner.current, "You remember your link to the infernal. You are [truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.")
- to_chat(owner.current, "However, your infernal form is not without weaknesses.")
- to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.")
- to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.")
- to_chat(owner.current, GLOB.lawlorify[LAW][bane])
- to_chat(owner.current, GLOB.lawlorify[LAW][ban])
- to_chat(owner.current, GLOB.lawlorify[LAW][obligation])
- to_chat(owner.current, GLOB.lawlorify[LAW][banish])
- to_chat(owner.current, "Remember, the crew can research your weaknesses if they find out your devil name.
")
- .=..()
-
-/datum/antagonist/devil/on_gain()
- truename = randomDevilName()
- ban = randomdevilban()
- bane = randomdevilbane()
- obligation = randomdevilobligation()
- banish = randomdevilbanish()
- GLOB.allDevils[lowertext(truename)] = src
-
- antag_memory += "Your devilic true name is [truename]
[GLOB.lawlorify[LAW][ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][bane]]
[GLOB.lawlorify[LAW][obligation]]
[GLOB.lawlorify[LAW][banish]]
"
- if(issilicon(owner.current))
- var/mob/living/silicon/robot_devil = owner.current
- var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.")
- robot_devil.set_law_sixsixsix(laws)
- sleep(10)
- if(owner.assigned_role == "Clown" && ishuman(owner.current))
- var/mob/living/carbon/human/S = owner.current
- to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.")
- S.dna.remove_mutation(CLOWNMUT)
- .=..()
-
-/datum/antagonist/devil/on_removal()
- to_chat(owner.current, "Your infernal link has been severed! You are no longer a devil!")
- .=..()
-
-/datum/antagonist/devil/apply_innate_effects(mob/living/mob_override)
- give_appropriate_spells()
- owner.current.grant_all_languages(TRUE)
- update_hud()
- .=..()
-
-/datum/antagonist/devil/remove_innate_effects(mob/living/mob_override)
- for(var/X in owner.spell_list)
- var/obj/effect/proc_holder/spell/S = X
- if(is_type_in_typecache(S, devil_spells))
- owner.RemoveSpell(S)
- .=..()
-
-/datum/antagonist/devil/proc/printdevilinfo()
- var/list/parts = list()
- parts += "The devil's true name is: [truename]"
- parts += "The devil's bans were:"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]"
- return parts.Join("
")
-
-/datum/antagonist/devil/roundend_report()
- var/list/parts = list()
- parts += printplayer(owner)
- parts += printdevilinfo()
- parts += printobjectives(owner)
- return parts.Join("
")
-
-/datum/antagonist/devil/roundend_report_footer()
- //sintouched go here for now as a hack , TODO proper antag datum for these
- var/list/parts = list()
- if(SSticker.mode.sintouched.len)
- parts += ""
- var/list/sintouchedUnique = uniqueList(SSticker.mode.sintouched)
- for(var/S in sintouchedUnique)
- var/datum/mind/sintouched_mind = S
- parts += printplayer(sintouched_mind)
- parts += printobjectives(sintouched_mind)
- return parts.Join("
")
-
-//A simple super light weight datum for the codex gigas.
-/datum/fakeDevil
- var/truename
- var/bane
- var/obligation
- var/ban
- var/banish
- var/ascendable
-
-/datum/fakeDevil/New(name = randomDevilName())
- truename = name
- bane = randomdevilbane()
- obligation = randomdevilobligation()
- ban = randomdevilban()
- banish = randomdevilbanish()
- ascendable = prob(25)
diff --git a/code/datums/antagonists/internal_affairs.dm b/code/datums/antagonists/internal_affairs.dm
deleted file mode 100644
index 9077b84dcd..0000000000
--- a/code/datums/antagonists/internal_affairs.dm
+++ /dev/null
@@ -1,302 +0,0 @@
-#define PINPOINTER_MINIMUM_RANGE 15
-#define PINPOINTER_EXTRA_RANDOM_RANGE 10
-#define PINPOINTER_PING_TIME 40
-#define PROB_ACTUAL_TRAITOR 20
-#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent"
-
-/datum/antagonist/traitor/internal_affairs
- name = "Internal Affairs Agent"
- human_datum = /datum/antagonist/traitor/human/internal_affairs
- ai_datum = /datum/antagonist/traitor/AI/internal_affairs
- antagpanel_category = "IAA"
-
-/datum/antagonist/traitor/AI/internal_affairs
- name = "Internal Affairs Agent"
- employer = "Nanotrasen"
- special_role = "internal affairs agent"
- antagpanel_category = "IAA"
- var/syndicate = FALSE
- var/last_man_standing = FALSE
- var/list/datum/mind/targets_stolen
-
-
-/datum/antagonist/traitor/human/internal_affairs
- name = "Internal Affairs Agent"
- employer = "Nanotrasen"
- special_role = "internal affairs agent"
- antagpanel_category = "IAA"
- var/syndicate = FALSE
- var/last_man_standing = FALSE
- var/list/datum/mind/targets_stolen
-
-
-/datum/antagonist/traitor/human/internal_affairs/proc/give_pinpointer()
- if(owner && owner.current)
- owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer)
-
-/datum/antagonist/traitor/human/internal_affairs/apply_innate_effects()
- .=..() //in case the base is used in future
- if(owner && owner.current)
- give_pinpointer(owner.current)
-
-/datum/antagonist/traitor/human/internal_affairs/remove_innate_effects()
- .=..()
- if(owner && owner.current)
- owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer)
-
-/datum/antagonist/traitor/human/internal_affairs/on_gain()
- START_PROCESSING(SSprocessing, src)
- .=..()
-/datum/antagonist/traitor/human/internal_affairs/on_removal()
- STOP_PROCESSING(SSprocessing,src)
- .=..()
-/datum/antagonist/traitor/human/internal_affairs/process()
- iaa_process()
-
-/datum/antagonist/traitor/AI/internal_affairs/on_gain()
- START_PROCESSING(SSprocessing, src)
- .=..()
-/datum/antagonist/traitor/AI/internal_affairs/on_removal()
- STOP_PROCESSING(SSprocessing,src)
- .=..()
-/datum/antagonist/traitor/AI/internal_affairs/process()
- iaa_process()
-
-/datum/status_effect/agent_pinpointer
- id = "agent_pinpointer"
- duration = -1
- tick_interval = PINPOINTER_PING_TIME
- alert_type = /obj/screen/alert/status_effect/agent_pinpointer
- var/minimum_range = PINPOINTER_MINIMUM_RANGE
- var/mob/scan_target = null
-
-/obj/screen/alert/status_effect/agent_pinpointer
- name = "Internal Affairs Integrated Pinpointer"
- desc = "Even stealthier than a normal implant."
- icon = 'icons/obj/device.dmi'
- icon_state = "pinon"
-
-/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction
- if(!scan_target)
- linked_alert.icon_state = "pinonnull"
- return
- var/turf/here = get_turf(owner)
- var/turf/there = get_turf(scan_target)
- if(here.z != there.z)
- linked_alert.icon_state = "pinonnull"
- return
- if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE))
- linked_alert.icon_state = "pinondirect"
- else
- linked_alert.setDir(get_dir(here, there))
- switch(get_dist(here, there))
- if(1 to 8)
- linked_alert.icon_state = "pinonclose"
- if(9 to 16)
- linked_alert.icon_state = "pinonmedium"
- if(16 to INFINITY)
- linked_alert.icon_state = "pinonfar"
-
-/datum/status_effect/agent_pinpointer/proc/scan_for_target()
- scan_target = null
- if(owner)
- if(owner.mind)
- if(owner.mind.objectives)
- for(var/datum/objective/objective_ in owner.mind.objectives)
- if(!is_internal_objective(objective_))
- continue
- var/datum/objective/assassinate/internal/objective = objective_
- var/mob/current = objective.target.current
- if(current&¤t.stat!=DEAD)
- scan_target = current
- break
-
-/datum/status_effect/agent_pinpointer/tick()
- if(!owner)
- qdel(src)
- return
- scan_for_target()
- point_to_target()
-
-
-/proc/is_internal_objective(datum/objective/O)
- return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal))
-
-/datum/antagonist/traitor/proc/replace_escape_objective()
- if(!owner||!owner.objectives)
- return
- for (var/objective_ in owner.objectives)
- if(!(istype(objective_, /datum/objective/escape)||istype(objective_, /datum/objective/survive)))
- continue
- remove_objective(objective_)
-
- var/datum/objective/martyr/martyr_objective = new
- martyr_objective.owner = owner
- add_objective(martyr_objective)
-
-/datum/antagonist/traitor/proc/reinstate_escape_objective()
- if(!owner||!owner.objectives)
- return
- for (var/objective_ in owner.objectives)
- if(!istype(objective_, /datum/objective/martyr))
- continue
- remove_objective(objective_)
-
-/datum/antagonist/traitor/human/internal_affairs/reinstate_escape_objective()
- ..()
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- add_objective(escape_objective)
-
-/datum/antagonist/traitor/AI/internal_affairs/reinstate_escape_objective()
- ..()
- var/datum/objective/survive/survive_objective = new
- survive_objective.owner = owner
- add_objective(survive_objective)
-
-/datum/antagonist/traitor/proc/steal_targets(datum/mind/victim)
- var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA
-
- if(!owner.current||owner.current.stat==DEAD)
- return
- to_chat(owner.current, " Target eliminated: [victim.name]")
- for(var/objective_ in victim.objectives)
- if(istype(objective_, /datum/objective/assassinate/internal))
- var/datum/objective/assassinate/internal/objective = objective_
- if(objective.target==owner)
- continue
- else if(this.targets_stolen.Find(objective.target) == 0)
- var/datum/objective/assassinate/internal/new_objective = new
- new_objective.owner = owner
- new_objective.target = objective.target
- new_objective.update_explanation_text()
- add_objective(new_objective)
- this.targets_stolen += objective.target
- var/status_text = objective.check_completion() ? "neutralised" : "active"
- to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ")
- else if(istype(objective_, /datum/objective/destroy/internal))
- var/datum/objective/destroy/internal/objective = objective_
- var/datum/objective/destroy/internal/new_objective = new
- if(objective.target==owner)
- continue
- else if(this.targets_stolen.Find(objective.target) == 0)
- new_objective.owner = owner
- new_objective.target = objective.target
- new_objective.update_explanation_text()
- add_objective(new_objective)
- this.targets_stolen += objective.target
- var/status_text = objective.check_completion() ? "neutralised" : "active"
- to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ")
- this.last_man_standing = TRUE
- for(var/objective_ in owner.objectives)
- if(!is_internal_objective(objective_))
- continue
- var/datum/objective/assassinate/internal/objective = objective_
- if(!objective.check_completion())
- this.last_man_standing = FALSE
- return
- if(this.last_man_standing)
- if(this.syndicate)
- to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ")
- else
- to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.")
- replace_escape_objective(owner)
-
-/datum/antagonist/traitor/proc/iaa_process()
- var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA
- if(owner&&owner.current&&owner.current.stat!=DEAD)
- for(var/objective_ in owner.objectives)
- if(!is_internal_objective(objective_))
- continue
- var/datum/objective/assassinate/internal/objective = objective_
- if(!objective.target)
- continue
- if(objective.check_completion())
- if(objective.stolen)
- continue
- else
- steal_targets(objective.target)
- objective.stolen = TRUE
- else
- if(objective.stolen)
- var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! "
- if(this.last_man_standing)
- if(this.syndicate)
- fail_msg += " You no longer have permission to die. "
- else
- fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated."
- reinstate_escape_objective(owner)
- this.last_man_standing = FALSE
- to_chat(owner.current, fail_msg)
- objective.stolen = FALSE
-
-/datum/antagonist/traitor/proc/forge_iaa_objectives()
- var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA
- if(SSticker.mode.target_list.len && SSticker.mode.target_list[owner]) // Is a double agent
-
- // Assassinate
- var/datum/mind/target_mind = SSticker.mode.target_list[owner]
- if(issilicon(target_mind.current))
- var/datum/objective/destroy/internal/destroy_objective = new
- destroy_objective.owner = owner
- destroy_objective.target = target_mind
- destroy_objective.update_explanation_text()
- else
- var/datum/objective/assassinate/internal/kill_objective = new
- kill_objective.owner = owner
- kill_objective.target = target_mind
- kill_objective.update_explanation_text()
- add_objective(kill_objective)
-
- //Optional traitor objective
- if(prob(PROB_ACTUAL_TRAITOR))
- employer = "The Syndicate"
- owner.special_role = TRAITOR_AGENT_ROLE
- special_role = TRAITOR_AGENT_ROLE
- this.syndicate = TRUE
- forge_single_objective()
-
- else
- ..() // Give them standard objectives.
- return
-
-/datum/antagonist/traitor/human/internal_affairs/forge_traitor_objectives()
- forge_iaa_objectives()
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- add_objective(escape_objective)
-
-/datum/antagonist/traitor/AI/internal_affairs/forge_traitor_objectives()
- forge_iaa_objectives()
- var/datum/objective/survive/survive_objective = new
- survive_objective.owner = owner
- add_objective(survive_objective)
-
-/datum/antagonist/traitor/proc/greet_iaa()
- var/datum/antagonist/traitor/human/internal_affairs/this = src //Should only use this if IAA
- var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
-
- to_chat(owner.current, "You are the [special_role].")
- if(this.syndicate)
- to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.")
- to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.")
- to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ")
- else
- to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
- to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
- to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
-
- to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
- owner.announce_objectives()
-
-/datum/antagonist/traitor/AI/internal_affairs/greet()
- greet_iaa()
-
-/datum/antagonist/traitor/human/internal_affairs/greet()
- greet_iaa()
-
-
-#undef PROB_ACTUAL_TRAITOR
-#undef PINPOINTER_EXTRA_RANDOM_RANGE
-#undef PINPOINTER_MINIMUM_RANGE
-#undef PINPOINTER_PING_TIME
diff --git a/code/datums/antagonists/monkey.dm b/code/datums/antagonists/monkey.dm
deleted file mode 100644
index 25e80f6afb..0000000000
--- a/code/datums/antagonists/monkey.dm
+++ /dev/null
@@ -1,214 +0,0 @@
-#define MONKEYS_ESCAPED 1
-#define MONKEYS_LIVED 2
-#define MONKEYS_DIED 3
-#define DISEASE_LIVED 4
-
-/datum/antagonist/monkey
- name = "Monkey"
- job_rank = ROLE_MONKEY
- roundend_category = "monkeys"
- antagpanel_category = "Monkey"
- var/datum/team/monkey/monkey_team
- var/monkey_only = TRUE
-
-/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner)
- return ..() && (!monkey_only || ismonkey(new_owner.current))
-
-/datum/antagonist/monkey/get_team()
- return monkey_team
-
-/datum/antagonist/monkey/on_gain()
- . = ..()
- SSticker.mode.ape_infectees += owner
- owner.special_role = "Infected Monkey"
-
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode
- if(!owner.current.HasDisease(D))
- owner.current.ForceContractDisease(D)
- else
- QDEL_NULL(D)
-
-/datum/antagonist/monkey/greet()
- to_chat(owner, "You are a monkey now!")
- to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!")
- to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!")
- to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.")
- to_chat(owner, "You can use :k to talk to fellow monkeys!")
- SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg'))
-
-/datum/antagonist/monkey/on_removal()
- owner.special_role = null
- SSticker.mode.ape_infectees -= owner
-
- var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses
- if(D)
- D.remove_virus()
- qdel(D)
-
- . = ..()
-
-/datum/antagonist/monkey/create_team(datum/team/monkey/new_team)
- if(!new_team)
- for(var/datum/antagonist/monkey/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.monkey_team)
- monkey_team = H.monkey_team
- return
- monkey_team = new /datum/team/monkey
- monkey_team.update_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- monkey_team = new_team
-
-/datum/antagonist/monkey/proc/forge_objectives()
- objectives |= monkey_team.objectives
- owner.objectives |= objectives
-
-/datum/antagonist/monkey/admin_remove(mob/admin)
- var/mob/living/carbon/monkey/M = owner.current
- if(istype(M))
- switch(alert(admin, "Humanize?", "Humanize", "Yes", "No"))
- if("Yes")
- if(admin == M)
- admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
- else
- M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
- if("No")
- //nothing
- else
- return
- . = ..()
-
-/datum/antagonist/monkey/leader
- name = "Monkey Leader"
- monkey_only = FALSE
-
-/datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin)
- var/mob/living/carbon/human/H = new_owner.current
- if(istype(H))
- switch(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No"))
- if("Yes")
- if(admin == H)
- admin = H.monkeyize()
- else
- H.monkeyize()
- if("No")
- //nothing
- else
- return
- new_owner.add_antag_datum(src)
- log_admin("[key_name(admin)] made [key_name(new_owner.current)] a monkey leader!")
- message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner.current)] a monkey leader!")
-
-/datum/antagonist/monkey/leader/on_gain()
- . = ..()
- var/obj/item/organ/heart/freedom/F = new
- F.Insert(owner.current, drop_if_replaced = FALSE)
- SSticker.mode.ape_leaders += owner
- owner.special_role = "Monkey Leader"
-
-/datum/antagonist/monkey/leader/on_removal()
- SSticker.mode.ape_leaders -= owner
- var/obj/item/organ/heart/H = new
- H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart
-
- . = ..()
-
-/datum/antagonist/monkey/leader/greet()
- to_chat(owner, "You are the Jungle Fever patient zero!!")
- to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.")
- to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.")
- to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.")
- to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.")
- to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.")
- to_chat(owner, "You can use :k to talk to fellow monkeys!")
- SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg'))
-
-/datum/objective/monkey
- explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!"
- martyr_compatible = TRUE
- var/monkeys_to_win = 1
- var/escaped_monkeys = 0
-
-/datum/objective/monkey/check_completion()
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
- if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
- escaped_monkeys++
- if(escaped_monkeys >= monkeys_to_win)
- return TRUE
- return FALSE
-
-/datum/team/monkey
- name = "Monkeys"
-
-/datum/team/monkey/proc/update_objectives()
- objectives = list()
- var/datum/objective/monkey/O = new()
- O.team = src
- objectives += O
-
-/datum/team/monkey/proc/infected_monkeys_alive()
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
- if(M.HasDisease(D))
- return TRUE
- return FALSE
-
-/datum/team/monkey/proc/infected_monkeys_escaped()
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
- if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
- return TRUE
- return FALSE
-
-/datum/team/monkey/proc/infected_humans_escaped()
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
- if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
- return TRUE
- return FALSE
-
-/datum/team/monkey/proc/infected_humans_alive()
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
- if(M.HasDisease(D))
- return TRUE
- return FALSE
-
-/datum/team/monkey/proc/get_result()
- if(infected_monkeys_escaped())
- return MONKEYS_ESCAPED
- if(infected_monkeys_alive())
- return MONKEYS_LIVED
- if(infected_humans_alive() || infected_humans_escaped())
- return DISEASE_LIVED
- return MONKEYS_DIED
-
-/datum/team/monkey/roundend_report()
- var/list/parts = list()
- switch(get_result())
- if(MONKEYS_ESCAPED)
- parts += "Monkey Major Victory!"
- parts += "Central Command and [station_name()] were taken over by the monkeys! Ook ook!"
- if(MONKEYS_LIVED)
- parts += "Monkey Minor Victory!"
- parts += "[station_name()] was taken over by the monkeys! Ook ook!"
- if(DISEASE_LIVED)
- parts += "Monkey Minor Defeat!"
- parts += "All the monkeys died, but the disease lives on! The future is uncertain."
- if(MONKEYS_DIED)
- parts += "Monkey Major Defeat!"
- parts += "All the monkeys died, and Jungle Fever was wiped out!"
- var/list/leaders = get_antagonists(/datum/antagonist/monkey/leader, TRUE)
- var/list/monkeys = get_antagonists(/datum/antagonist/monkey, TRUE)
-
- if(LAZYLEN(leaders))
- parts += ""
- parts += printplayerlist(SSticker.mode.ape_leaders)
- if(LAZYLEN(monkeys))
- parts += ""
- parts += printplayerlist(SSticker.mode.ape_infectees)
- return "[parts.Join("
")]
"
diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm
deleted file mode 100644
index e8a1c140ea..0000000000
--- a/code/datums/antagonists/ninja.dm
+++ /dev/null
@@ -1,155 +0,0 @@
-/datum/antagonist/ninja
- name = "Ninja"
- antagpanel_category = "Ninja"
- job_rank = ROLE_NINJA
- var/helping_station = FALSE
- var/give_objectives = TRUE
- var/give_equipment = TRUE
-
-
-/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_ninja_icons_added(M)
-
-/datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_ninja_icons_removed(M)
-
-/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current)
- return H.equipOutfit(/datum/outfit/ninja)
-
-/datum/antagonist/ninja/proc/addMemories()
- antag_memory += "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!
"
- antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!
"
- antag_memory += "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.
"
-
-/datum/antagonist/ninja/proc/addObjectives(quantity = 6)
- var/list/possible_targets = list()
- for(var/datum/mind/M in SSticker.minds)
- if(M.current && M.current.stat != DEAD)
- if(ishuman(M.current))
- if(M.special_role)
- possible_targets[M] = 0 //bad-guy
- else if(M.assigned_role in GLOB.command_positions)
- possible_targets[M] = 1 //good-guy
-
- var/list/possible_objectives = list(1,2,3,4)
-
- while(objectives.len < quantity)
- switch(pick_n_take(possible_objectives))
- if(1) //research
- var/datum/objective/download/O = new /datum/objective/download()
- O.owner = owner
- O.gen_amount_goal()
- objectives += O
-
- if(2) //steal
- var/datum/objective/steal/special/O = new /datum/objective/steal/special()
- O.owner = owner
- objectives += O
-
- if(3) //protect/kill
- if(!possible_targets.len) continue
- var/index = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[index]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(index,index+1)
-
- if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/assassinate/O = new /datum/objective/assassinate()
- O.owner = owner
- O.target = M
- O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
- objectives += O
- else //protect
- var/datum/objective/protect/O = new /datum/objective/protect()
- O.owner = owner
- O.target = M
- O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
- objectives += O
- if(4) //debrain/capture
- if(!possible_targets.len) continue
- var/selected = rand(1,possible_targets.len)
- var/datum/mind/M = possible_targets[selected]
- var/is_bad_guy = possible_targets[M]
- possible_targets.Cut(selected,selected+1)
-
- if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
- var/datum/objective/debrain/O = new /datum/objective/debrain()
- O.owner = owner
- O.target = M
- O.explanation_text = "Steal the brain of [M.current.real_name]."
- objectives += O
- else //capture
- var/datum/objective/capture/O = new /datum/objective/capture()
- O.owner = owner
- O.gen_amount_goal()
- objectives += O
- else
- break
- var/datum/objective/O = new /datum/objective/survive()
- O.owner = owner
- owner.objectives |= objectives
-
-
-/proc/remove_ninja(mob/living/L)
- if(!L || !L.mind)
- return FALSE
- var/datum/antagonist/datum = L.mind.has_antag_datum(/datum/antagonist/ninja)
- datum.on_removal()
- return TRUE
-
-/proc/is_ninja(mob/living/M)
- return M && M.mind && M.mind.has_antag_datum(/datum/antagonist/ninja)
-
-
-/datum/antagonist/ninja/greet()
- SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg'))
- to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
- to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
- to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
- return
-
-/datum/antagonist/ninja/on_gain()
- if(give_objectives)
- addObjectives()
- addMemories()
- if(give_equipment)
- equip_space_ninja(owner.current)
- . = ..()
-
-/datum/antagonist/ninja/admin_add(datum/mind/new_owner,mob/admin)
- var/adj
- switch(input("What kind of ninja?", "Ninja") as null|anything in list("Random","Syndicate","Nanotrasen","No objectives"))
- if("Random")
- helping_station = pick(TRUE,FALSE)
- adj = ""
- if("Syndicate")
- helping_station = FALSE
- adj = "syndie"
- if("Nanotrasen")
- helping_station = TRUE
- adj = "friendly"
- if("No objectives")
- give_objectives = FALSE
- adj = "objectiveless"
- else
- return
- new_owner.assigned_role = ROLE_NINJA
- new_owner.special_role = ROLE_NINJA
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].")
- log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].")
-
-/datum/antagonist/ninja/antag_listing_name()
- return ..() + "(Ninja)"
-
-/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
- var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
- ninjahud.join_hud(ninja)
- set_antag_hud(ninja, "ninja")
-
-/datum/antagonist/ninja/proc/update_ninja_icons_removed(var/mob/living/carbon/human/ninja)
- var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
- ninjahud.leave_hud(ninja)
- set_antag_hud(ninja, null)
\ No newline at end of file
diff --git a/code/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm
deleted file mode 100644
index 1ec2e77f64..0000000000
--- a/code/datums/antagonists/nukeop.dm
+++ /dev/null
@@ -1,379 +0,0 @@
-#define NUKE_RESULT_FLUKE 0
-#define NUKE_RESULT_NUKE_WIN 1
-#define NUKE_RESULT_CREW_WIN 2
-#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3
-#define NUKE_RESULT_DISK_LOST 4
-#define NUKE_RESULT_DISK_STOLEN 5
-#define NUKE_RESULT_NOSURVIVORS 6
-#define NUKE_RESULT_WRONG_STATION 7
-#define NUKE_RESULT_WRONG_STATION_DEAD 8
-
-/datum/antagonist/nukeop
- name = "Nuclear Operative"
- roundend_category = "syndicate operatives" //just in case
- antagpanel_category = "NukeOp"
- job_rank = ROLE_OPERATIVE
- var/datum/team/nuclear/nuke_team
- var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team.
- var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
- var/nukeop_outfit = /datum/outfit/syndicate
-
-/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M)
- var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
- opshud.join_hud(M)
- set_antag_hud(M, "synd")
-
-/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M)
- var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
- opshud.leave_hud(M)
- set_antag_hud(M, null)
-
-/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_synd_icons_added(M)
-
-/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_synd_icons_removed(M)
-
-/datum/antagonist/nukeop/proc/equip_op()
- if(!ishuman(owner.current))
- return
- var/mob/living/carbon/human/H = owner.current
-
- H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs
-
- H.equipOutfit(nukeop_outfit)
- return TRUE
-
-/datum/antagonist/nukeop/greet()
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0)
- to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!")
- owner.announce_objectives()
- return
-
-/datum/antagonist/nukeop/on_gain()
- give_alias()
- forge_objectives()
- . = ..()
- equip_op()
- memorize_code()
- if(send_to_spawnpoint)
- move_to_spawnpoint()
-
-/datum/antagonist/nukeop/get_team()
- return nuke_team
-
-/datum/antagonist/nukeop/proc/assign_nuke()
- if(nuke_team && !nuke_team.tracked_nuke)
- nuke_team.memorized_code = random_nukecode()
- var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in GLOB.nuke_list
- if(nuke)
- nuke_team.tracked_nuke = nuke
- if(nuke.r_code == "ADMIN")
- nuke.r_code = nuke_team.memorized_code
- else //Already set by admins/something else?
- nuke_team.memorized_code = nuke.r_code
- else
- stack_trace("Syndicate nuke not found during nuke team creation.")
- nuke_team.memorized_code = null
-
-/datum/antagonist/nukeop/proc/give_alias()
- if(nuke_team && nuke_team.syndicate_name)
- var/number = 1
- number = nuke_team.members.Find(owner)
- owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]"
-
-/datum/antagonist/nukeop/proc/memorize_code()
- if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code)
- antag_memory += "[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]
"
- to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]")
- else
- to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.")
-
-/datum/antagonist/nukeop/proc/forge_objectives()
- if(nuke_team)
- owner.objectives |= nuke_team.objectives
-
-/datum/antagonist/nukeop/proc/move_to_spawnpoint()
- var/team_number = 1
- if(nuke_team)
- team_number = nuke_team.members.Find(owner)
- owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1])
-
-/datum/antagonist/nukeop/leader/move_to_spawnpoint()
- owner.current.forceMove(pick(GLOB.nukeop_leader_start))
-
-/datum/antagonist/nukeop/create_team(datum/team/nuclear/new_team)
- if(!new_team)
- if(!always_new_team)
- for(var/datum/antagonist/nukeop/N in GLOB.antagonists)
- if(!N.owner)
- continue
- if(N.nuke_team)
- nuke_team = N.nuke_team
- return
- nuke_team = new /datum/team/nuclear
- nuke_team.update_objectives()
- assign_nuke() //This is bit ugly
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- nuke_team = new_team
-
-/datum/antagonist/nukeop/admin_add(datum/mind/new_owner,mob/admin)
- new_owner.assigned_role = ROLE_SYNDICATE
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has nuke op'ed [new_owner.current].")
- log_admin("[key_name(admin)] has nuke op'ed [new_owner.current].")
-
-/datum/antagonist/nukeop/get_admin_commands()
- . = ..()
- .["Send to base"] = CALLBACK(src,.proc/admin_send_to_base)
- .["Tell code"] = CALLBACK(src,.proc/admin_tell_code)
-
-/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin)
- owner.current.forceMove(pick(GLOB.nukeop_start))
-
-/datum/antagonist/nukeop/proc/admin_tell_code(mob/admin)
- var/code
- for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines)
- if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code))
- code = bombue.r_code
- break
- if (code)
- antag_memory += "Syndicate Nuclear Bomb Code: [code]
"
- to_chat(owner.current, "The nuclear authorization code is: [code]")
- else
- to_chat(admin, "No valid nuke found!")
-
-/datum/antagonist/nukeop/leader
- name = "Nuclear Operative Leader"
- nukeop_outfit = /datum/outfit/syndicate/leader
- always_new_team = TRUE
- var/title
-
-/datum/antagonist/nukeop/leader/memorize_code()
- ..()
- if(nuke_team && nuke_team.memorized_code)
- var/obj/item/paper/P = new
- P.info = "The nuclear authorization code is: [nuke_team.memorized_code]"
- P.name = "nuclear bomb code"
- var/mob/living/carbon/human/H = owner.current
- if(!istype(H))
- P.forceMove(get_turf(H))
- else
- H.put_in_hands(P, TRUE)
- H.update_icons()
-
-/datum/antagonist/nukeop/leader/give_alias()
- title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
- if(nuke_team && nuke_team.syndicate_name)
- owner.current.real_name = "[nuke_team.syndicate_name] [title]"
- else
- owner.current.real_name = "Syndicate [title]"
-
-/datum/antagonist/nukeop/leader/greet()
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0)
- to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.")
- to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.")
- to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.")
- owner.announce_objectives()
- addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1)
-
-
-/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign()
- if(!nuke_team)
- return
- nuke_team.rename_team(ask_name())
-
-/datum/team/nuclear/proc/rename_team(new_name)
- syndicate_name = new_name
- name = "[syndicate_name] Team"
- for(var/I in members)
- var/datum/mind/synd_mind = I
- var/mob/living/carbon/human/H = synd_mind.current
- if(!istype(H))
- continue
- var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name)
- H.fully_replace_character_name(H.real_name,chosen_name)
-
-/datum/antagonist/nukeop/leader/proc/ask_name()
- var/randomname = pick(GLOB.last_names)
- var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname)
- if (!newname)
- newname = randomname
- else
- newname = reject_bad_name(newname)
- if(!newname)
- newname = randomname
-
- return capitalize(newname)
-
-/datum/antagonist/nukeop/lone
- name = "Lone Operative"
- always_new_team = TRUE
- send_to_spawnpoint = FALSE //Handled by event
- nukeop_outfit = /datum/outfit/syndicate/full
-
-/datum/antagonist/nukeop/lone/assign_nuke()
- if(nuke_team && !nuke_team.tracked_nuke)
- nuke_team.memorized_code = random_nukecode()
- var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list
- if(nuke)
- nuke_team.tracked_nuke = nuke
- if(nuke.r_code == "ADMIN")
- nuke.r_code = nuke_team.memorized_code
- else //Already set by admins/something else?
- nuke_team.memorized_code = nuke.r_code
- else
- stack_trace("Station self destruct ot found during lone op team creation.")
- nuke_team.memorized_code = null
-
-/datum/antagonist/nukeop/reinforcement
- send_to_spawnpoint = FALSE
- nukeop_outfit = /datum/outfit/syndicate/no_crystals
-
-/datum/team/nuclear
- var/syndicate_name
- var/obj/machinery/nuclearbomb/tracked_nuke
- var/core_objective = /datum/objective/nuclear
- var/memorized_code
-
-/datum/team/nuclear/New()
- ..()
- syndicate_name = syndicate_name()
-
-/datum/team/nuclear/proc/update_objectives()
- if(core_objective)
- var/datum/objective/O = new core_objective
- O.team = src
- objectives += O
-
-/datum/team/nuclear/proc/disk_rescued()
- for(var/obj/item/disk/nuclear/D in GLOB.poi_list)
- if(!D.onCentCom())
- return FALSE
- return TRUE
-
-/datum/team/nuclear/proc/operatives_dead()
- for(var/I in members)
- var/datum/mind/operative_mind = I
- if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD))
- return FALSE
- return TRUE
-
-/datum/team/nuclear/proc/syndies_escaped()
- var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate")
- return S && (is_centcom_level(S.z) || is_transit_level(S.z))
-
-/datum/team/nuclear/proc/get_result()
- var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME
- var/disk_rescued = disk_rescued()
- var/syndies_didnt_escape = !syndies_escaped()
- var/station_was_nuked = SSticker.mode.station_was_nuked
- var/nuke_off_station = SSticker.mode.nuke_off_station
-
- if(nuke_off_station == NUKE_SYNDICATE_BASE)
- return NUKE_RESULT_FLUKE
- else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape)
- return NUKE_RESULT_NUKE_WIN
- else if (!disk_rescued && station_was_nuked && syndies_didnt_escape)
- return NUKE_RESULT_NOSURVIVORS
- else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape)
- return NUKE_RESULT_WRONG_STATION
- else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape)
- return NUKE_RESULT_WRONG_STATION_DEAD
- else if ((disk_rescued || evacuation) && operatives_dead())
- return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD
- else if (disk_rescued)
- return NUKE_RESULT_CREW_WIN
- else if (!disk_rescued && operatives_dead())
- return NUKE_RESULT_DISK_LOST
- else if (!disk_rescued && evacuation)
- return NUKE_RESULT_DISK_STOLEN
- else
- return //Undefined result
-
-/datum/team/nuclear/roundend_report()
- var/list/parts = list()
- parts += ""
-
- switch(get_result())
- if(NUKE_RESULT_FLUKE)
- parts += "Humiliating Syndicate Defeat"
- parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!"
- if(NUKE_RESULT_NUKE_WIN)
- parts += "Syndicate Major Victory!"
- parts += "[syndicate_name] operatives have destroyed [station_name()]!"
- if(NUKE_RESULT_NOSURVIVORS)
- parts += "Total Annihilation"
- parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!"
- if(NUKE_RESULT_WRONG_STATION)
- parts += "Crew Minor Victory"
- parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!"
- if(NUKE_RESULT_WRONG_STATION_DEAD)
- parts += "[syndicate_name] operatives have earned Darwin Award!"
- parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!"
- if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD)
- parts += "Crew Major Victory!"
- parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives"
- if(NUKE_RESULT_CREW_WIN)
- parts += "Crew Major Victory"
- parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!"
- if(NUKE_RESULT_DISK_LOST)
- parts += "Neutral Victory!"
- parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!"
- if(NUKE_RESULT_DISK_STOLEN)
- parts += "Syndicate Minor Victory!"
- parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!"
- else
- parts += "Neutral Victory"
- parts += "Mission aborted!"
-
- var/text = "
"
- var/purchases = ""
- var/TC_uses = 0
- for(var/I in members)
- var/datum/mind/syndicate = I
- var/datum/uplink_purchase_log/H = GLOB.uplink_purchase_logs_by_key[syndicate.key]
- if(H)
- TC_uses += H.total_spent
- purchases += H.generate_render(show_key = FALSE)
- text += printplayerlist(members)
- text += "
"
- text += "(Syndicates used [TC_uses] TC) [purchases]"
- if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead())
- text += "[icon2html('icons/badass.dmi', world, "badass")]"
-
- parts += text
-
- return "[parts.Join("
")]
"
-
-/datum/team/nuclear/antag_listing_name()
- if(syndicate_name)
- return "[syndicate_name] Syndicates"
- else
- return "Syndicates"
-
-/datum/team/nuclear/antag_listing_entry()
- var/disk_report = "Nuclear Disk(s)
"
- disk_report += ""
- for(var/obj/item/disk/nuclear/N in GLOB.poi_list)
- disk_report += "| [N.name], "
- var/atom/disk_loc = N.loc
- while(!isturf(disk_loc))
- if(ismob(disk_loc))
- var/mob/M = disk_loc
- disk_report += "carried by [M.real_name] "
- if(isobj(disk_loc))
- var/obj/O = disk_loc
- disk_report += "in \a [O.name] "
- disk_loc = disk_loc.loc
- disk_report += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z]) | FLW |
"
- disk_report += "
"
- var/common_part = ..()
- return common_part + disk_report
-
-/datum/team/nuclear/is_gamemode_hero()
- return SSticker.mode.name == "nuclear emergency"
\ No newline at end of file
diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm
deleted file mode 100644
index cdd871ff35..0000000000
--- a/code/datums/antagonists/pirate.dm
+++ /dev/null
@@ -1,132 +0,0 @@
-/datum/antagonist/pirate
- name = "Space Pirate"
- job_rank = ROLE_TRAITOR
- roundend_category = "space pirates"
- antagpanel_category = "Pirate"
- var/datum/team/pirate/crew
-
-/datum/antagonist/pirate/greet()
- to_chat(owner, "You are a Space Pirate!")
- to_chat(owner, "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.")
- owner.announce_objectives()
-
-/datum/antagonist/pirate/get_team()
- return crew
-
-/datum/antagonist/pirate/create_team(datum/team/pirate/new_team)
- if(!new_team)
- for(var/datum/antagonist/pirate/P in GLOB.antagonists)
- if(!P.owner)
- continue
- if(P.crew)
- crew = P.crew
- return
- if(!new_team)
- crew = new /datum/team/pirate
- crew.forge_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- crew = new_team
-
-/datum/antagonist/pirate/on_gain()
- if(crew)
- owner.objectives |= crew.objectives
- . = ..()
-
-/datum/antagonist/pirate/on_removal()
- if(crew)
- owner.objectives -= crew.objectives
- . = ..()
-
-/datum/team/pirate
- name = "Pirate crew"
-
-/datum/team/pirate/proc/forge_objectives()
- var/datum/objective/loot/getbooty = new()
- getbooty.team = src
- getbooty.storage_area = locate(/area/shuttle/pirate/vault) in GLOB.sortedAreas
- getbooty.update_initial_value()
- getbooty.update_explanation_text()
- objectives += getbooty
- for(var/datum/mind/M in members)
- M.objectives |= objectives
-
-
-GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list(
- /obj/structure/reagent_dispensers/beerkeg,
- /mob/living/simple_animal/parrot,
- /obj/item/stack/sheet/mineral/gold,
- /obj/item/stack/sheet/mineral/diamond,
- /obj/item/stack/spacecash,
- /obj/item/melee/sabre,)))
-
-/datum/objective/loot
- var/area/storage_area //Place where we we will look for the loot.
- explanation_text = "Acquire valuable loot and store it in designated area."
- var/target_value = 50000
- var/initial_value = 0 //Things in the vault at spawn time do not count
-
-/datum/objective/loot/update_explanation_text()
- if(storage_area)
- explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name]."
-
-/datum/objective/loot/proc/loot_listing()
- //Lists notable loot.
- if(!storage_area)
- return "Nothing"
- var/list/loot_table = list()
- for(var/atom/movable/AM in storage_area.GetAllContents())
- if(is_type_in_typecache(AM,GLOB.pirate_loot_cache))
- var/lootname = AM.name
- var/count = 1
- if(istype(AM,/obj/item/stack)) //Ugh.
- var/obj/item/stack/S = AM
- lootname = S.singular_name
- count = S.amount
- if(!loot_table[lootname])
- loot_table[lootname] = count
- else
- loot_table[lootname] += count
- var/list/loot_texts = list()
- for(var/key in loot_table)
- var/amount = loot_table[key]
- loot_texts += "[amount] [key][amount > 1 ? "s":""]"
- return loot_texts.Join(", ")
-
-/datum/objective/loot/proc/get_loot_value()
- if(!storage_area)
- return 0
- var/value = 0
- for(var/turf/T in storage_area.contents)
- value += export_item_and_contents(T,TRUE, TRUE, dry_run = TRUE)
- return value - initial_value
-
-/datum/objective/loot/proc/update_initial_value()
- initial_value = get_loot_value()
-
-/datum/objective/loot/check_completion()
- return ..() || get_loot_value() >= target_value
-
-/datum/team/pirate/roundend_report()
- var/list/parts = list()
-
- parts += ""
-
- var/all_dead = TRUE
- for(var/datum/mind/M in members)
- if(considered_alive(M))
- all_dead = FALSE
- parts += printplayerlist(members)
-
- parts += "Loot stolen: "
- var/datum/objective/loot/L = locate() in objectives
- parts += L.loot_listing()
- parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits"
-
- if(L.check_completion() && !all_dead)
- parts += "The pirate crew was successful!"
- else
- parts += "The pirate crew has failed."
-
- return "[parts.Join("
")]
"
\ No newline at end of file
diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm
deleted file mode 100644
index 5ac3bfe2aa..0000000000
--- a/code/datums/antagonists/revolution.dm
+++ /dev/null
@@ -1,368 +0,0 @@
-//How often to check for promotion possibility
-#define HEAD_UPDATE_PERIOD 300
-
-/datum/antagonist/rev
- name = "Revolutionary"
- roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen
- antagpanel_category = "Revolution"
- job_rank = ROLE_REV
- var/hud_type = "rev"
- var/datum/team/revolution/rev_team
-
-/datum/antagonist/rev/can_be_owned(datum/mind/new_owner)
- . = ..()
- if(.)
- if(new_owner.assigned_role in GLOB.command_positions)
- return FALSE
- if(new_owner.unconvertable)
- return FALSE
- if(new_owner.current && new_owner.current.isloyal())
- return FALSE
-
-/datum/antagonist/rev/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_rev_icons_added(M)
-
-/datum/antagonist/rev/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_rev_icons_removed(M)
-
-/datum/antagonist/rev/proc/equip_rev()
- return
-
-/datum/antagonist/rev/on_gain()
- . = ..()
- create_objectives()
- equip_rev()
- owner.current.log_message("Has been converted to the revolution!", INDIVIDUAL_ATTACK_LOG)
-
-/datum/antagonist/rev/on_removal()
- remove_objectives()
- . = ..()
-
-/datum/antagonist/rev/greet()
- to_chat(owner, "You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!")
- owner.announce_objectives()
-
-/datum/antagonist/rev/create_team(datum/team/revolution/new_team)
- if(!new_team)
- //For now only one revolution at a time
- for(var/datum/antagonist/rev/head/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.rev_team)
- rev_team = H.rev_team
- return
- rev_team = new /datum/team/revolution
- rev_team.update_objectives()
- rev_team.update_heads()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- rev_team = new_team
-
-/datum/antagonist/rev/get_team()
- return rev_team
-
-/datum/antagonist/rev/proc/create_objectives()
- owner.objectives |= rev_team.objectives
-
-/datum/antagonist/rev/proc/remove_objectives()
- owner.objectives -= rev_team.objectives
-
-//Bump up to head_rev
-/datum/antagonist/rev/proc/promote()
- var/old_team = rev_team
- var/datum/mind/old_owner = owner
- silent = TRUE
- owner.remove_antag_datum(/datum/antagonist/rev)
- var/datum/antagonist/rev/head/new_revhead = new()
- new_revhead.silent = TRUE
- old_owner.add_antag_datum(new_revhead,old_team)
- new_revhead.silent = FALSE
- to_chat(old_owner, "You have proved your devotion to revolution! You are a head revolutionary now!")
-
-/datum/antagonist/rev/get_admin_commands()
- . = ..()
- .["Promote"] = CALLBACK(src,.proc/admin_promote)
-
-/datum/antagonist/rev/proc/admin_promote(mob/admin)
- var/datum/mind/O = owner
- promote()
- message_admins("[key_name_admin(admin)] has head-rev'ed [O].")
- log_admin("[key_name(admin)] has head-rev'ed [O].")
-
-/datum/antagonist/rev/head/admin_add(datum/mind/new_owner,mob/admin)
- give_flash = TRUE
- give_hud = TRUE
- remove_clumsy = TRUE
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has head-rev'ed [new_owner.current].")
- log_admin("[key_name(admin)] has head-rev'ed [new_owner.current].")
- to_chat(new_owner.current, "You are a member of the revolutionaries' leadership now!")
-
-/datum/antagonist/rev/head/get_admin_commands()
- . = ..()
- . -= "Promote"
- .["Take flash"] = CALLBACK(src,.proc/admin_take_flash)
- .["Give flash"] = CALLBACK(src,.proc/admin_give_flash)
- .["Repair flash"] = CALLBACK(src,.proc/admin_repair_flash)
- .["Demote"] = CALLBACK(src,.proc/admin_demote)
-
-/datum/antagonist/rev/head/proc/admin_take_flash(mob/admin)
- var/list/L = owner.current.get_contents()
- var/obj/item/device/assembly/flash/flash = locate() in L
- if (!flash)
- to_chat(admin, "Deleting flash failed!")
- return
- qdel(flash)
-
-/datum/antagonist/rev/head/proc/admin_give_flash(mob/admin)
- //This is probably overkill but making these impact state annoys me
- var/old_give_flash = give_flash
- var/old_give_hud = give_hud
- var/old_remove_clumsy = remove_clumsy
- give_flash = TRUE
- give_hud = FALSE
- remove_clumsy = FALSE
- equip_rev()
- give_flash = old_give_flash
- give_hud = old_give_hud
- remove_clumsy = old_remove_clumsy
-
-/datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin)
- var/list/L = owner.current.get_contents()
- var/obj/item/device/assembly/flash/flash = locate() in L
- if (!flash)
- to_chat(admin, "Repairing flash failed!")
- else
- flash.crit_fail = 0
- flash.update_icon()
-
-/datum/antagonist/rev/head/proc/admin_demote(datum/mind/target,mob/user)
- message_admins("[key_name_admin(user)] has demoted [owner.current] from head revolutionary.")
- log_admin("[key_name(user)] has demoted [owner.current] from head revolutionary.")
- demote()
-
-/datum/antagonist/rev/head
- name = "Head Revolutionary"
- hud_type = "rev_head"
- var/remove_clumsy = FALSE
- var/give_flash = FALSE
- var/give_hud = TRUE
-
-/datum/antagonist/rev/head/antag_listing_name()
- return ..() + "(Leader)"
-
-/datum/antagonist/rev/proc/update_rev_icons_added(mob/living/M)
- var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV]
- revhud.join_hud(M)
- set_antag_hud(M,hud_type)
-
-/datum/antagonist/rev/proc/update_rev_icons_removed(mob/living/M)
- var/datum/atom_hud/antag/revhud = GLOB.huds[ANTAG_HUD_REV]
- revhud.leave_hud(M)
- set_antag_hud(M, null)
-
-/datum/antagonist/rev/proc/can_be_converted(mob/living/candidate)
- if(!candidate.mind)
- return FALSE
- if(!can_be_owned(candidate.mind))
- return FALSE
- var/mob/living/carbon/C = candidate //Check to see if the potential rev is implanted
- if(!istype(C)) //Can't convert simple animals
- return FALSE
- return TRUE
-
-/datum/antagonist/rev/proc/add_revolutionary(datum/mind/rev_mind,stun = TRUE)
- if(!can_be_converted(rev_mind.current))
- return FALSE
- if(stun)
- if(iscarbon(rev_mind.current))
- var/mob/living/carbon/carbon_mob = rev_mind.current
- carbon_mob.silent = max(carbon_mob.silent, 5)
- carbon_mob.flash_act(1, 1)
- rev_mind.current.Stun(100)
- rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team)
- rev_mind.special_role = ROLE_REV
- return TRUE
-
-/datum/antagonist/rev/head/proc/demote()
- var/datum/mind/old_owner = owner
- var/old_team = rev_team
- silent = TRUE
- owner.remove_antag_datum(/datum/antagonist/rev/head)
- var/datum/antagonist/rev/new_rev = new /datum/antagonist/rev()
- new_rev.silent = TRUE
- old_owner.add_antag_datum(new_rev,old_team)
- new_rev.silent = FALSE
- to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!")
-
-/datum/antagonist/rev/farewell()
- if(ishuman(owner.current))
- owner.current.visible_message("[owner.current] looks like they just remembered their real allegiance!", null, null, null, owner.current)
- to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...")
- else if(issilicon(owner.current))
- owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current)
- to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.")
-
-/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter)
- log_attack("[owner.current] (Key: [key_name(owner.current)]) has been deconverted from the revolution by [deconverter] (Key: [key_name(deconverter)])!")
- if(borged)
- message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]")
- owner.special_role = null
- if(iscarbon(owner.current))
- var/mob/living/carbon/C = owner.current
- C.Unconscious(100)
- owner.remove_antag_datum(type)
-
-/datum/antagonist/rev/head/remove_revolutionary(borged,deconverter)
- if(!borged)
- return
- . = ..()
-
-/datum/antagonist/rev/head/equip_rev()
- var/mob/living/carbon/human/H = owner.current
- if(!istype(H))
- return
-
- if(remove_clumsy && owner.assigned_role == "Clown")
- to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
- H.dna.remove_mutation(CLOWNMUT)
-
- if(give_flash)
- var/obj/item/device/assembly/flash/T = new(H)
- var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store
- )
- var/where = H.equip_in_one_of_slots(T, slots)
- if (!where)
- to_chat(H, "The Syndicate were unfortunately unable to get you a flash.")
- else
- to_chat(H, "The flash in your [where] will help you to persuade the crew to join your cause.")
-
- if(give_hud)
- var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(H)
- S.Insert(H, special = FALSE, drop_if_replaced = FALSE)
- to_chat(H, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.")
-
-/datum/team/revolution
- name = "Revolution"
- var/max_headrevs = 3
-
-/datum/team/revolution/proc/update_objectives(initial = FALSE)
- var/untracked_heads = SSjob.get_all_heads()
- for(var/datum/objective/mutiny/O in objectives)
- untracked_heads -= O.target
- for(var/datum/mind/M in untracked_heads)
- var/datum/objective/mutiny/new_target = new()
- new_target.team = src
- new_target.target = M
- new_target.update_explanation_text()
- objectives += new_target
- for(var/datum/mind/M in members)
- M.objectives |= objectives
-
- addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE)
-
-/datum/team/revolution/proc/head_revolutionaries()
- . = list()
- for(var/datum/mind/M in members)
- if(M.has_antag_datum(/datum/antagonist/rev/head))
- . += M
-
-/datum/team/revolution/proc/update_heads()
- if(SSticker.HasRoundStarted())
- var/list/datum/mind/head_revolutionaries = head_revolutionaries()
- var/list/datum/mind/heads = SSjob.get_all_heads()
- var/list/sec = SSjob.get_all_sec()
-
- if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < round(heads.len - ((8 - sec.len) / 3)))
- var/list/datum/mind/non_heads = members - head_revolutionaries
- var/list/datum/mind/promotable = list()
- for(var/datum/mind/khrushchev in non_heads)
- if(khrushchev.current && !khrushchev.current.incapacitated() && !khrushchev.current.restrained() && khrushchev.current.client && khrushchev.current.stat != DEAD)
- if(ROLE_REV in khrushchev.current.client.prefs.be_special)
- promotable += khrushchev
- if(promotable.len)
- var/datum/mind/new_leader = pick(promotable)
- var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev)
- rev.promote()
-
- addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE)
-
-
-/datum/team/revolution/roundend_report()
- if(!members.len)
- return
-
- var/list/result = list()
-
- result += ""
-
- var/num_revs = 0
- var/num_survivors = 0
- for(var/mob/living/carbon/survivor in GLOB.alive_mob_list)
- if(survivor.ckey)
- num_survivors++
- if(survivor.mind)
- if(is_revolutionary(survivor))
- num_revs++
- if(num_survivors)
- result += "Command's Approval Rating:
[100 - round((num_revs/num_survivors)*100, 0.1)]%"
-
-
- var/list/targets = list()
- var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head)
- var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE)
- if(headrevs.len)
- var/list/headrev_part = list()
- headrev_part += ""
- headrev_part += printplayerlist(headrevs,TRUE)
- result += headrev_part.Join("
")
-
- if(revs.len)
- var/list/rev_part = list()
- rev_part += ""
- rev_part += printplayerlist(revs,TRUE)
- result += rev_part.Join("
")
-
- var/list/heads = SSjob.get_all_heads()
- if(heads.len)
- var/head_text = ""
- head_text += "
"
- for(var/datum/mind/head in heads)
- var/target = (head in targets)
- head_text += "- "
- if(target)
- head_text += "Target"
- head_text += "[printplayer(head, 1)]
"
- head_text += "
"
- result += head_text
-
- result += "
"
-
- return result.Join()
-
-/datum/team/revolution/antag_listing_entry()
- var/common_part = ..()
- var/heads_report = "Heads of Staff
"
- heads_report += ""
- for(var/datum/mind/N in SSjob.get_living_heads())
- var/mob/M = N.current
- if(M)
- heads_report += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
- heads_report += "PM | "
- heads_report += "FLW | "
- var/turf/mob_loc = get_turf(M)
- heads_report += "[mob_loc.loc] |
"
- else
- heads_report += "| [N.name]([N.key])Head body destroyed! | "
- heads_report += "PM |
"
- heads_report += "
"
- return common_part + heads_report
-
-/datum/team/revolution/is_gamemode_hero()
- return SSticker.mode.name == "revolution"
\ No newline at end of file
diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm
deleted file mode 100644
index 8aba74f70a..0000000000
--- a/code/datums/antagonists/wizard.dm
+++ /dev/null
@@ -1,339 +0,0 @@
-#define APPRENTICE_DESTRUCTION "destruction"
-#define APPRENTICE_BLUESPACE "bluespace"
-#define APPRENTICE_ROBELESS "robeless"
-#define APPRENTICE_HEALING "healing"
-
-/datum/antagonist/wizard
- name = "Space Wizard"
- roundend_category = "wizards/witches"
- antagpanel_category = "Wizard"
- job_rank = ROLE_WIZARD
- var/give_objectives = TRUE
- var/strip = TRUE //strip before equipping
- var/allow_rename = TRUE
- var/hud_version = "wizard"
- var/datum/team/wizard/wiz_team //Only created if wizard summons apprentices
- var/move_to_lair = TRUE
- var/outfit_type = /datum/outfit/wizard
- var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */
-
-/datum/antagonist/wizard/on_gain()
- register()
- if(give_objectives)
- create_objectives()
- equip_wizard()
- if(move_to_lair)
- send_to_lair()
- . = ..()
- if(allow_rename)
- rename_wizard()
-
-/datum/antagonist/wizard/proc/register()
- SSticker.mode.wizards |= owner
-
-/datum/antagonist/wizard/proc/unregister()
- SSticker.mode.wizards -= src
-
-/datum/antagonist/wizard/create_team(datum/team/wizard/new_team)
- if(!new_team)
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- wiz_team = new_team
-
-/datum/antagonist/wizard/get_team()
- return wiz_team
-
-/datum/team/wizard
- name = "wizard team"
- var/datum/antagonist/wizard/master_wizard
-
-/datum/antagonist/wizard/proc/create_wiz_team()
- wiz_team = new(owner)
- wiz_team.name = "[owner.current.real_name] team"
- wiz_team.master_wizard = src
- update_wiz_icons_added(owner.current)
-
-/datum/antagonist/wizard/proc/send_to_lair()
- if(!owner || !owner.current)
- return
- if(!GLOB.wizardstart.len)
- SSjob.SendToLateJoin(owner.current)
- to_chat(owner, "HOT INSERTION, GO GO GO")
- owner.current.forceMove(pick(GLOB.wizardstart))
-
-/datum/antagonist/wizard/proc/create_objectives()
- switch(rand(1,100))
- if(1 to 30)
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = owner
- kill_objective.find_target()
- objectives += kill_objective
-
- if (!(locate(/datum/objective/escape) in owner.objectives))
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- objectives += escape_objective
-
- if(31 to 60)
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = owner
- steal_objective.find_target()
- objectives += steal_objective
-
- if (!(locate(/datum/objective/escape) in owner.objectives))
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = owner
- objectives += escape_objective
-
- if(61 to 85)
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = owner
- kill_objective.find_target()
- objectives += kill_objective
-
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = owner
- steal_objective.find_target()
- objectives += steal_objective
-
- if (!(locate(/datum/objective/survive) in owner.objectives))
- var/datum/objective/survive/survive_objective = new
- survive_objective.owner = owner
- objectives += survive_objective
-
- else
- if (!(locate(/datum/objective/hijack) in owner.objectives))
- var/datum/objective/hijack/hijack_objective = new
- hijack_objective.owner = owner
- objectives += hijack_objective
-
- for(var/datum/objective/O in objectives)
- owner.objectives += O
-
-/datum/antagonist/wizard/on_removal()
- unregister()
- for(var/objective in objectives)
- owner.objectives -= objective
- owner.RemoveAllSpells() // TODO keep track which spells are wizard spells which innate stuff
- return ..()
-
-/datum/antagonist/wizard/proc/equip_wizard()
- if(!owner)
- return
- var/mob/living/carbon/human/H = owner.current
- if(!istype(H))
- return
- if(strip)
- H.delete_equipment()
- //Wizards are human by default. Use the mirror if you want something else.
- H.set_species(/datum/species/human)
- if(H.age < wiz_age)
- H.age = wiz_age
- H.equipOutfit(outfit_type)
-
-/datum/antagonist/wizard/greet()
- to_chat(owner, "You are the Space Wizard!")
- to_chat(owner, "The Space Wizards Federation has given you the following tasks:")
- owner.announce_objectives()
- to_chat(owner, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
- to_chat(owner, "The spellbook is bound to you, and others cannot use it.")
- to_chat(owner, "In your pockets you will find a teleport scroll. Use it as needed.")
- to_chat(owner,"Remember: do not forget to prepare your spells.")
-
-/datum/antagonist/wizard/farewell()
- to_chat(owner, "You have been brainwashed! You are no longer a wizard!")
-
-/datum/antagonist/wizard/proc/rename_wizard()
- set waitfor = FALSE
-
- var/wizard_name_first = pick(GLOB.wizard_first)
- var/wizard_name_second = pick(GLOB.wizard_second)
- var/randomname = "[wizard_name_first] [wizard_name_second]"
- var/mob/living/wiz_mob = owner.current
- var/newname = copytext(sanitize(input(wiz_mob, "You are the [name]. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
-
- if (!newname)
- newname = randomname
-
- wiz_mob.fully_replace_character_name(wiz_mob.real_name, newname)
-
-/datum/antagonist/wizard/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_wiz_icons_added(M, wiz_team ? TRUE : FALSE) //Don't bother showing the icon if you're solo wizard
- M.faction |= ROLE_WIZARD
-
-/datum/antagonist/wizard/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- update_wiz_icons_removed(M)
- M.faction -= ROLE_WIZARD
-
-
-/datum/antagonist/wizard/get_admin_commands()
- . = ..()
- .["Send to Lair"] = CALLBACK(src,.proc/admin_send_to_lair)
-
-/datum/antagonist/wizard/proc/admin_send_to_lair(mob/admin)
- owner.current.forceMove(pick(GLOB.wizardstart))
-
-/datum/antagonist/wizard/apprentice
- name = "Wizard Apprentice"
- hud_version = "apprentice"
- var/datum/mind/master
- var/school = APPRENTICE_DESTRUCTION
- outfit_type = /datum/outfit/wizard/apprentice
- wiz_age = APPRENTICE_AGE_MIN
-
-/datum/antagonist/wizard/apprentice/greet()
- to_chat(owner, "You are [master.current.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
- owner.announce_objectives()
-
-/datum/antagonist/wizard/apprentice/register()
- SSticker.mode.apprentices |= owner
-
-/datum/antagonist/wizard/apprentice/unregister()
- SSticker.mode.apprentices -= owner
-
-/datum/antagonist/wizard/apprentice/equip_wizard()
- . = ..()
- if(!owner)
- return
- var/mob/living/carbon/human/H = owner.current
- if(!istype(H))
- return
- switch(school)
- if(APPRENTICE_DESTRUCTION)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
- to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
- if(APPRENTICE_BLUESPACE)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
- to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
- if(APPRENTICE_HEALING)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
- H.put_in_hands(new /obj/item/gun/magic/staff/healing(H))
- to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
- if(APPRENTICE_ROBELESS)
- owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
- to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
-
-/datum/antagonist/wizard/apprentice/create_objectives()
- var/datum/objective/protect/new_objective = new /datum/objective/protect
- new_objective.owner = owner
- new_objective.target = master
- new_objective.explanation_text = "Protect [master.current.real_name], the wizard."
- owner.objectives += new_objective
- objectives += new_objective
-
-//Random event wizard
-/datum/antagonist/wizard/apprentice/imposter
- name = "Wizard Imposter"
- allow_rename = FALSE
- move_to_lair = FALSE
-
-/datum/antagonist/wizard/apprentice/imposter/greet()
- to_chat(owner, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!")
- owner.announce_objectives()
-
-/datum/antagonist/wizard/apprentice/imposter/equip_wizard()
- var/mob/living/carbon/human/master_mob = master.current
- var/mob/living/carbon/human/H = owner.current
- if(!istype(master_mob) || !istype(H))
- return
- if(master_mob.ears)
- H.equip_to_slot_or_del(new master_mob.ears.type, slot_ears)
- if(master_mob.w_uniform)
- H.equip_to_slot_or_del(new master_mob.w_uniform.type, slot_w_uniform)
- if(master_mob.shoes)
- H.equip_to_slot_or_del(new master_mob.shoes.type, slot_shoes)
- if(master_mob.wear_suit)
- H.equip_to_slot_or_del(new master_mob.wear_suit.type, slot_wear_suit)
- if(master_mob.head)
- H.equip_to_slot_or_del(new master_mob.head.type, slot_head)
- if(master_mob.back)
- H.equip_to_slot_or_del(new master_mob.back.type, slot_back)
-
- //Operation: Fuck off and scare people
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
-
-/datum/antagonist/wizard/proc/update_wiz_icons_added(mob/living/wiz,join = TRUE)
- var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
- wizhud.join_hud(wiz)
- set_antag_hud(wiz, hud_version)
-
-/datum/antagonist/wizard/proc/update_wiz_icons_removed(mob/living/wiz)
- var/datum/atom_hud/antag/wizhud = GLOB.huds[ANTAG_HUD_WIZ]
- wizhud.leave_hud(wiz)
- set_antag_hud(wiz, null)
-
-
-/datum/antagonist/wizard/academy
- name = "Academy Teacher"
- outfit_type = /datum/outfit/wizard/academy
-
-/datum/antagonist/wizard/academy/equip_wizard()
- . = ..()
-
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball)
-
- var/mob/living/M = owner.current
- if(!istype(M))
- return
-
- var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M)
- Implant.implant(M)
-
-/datum/antagonist/wizard/academy/create_objectives()
- var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders")
- new_objective.owner = owner
- owner.objectives += new_objective
- objectives += new_objective
-
-//Solo wizard report
-/datum/antagonist/wizard/roundend_report()
- var/list/parts = list()
-
- parts += printplayer(owner)
-
- var/count = 1
- var/wizardwin = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- parts += "Objective #[count]: [objective.explanation_text] Success!"
- else
- parts += "Objective #[count]: [objective.explanation_text] Fail."
- wizardwin = 0
- count++
-
- if(wizardwin)
- parts += "The wizard was successful!"
- else
- parts += "The wizard has failed!"
-
- if(owner.spell_list.len>0)
- parts += "[owner.name] used the following spells: "
- var/list/spell_names = list()
- for(var/obj/effect/proc_holder/spell/S in owner.spell_list)
- spell_names += S.name
- parts += spell_names.Join(", ")
-
- return parts.Join("
")
-
-//Wizard with apprentices report
-/datum/team/wizard/roundend_report()
- var/list/parts = list()
-
- parts += ""
- parts += master_wizard.roundend_report()
- parts += " "
- parts += ""
- parts += printplayerlist(members - master_wizard.owner)
-
- return "[parts.Join("
")]
"
\ No newline at end of file
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 88c7d09005..a1a4c11ca6 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -142,9 +142,6 @@
var/link = FOLLOW_LINK(M, owner)
to_chat(M, "[link] [dead_rendered]")
-/mob/camera/imaginary_friend/emote(act,m_type=1,message = null)
- return
-
/mob/camera/imaginary_friend/forceMove(atom/destination)
dir = get_dir(get_turf(src), destination)
loc = destination
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index d525b52ca5..9561515840 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -305,6 +305,88 @@
else
return
+/datum/browser/modal/preflikepicker
+ var/settings = list()
+ var/icon/preview_icon = null
+
+/datum/browser/modal/preflikepicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/settings,inputtype="checkbox", width = 400, height, slidecolor)
+ if (!User)
+ return
+ src.settings = settings
+
+ ..(User, ckey("[User]-[Message]-[Title]-[world.time]-[rand(1,10000)]"), Title, width, height, src, StealFocus, Timeout)
+ set_content(ShowChoices(User))
+
+/datum/browser/modal/preflikepicker/proc/ShowChoices(mob/user)
+ var/dat = ""
+
+ for (var/name in settings["mainsettings"])
+ var/setting = settings["mainsettings"][name]
+ if (setting["type"] == "datum")
+ dat += "[setting["desc"]]: [setting["value"]]
"
+ else
+ dat += "[setting["desc"]]: [setting["value"]]
"
+
+ if (preview_icon)
+ dat += ""
+
+ dat += ""
+
+ dat += " | "
+
+ dat += ""
+
+ dat += "
Ok "
+
+ dat += ""
+
+ return dat
+
+/datum/browser/modal/preflikepicker/Topic(href,href_list)
+ if (href_list["close"] || !user || !user.client)
+ opentime = 0
+ return
+ if (href_list["task"] == "input")
+ var/setting = href_list["setting"]
+ switch (href_list["type"])
+ if ("datum")
+ settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(typesof(text2path(href_list["path"]))))
+ if ("string")
+ settings["mainsettings"][setting]["value"] = stripped_input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]")
+ if ("number")
+ settings["mainsettings"][setting]["value"] = input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]") as num
+ if ("boolean")
+ settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("Yes","No")
+ if ("ckey")
+ settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("none") + GLOB.directory
+ if (href_list["button"])
+ var/button = text2num(href_list["button"])
+ if (button <= 3 && button >= 1)
+ selectedbutton = button
+ if (selectedbutton != 1)
+ set_content(ShowChoices(user))
+ open()
+ return
+ for (var/item in href_list)
+ switch(item)
+ if ("close", "button", "src")
+ continue
+ opentime = 0
+ close()
+
+/proc/presentpreflikepicker(var/mob/User,Message, Title, Button1="Ok", Button2, Button3, StealFocus = 1,Timeout = 6000,list/settings, width, height, slidecolor)
+ if (!istype(User))
+ if (istype(User, /client/))
+ var/client/C = User
+ User = C.mob
+ else
+ return
+ var/datum/browser/modal/preflikepicker/A = new(User, Message, Title, Button1, Button2, Button3, StealFocus,Timeout, settings, width, height, slidecolor)
+ A.open()
+ A.wait()
+ if (A.selectedbutton)
+ return list("button" = A.selectedbutton, "settings" = A.settings)
+
// This will allow you to show an icon in the browse window
// This is added to mob so that it can be used without a reference to the browser object
// There is probably a better place for this...
diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm
index 8fc7a070af..9193651ee2 100644
--- a/code/datums/components/caltrop.dm
+++ b/code/datums/components/caltrop.dm
@@ -24,7 +24,7 @@
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
- if(PIERCEIMMUNE in H.dna.species.species_traits)
+ if(H.has_trait(TRAIT_PIERCEIMMUNE))
return
if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK)
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index ffc20cc9cb..bc04a67308 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -1,17 +1,17 @@
-/mob/proc/HasDisease(datum/disease/D)
- for(var/thing in viruses)
+/mob/living/proc/HasDisease(datum/disease/D)
+ for(var/thing in diseases)
var/datum/disease/DD = thing
if(D.IsSame(DD))
return TRUE
return FALSE
-/mob/proc/CanContractDisease(datum/disease/D)
+/mob/living/proc/CanContractDisease(datum/disease/D)
if(stat == DEAD)
return FALSE
- if(D.GetDiseaseID() in resistances)
+ if(D.GetDiseaseID() in disease_resistances)
return FALSE
if(HasDisease(D))
@@ -23,38 +23,10 @@
return TRUE
-/mob/proc/ContactContractDisease(datum/disease/D)
+/mob/living/proc/ContactContractDisease(datum/disease/D)
if(!CanContractDisease(D))
return FALSE
- AddDisease(D)
-
-
-/mob/proc/AddDisease(datum/disease/D)
- for(var/datum/disease/advance/P in viruses)
- if(istype(D, /datum/disease/advance))
- var/datum/disease/advance/DD = D
- if (P.totalResistance() < DD.totalTransmittable()) //Overwrite virus if the attacker's Transmission is lower than the defender's Resistance. This does not grant immunity to the lost virus.
- P.remove_virus()
-
- if (!viruses.len) //Only add the new virus if it defeated the existing one
- var/datum/disease/DD = new D.type(1, D, 0)
- viruses += DD
- DD.affected_mob = src
- SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed.
-
- //Copy properties over. This is so edited diseases persist.
- var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms","processing")
- for(var/V in DD.vars)
- if(V in skipped)
- continue
- if(islist(DD.vars[V]))
- var/list/L = D.vars[V]
- DD.vars[V] = L.Copy()
- else
- DD.vars[V] = D.vars[V]
-
- DD.after_add()
- DD.affected_mob.med_hud_set_status()
+ D.try_infect(src)
/mob/living/carbon/ContactContractDisease(datum/disease/D, target_zone)
@@ -124,34 +96,35 @@
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed)
- AddDisease(D)
+ D.try_infect(src)
-/mob/proc/AirborneContractDisease(datum/disease/D)
- if((D.spread_flags & VIRUS_SPREAD_AIRBORNE) && prob((50*D.permeability_mod) - 1))
+/mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread)
+ if( ((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*D.permeability_mod) - 1))
ForceContractDisease(D)
-/mob/living/carbon/AirborneContractDisease(datum/disease/D)
+/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread)
if(internal)
return
- ..()
-
-/mob/living/carbon/human/AirborneContractDisease(datum/disease/D)
- if(dna && (NOBREATH in dna.species.species_traits))
+ if(has_trait(TRAIT_NOBREATH))
return
..()
-
-//Proc to use when you 100% want to infect someone, as long as they aren't immune
-/mob/proc/ForceContractDisease(datum/disease/D)
+//Proc to use when you 100% want to try to infect someone (ignoreing protective clothing and such), as long as they aren't immune
+/mob/living/proc/ForceContractDisease(datum/disease/D, make_copy = TRUE, del_on_fail = FALSE)
if(!CanContractDisease(D))
+ if(del_on_fail)
+ qdel(D)
return FALSE
- AddDisease(D)
+ if(!D.try_infect(src, make_copy))
+ if(del_on_fail)
+ qdel(D)
+ return FALSE
+ return TRUE
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
-
if(dna)
- if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
+ if(has_trait(TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity)
return FALSE
var/can_infect = FALSE
@@ -165,4 +138,4 @@
for(var/thing in D.required_organs)
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
return FALSE
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 5d49d7a523..614cd14abb 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -2,7 +2,7 @@
//Flags
var/visibility_flags = 0
var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST
- var/spread_flags = VIRUS_SPREAD_AIRBORNE | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN
+ var/spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN
//Fluff
var/form = "Virus"
@@ -26,7 +26,7 @@
var/carrier = FALSE //If our host is only a carrier
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/permeability_mod = 1
- var/severity = VIRUS_SEVERITY_POSITIVE
+ var/severity = DISEASE_SEVERITY_NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list() //dna_spread special bullshit
@@ -34,9 +34,27 @@
var/process_dead = FALSE //if this ticks while the host is dead
/datum/disease/Destroy()
- affected_mob = null
+ . = ..()
+ if(affected_mob)
+ remove_disease()
SSdisease.active_diseases.Remove(src)
- return ..()
+
+//add this disease if the host does not already have too many
+/datum/disease/proc/try_infect(var/mob/living/infectee, make_copy = TRUE)
+ if(infectee.diseases.len < DISEASE_LIMIT)
+ infect(infectee, make_copy)
+ return TRUE
+ return FALSE
+
+//add the disease with no checks
+/datum/disease/proc/infect(var/mob/living/infectee, make_copy = TRUE)
+ var/datum/disease/D = make_copy ? Copy() : src
+ infectee.diseases += D
+ D.affected_mob = infectee
+ SSdisease.active_diseases += D //Add it to the active diseases list, now that it's actually in a mob and being processed.
+
+ D.after_add()
+ infectee.med_hud_set_status()
/datum/disease/proc/stage_act()
var/cure = has_cure()
@@ -74,7 +92,7 @@
if(!affected_mob)
return
- if(!(spread_flags & VIRUS_SPREAD_AIRBORNE) && !force_spread)
+ if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread)
return
if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)))
@@ -89,24 +107,25 @@
if(istype(T))
for(var/mob/living/carbon/C in oview(spread_range, affected_mob))
var/turf/V = get_turf(C)
- if(V)
- while(TRUE)
- if(V == T)
- C.AirborneContractDisease(src)
- break
- var/turf/Temp = get_step_towards(V, T)
- if(!CANATMOSPASS(V, Temp))
- break
- V = Temp
+ if(disease_air_spread_walk(T, V))
+ C.AirborneContractDisease(src, force_spread)
+
+/proc/disease_air_spread_walk(turf/start, turf/end)
+ if(!start || !end)
+ return FALSE
+ while(TRUE)
+ if(end == start)
+ return TRUE
+ var/turf/Temp = get_step_towards(end, start)
+ if(!CANATMOSPASS(end, Temp))
+ return FALSE
+ end = Temp
/datum/disease/proc/cure(add_resistance = TRUE)
if(affected_mob)
- if(disease_flags & CAN_RESIST)
- var/id = GetDiseaseID()
- if(add_resistance && !(id in affected_mob.resistances))
- affected_mob.resistances += id
- remove_virus()
+ if(add_resistance && (disease_flags & CAN_RESIST))
+ affected_mob.disease_resistances |= GetDiseaseID()
qdel(src)
/datum/disease/proc/IsSame(datum/disease/D)
@@ -116,8 +135,19 @@
/datum/disease/proc/Copy()
+ //note that stage is not copied over - the copy starts over at stage 1
+ var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text",
+ "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance",
+ "bypasses_immunity", "permeability_mod", "severity", "required_organs", "needs_all_cures", "strain_data",
+ "infectable_hosts", "process_dead")
+
var/datum/disease/D = new type()
- D.strain_data = strain_data.Copy()
+ for(var/V in copy_vars)
+ var/val = vars[V]
+ if(islist(val))
+ var/list/L = val
+ val = L.Copy()
+ D.vars[V] = val
return D
/datum/disease/proc/after_add()
@@ -127,7 +157,7 @@
/datum/disease/proc/GetDiseaseID()
return "[type]"
-//don't use this proc directly. this should only ever be called by cure()
-/datum/disease/proc/remove_virus()
- affected_mob.viruses -= src //remove the datum from the list
+/datum/disease/proc/remove_disease()
+ affected_mob.diseases -= src //remove the datum from the list
affected_mob.med_hud_set_status()
+ affected_mob = null
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index d2ded9f907..64af3bc94d 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -7,7 +7,6 @@
*/
-#define SYMPTOM_LIMIT 6
@@ -31,6 +30,7 @@
var/list/symptoms = list() // The symptoms of the disease.
var/id = ""
var/processing = FALSE
+ var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology
// The order goes from easy to cure to hard to cure.
var/static/list/advance_cures = list(
@@ -46,23 +46,8 @@
*/
-/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D)
- if(!istype(D))
- D = null
- // Generate symptoms if we weren't given any.
-
- if(!symptoms || !symptoms.len)
-
- if(!D || !D.symptoms || !D.symptoms.len)
- symptoms = GenerateSymptoms(0, 2)
- else
- for(var/datum/symptom/S in D.symptoms)
- var/datum/symptom/new_symp = S.Copy()
- symptoms += new_symp
-
+/datum/disease/advance/New()
Refresh()
- ..(process, D)
- return
/datum/disease/advance/Destroy()
if(processing)
@@ -70,6 +55,26 @@
S.End(src)
return ..()
+/datum/disease/advance/try_infect(var/mob/living/infectee, make_copy = TRUE)
+ var/replace_num = infectee.diseases.len + 1 - DISEASE_LIMIT
+ if(replace_num > 0)
+ //see if we are more transmittable than enough diseases to replace them
+ //diseases replaced in this way do not confer immunity
+ var/list/L = list()
+ for(var/datum/disease/advance/P in infectee.diseases)
+ L += P
+ sortTim(L, /proc/cmp_advdisease_resistance_asc)
+ var/datum/disease/advance/competition = L[replace_num]
+ if(totalTransmittable() > competition.totalResistance())
+ for(var/i in 1 to replace_num)
+ var/datum/disease/advance/A = L[replace_num]
+ A.cure(FALSE)
+ else
+ //we are not strong enough to bully our way in
+ return FALSE
+ infect(infectee, make_copy)
+ return TRUE
+
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
..()
@@ -85,8 +90,6 @@
for(var/datum/symptom/S in symptoms)
S.Activate(src)
- else
- CRASH("We do not have any symptoms during stage_act()!")
// Compares type then ID.
/datum/disease/advance/IsSame(datum/disease/advance/D)
@@ -99,8 +102,15 @@
return 1
// Returns the advance disease with a different reference memory.
-/datum/disease/advance/Copy(process = 0)
- return new /datum/disease/advance(process, src, 1)
+/datum/disease/advance/Copy()
+ var/datum/disease/advance/A = ..()
+ QDEL_LIST(A.symptoms)
+ for(var/datum/symptom/S in symptoms)
+ A.symptoms += S.Copy()
+ A.properties = properties.Copy()
+ A.id = id
+ //this is a new disease starting over at stage 1, so processing is not copied
+ return A
/*
@@ -130,7 +140,7 @@
var/list/possible_symptoms = list()
for(var/symp in SSdisease.list_symptoms)
var/datum/symptom/S = new symp
- if(S.level >= level_min && S.level <= level_max)
+ if(S.naturally_occuring && S.level >= level_min && S.level <= level_max)
if(!HasSymptom(S))
possible_symptoms += S
@@ -154,22 +164,18 @@
AssignProperties()
id = null
- if(!SSdisease.archive_diseases[GetDiseaseID()])
+ var/the_id = GetDiseaseID()
+ if(!SSdisease.archive_diseases[the_id])
if(new_name)
AssignName()
- SSdisease.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop
- SSdisease.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1)
+ SSdisease.archive_diseases[the_id] = src // So we don't infinite loop
+ SSdisease.archive_diseases[the_id] = Copy()
- var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()]
- AssignName(A.name)
+ var/datum/disease/advance/A = SSdisease.archive_diseases[the_id]
+ name = A.name
//Generate disease properties based on the effects. Returns an associated list.
/datum/disease/advance/proc/GenerateProperties()
-
- if(!symptoms || !symptoms.len)
- CRASH("We did not have any symptoms before generating properties.")
- return
-
properties = list("resistance" = 0, "stealth" = 0, "stage_rate" = 0, "transmittable" = 0, "severity" = 0)
for(var/datum/symptom/S in symptoms)
@@ -179,7 +185,6 @@
properties["transmittable"] += S.transmittable
if(!S.neutered)
properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity non-neutered symptom
- return
// Assign the properties that are in the list.
/datum/disease/advance/proc/AssignProperties()
@@ -188,7 +193,7 @@
if(properties["stealth"] >= 2)
visibility_flags = HIDDEN_SCANNER
- SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), VIRUS_SPREAD_BLOOD, VIRUS_SPREAD_AIRBORNE))
+ SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE))
permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = 15 - CLAMP(properties["resistance"], -5, 5) // can be between 10 and 20
@@ -202,23 +207,23 @@
// Assign the spread type and give it the correct description.
/datum/disease/advance/proc/SetSpread(spread_id)
switch(spread_id)
- if(VIRUS_SPREAD_NON_CONTAGIOUS)
- spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS
+ if(DISEASE_SPREAD_NON_CONTAGIOUS)
+ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
spread_text = "None"
- if(VIRUS_SPREAD_SPECIAL)
- spread_flags = VIRUS_SPREAD_SPECIAL
+ if(DISEASE_SPREAD_SPECIAL)
+ spread_flags = DISEASE_SPREAD_SPECIAL
spread_text = "None"
- if(VIRUS_SPREAD_BLOOD)
- spread_flags = VIRUS_SPREAD_BLOOD
+ if(DISEASE_SPREAD_BLOOD)
+ spread_flags = DISEASE_SPREAD_BLOOD
spread_text = "Blood"
- if(VIRUS_SPREAD_CONTACT_FLUIDS)
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS
+ if(DISEASE_SPREAD_CONTACT_FLUIDS)
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS
spread_text = "Fluids"
- if(VIRUS_SPREAD_CONTACT_SKIN)
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN
+ if(DISEASE_SPREAD_CONTACT_SKIN)
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN
spread_text = "On contact"
- if(VIRUS_SPREAD_AIRBORNE)
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_FLUIDS | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_AIRBORNE
+ if(DISEASE_SPREAD_AIRBORNE)
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_FLUIDS | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_AIRBORNE
spread_text = "Airborne"
/datum/disease/advance/proc/SetSeverity(level_sev)
@@ -226,19 +231,19 @@
switch(level_sev)
if(-INFINITY to 0)
- severity = VIRUS_SEVERITY_POSITIVE
+ severity = DISEASE_SEVERITY_POSITIVE
if(1)
- severity = VIRUS_SEVERITY_NONTHREAT
+ severity = DISEASE_SEVERITY_NONTHREAT
if(2)
- severity = VIRUS_SEVERITY_MINOR
+ severity = DISEASE_SEVERITY_MINOR
if(3)
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
if(4)
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
if(5)
- severity = VIRUS_SEVERITY_DANGEROUS
+ severity = DISEASE_SEVERITY_DANGEROUS
if(6 to INFINITY)
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
else
severity = "Unknown"
@@ -253,11 +258,10 @@
var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]]
cure_text = D.name
-
- return
-
// Randomly generate a symptom, has a chance to lose or gain a symptom.
-/datum/disease/advance/proc/Evolve(min_level, max_level)
+/datum/disease/advance/proc/Evolve(min_level, max_level, ignore_mutable = FALSE)
+ if(!mutable && !ignore_mutable)
+ return
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
@@ -265,27 +269,32 @@
return
// Randomly remove a symptom.
-/datum/disease/advance/proc/Devolve()
+/datum/disease/advance/proc/Devolve(ignore_mutable = FALSE)
+ if(!mutable && !ignore_mutable)
+ return
if(symptoms.len > 1)
var/s = safepick(symptoms)
if(s)
RemoveSymptom(s)
Refresh(TRUE)
- return
// Randomly neuter a symptom.
-/datum/disease/advance/proc/Neuter()
+/datum/disease/advance/proc/Neuter(ignore_mutable = FALSE)
+ if(!mutable && !ignore_mutable)
+ return
if(symptoms.len)
var/s = safepick(symptoms)
if(s)
NeuterSymptom(s)
Refresh(TRUE)
- return
// Name the disease.
/datum/disease/advance/proc/AssignName(name = "Unknown")
- src.name = name
- return
+ Refresh()
+ var/datum/disease/advance/A = SSdisease.archive_diseases[GetDiseaseID()]
+ A.name = name
+ for(var/datum/disease/advance/AD in SSdisease.active_diseases)
+ AD.Refresh()
// Return a unique ID of the disease.
/datum/disease/advance/GetDiseaseID()
@@ -309,17 +318,15 @@
if(HasSymptom(S))
return
- if(symptoms.len < (SYMPTOM_LIMIT - 1) + rand(-1, 1))
+ if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1))
symptoms += S
else
RemoveSymptom(pick(symptoms))
symptoms += S
- return
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
- return
// Neuter a symptom, so it will only affect stats
/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
@@ -377,7 +384,7 @@
if(!user)
return
- var/i = SYMPTOM_LIMIT
+ var/i = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/D = new(0, null)
D.symptoms = list()
@@ -434,5 +441,3 @@
/datum/disease/advance/proc/totalTransmittable()
return properties["transmittable"]
-
-#undef RANDOM_STARTING_LEVEL
diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm
index d2f6a73365..9574338b51 100644
--- a/code/datums/diseases/advance/presets.dm
+++ b/code/datums/diseases/advance/presets.dm
@@ -1,59 +1,52 @@
// Cold
-/datum/disease/advance/cold/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Cold"
- symptoms = list(new/datum/symptom/sneeze)
- ..(process, D, copy)
+/datum/disease/advance/cold/New()
+ name = "Cold"
+ symptoms = list(new/datum/symptom/sneeze)
+ ..()
// Flu
-/datum/disease/advance/flu/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Flu"
- symptoms = list(new/datum/symptom/cough)
- ..(process, D, copy)
+/datum/disease/advance/flu/New()
+ name = "Flu"
+ symptoms = list(new/datum/symptom/cough)
+ ..()
// Voice Changing
-/datum/disease/advance/voice_change/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Epiglottis Mutation"
- symptoms = list(new/datum/symptom/voice_change)
- ..(process, D, copy)
+/datum/disease/advance/voice_change/New()
+ name = "Epiglottis Mutation"
+ symptoms = list(new/datum/symptom/voice_change)
+ ..()
// Toxin Filter
-/datum/disease/advance/heal/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Liver Enhancer"
- symptoms = list(new/datum/symptom/heal)
- ..(process, D, copy)
+/datum/disease/advance/heal/New()
+ name = "Liver Enhancer"
+ symptoms = list(new/datum/symptom/heal)
+ ..()
// Hallucigen
-/datum/disease/advance/hallucigen/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Second Sight"
- symptoms = list(new/datum/symptom/hallucigen)
- ..(process, D, copy)
+/datum/disease/advance/hallucigen/New()
+ name = "Second Sight"
+ symptoms = list(new/datum/symptom/hallucigen)
+ ..()
// Sensory Restoration
-/datum/disease/advance/mind_restoration/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Intelligence Booster"
- symptoms = list(new/datum/symptom/mind_restoration)
- ..(process, D, copy)
+/datum/disease/advance/mind_restoration/New()
+ name = "Intelligence Booster"
+ symptoms = list(new/datum/symptom/mind_restoration)
+ ..()
// Sensory Destruction
-/datum/disease/advance/narcolepsy/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE)
- if(!D)
- name = "Experimental Insomnia Cure"
- symptoms = list(new/datum/symptom/narcolepsy)
- ..(process, D, copy)
\ No newline at end of file
+/datum/disease/advance/narcolepsy/New()
+ name = "Experimental Insomnia Cure"
+ symptoms = list(new/datum/symptom/narcolepsy)
+ ..()
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index 323f794eee..1633b41352 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -40,7 +40,7 @@ BONUS
return
if(A.properties["stealth"] >= 4)
suppress_warning = TRUE
- if(A.spread_flags &= VIRUS_SPREAD_AIRBORNE) //infect bystanders
+ if(A.spread_flags &= DISEASE_SPREAD_AIRBORNE) //infect bystanders
infective = TRUE
if(A.properties["resistance"] >= 3) //strong enough to drop items
power = 1.5
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 84e5884ffb..e42b68cc05 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -28,6 +28,7 @@
//A neutered symptom has no effect, and only affects statistics.
var/neutered = FALSE
var/list/thresholds
+ var/naturally_occuring = TRUE //if this symptom can appear from /datum/disease/advance/GenerateSymptoms()
/datum/symptom/New()
var/list/S = SSdisease.list_symptoms
diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm
index 4673d2e980..2d96157bb0 100644
--- a/code/datums/diseases/anxiety.dm
+++ b/code/datums/diseases/anxiety.dm
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Ethanol"
cures = list("ethanol")
agent = "Excess Lepidopticides"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated subject will regurgitate butterflies."
- severity = VIRUS_SEVERITY_MINOR
+ severity = DISEASE_SEVERITY_MINOR
/datum/disease/anxiety/stage_act()
..()
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 61d1519e7d..5708447542 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -7,9 +7,9 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
disease_flags = CAN_CARRY|CAN_RESIST
- spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS
+ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/appendix)
bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm
index dc848ab622..f6504fa464 100644
--- a/code/datums/diseases/beesease.dm
+++ b/code/datums/diseases/beesease.dm
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Sugar"
cures = list("sugar")
agent = "Apidae Infection"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated subject will regurgitate bees."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD) //bees nesting in corpses
/datum/disease/beesease/stage_act()
diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm
index 49f8afcaff..0a34501763 100644
--- a/code/datums/diseases/brainrot.dm
+++ b/code/datums/diseases/brainrot.dm
@@ -2,7 +2,7 @@
name = "Brainrot"
max_stages = 4
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Mannitol"
cures = list("mannitol")
agent = "Cryptococcus Cosmosis"
@@ -10,7 +10,7 @@
cure_chance = 15//higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/brain)
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
..()
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index e9f02b91b6..22d45ffb29 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -7,7 +7,7 @@
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
- severity = VIRUS_SEVERITY_NONTHREAT
+ severity = DISEASE_SEVERITY_NONTHREAT
/datum/disease/cold/stage_act()
..()
@@ -47,7 +47,7 @@
if(prob(1))
to_chat(affected_mob, "Mucous runs down the back of your throat.")
if(prob(1) && prob(50))
- if(!affected_mob.resistances.Find(/datum/disease/flu))
- var/datum/disease/Flu = new /datum/disease/flu(0)
- affected_mob.ForceContractDisease(Flu)
+ if(!affected_mob.disease_resistances.Find(/datum/disease/flu))
+ var/datum/disease/Flu = new /datum/disease/flu()
+ affected_mob.ForceContractDisease(Flu, FALSE, TRUE)
cure()
\ No newline at end of file
diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm
index c68ee196c1..da5e67a4fb 100644
--- a/code/datums/diseases/cold9.dm
+++ b/code/datums/diseases/cold9.dm
@@ -2,13 +2,13 @@
name = "The Cold"
max_stages = 3
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Common Cold Anti-bodies & Spaceacillin"
cures = list("spaceacillin")
agent = "ICE9-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will slow, as if partly frozen."
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
/datum/disease/cold9/stage_act()
..()
diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index fefdabd9c8..267dd711a3 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -2,7 +2,7 @@
name = "Space Retrovirus"
max_stages = 4
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Mutadone"
cures = list("mutadone")
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
@@ -11,7 +11,7 @@
var/datum/dna/original_dna = null
var/transformed = 0
desc = "This disease transplants the genetic code of the initial vector into new hosts."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
/datum/disease/dnaspread/stage_act()
diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm
index e62a8b491d..add60c73f1 100644
--- a/code/datums/diseases/fake_gbs.dm
+++ b/code/datums/diseases/fake_gbs.dm
@@ -2,13 +2,13 @@
name = "GBS"
max_stages = 5
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Synaptizine & Sulfur"
cures = list("synaptizine","sulfur")
agent = "Gravitokinetic Bipotential SADS-"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
desc = "If left untreated death will occur."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/fake_gbs/stage_act()
..()
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index 206b61fb35..e1943937ba 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
- severity = VIRUS_SEVERITY_MINOR
+ severity = DISEASE_SEVERITY_MINOR
/datum/disease/flu/stage_act()
..()
diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm
index 22787cc23a..9577ca43d0 100644
--- a/code/datums/diseases/fluspanish.dm
+++ b/code/datums/diseases/fluspanish.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will burn to death for being a heretic."
- severity = VIRUS_SEVERITY_DANGEROUS
+ severity = DISEASE_SEVERITY_DANGEROUS
/datum/disease/fluspanish/stage_act()
..()
diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm
index 6d77acd3ae..0487b1c815 100644
--- a/code/datums/diseases/gbs.dm
+++ b/code/datums/diseases/gbs.dm
@@ -2,7 +2,7 @@
name = "GBS"
max_stages = 4
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Synaptizine & Sulfur"
cures = list("synaptizine","sulfur")
cure_chance = 15//higher chance to cure, since two reagents are required
@@ -10,7 +10,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 1
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/gbs/stage_act()
..()
diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm
index 06687cc12d..a9adf39812 100644
--- a/code/datums/diseases/heart_failure.dm
+++ b/code/datums/diseases/heart_failure.dm
@@ -10,12 +10,17 @@
desc = "If left untreated the subject will die!"
severity = "Dangerous!"
disease_flags = CAN_CARRY|CAN_RESIST
- spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS
+ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/heart)
bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
var/sound = FALSE
+/datum/disease/heart_failure/Copy()
+ var/datum/disease/heart_failure/D = ..()
+ D.sound = sound
+ return D
+
/datum/disease/heart_failure/stage_act()
..()
var/obj/item/organ/heart/O = affected_mob.getorgan(/obj/item/organ/heart)
diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm
index 91ce1ca71e..13959e9bda 100644
--- a/code/datums/diseases/magnitis.dm
+++ b/code/datums/diseases/magnitis.dm
@@ -9,7 +9,7 @@
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 0.75
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
infectable_hosts = list(SPECIES_ORGANIC, SPECIES_ROBOTIC)
process_dead = TRUE
diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm
index 284c3bd7f2..4fe0dc21b0 100644
--- a/code/datums/diseases/parrotpossession.dm
+++ b/code/datums/diseases/parrotpossession.dm
@@ -2,7 +2,7 @@
name = "Parrot Possession"
max_stages = 1
spread_text = "Paranormal"
- spread_flags = VIRUS_SPREAD_SPECIAL
+ spread_flags = DISEASE_SPREAD_SPECIAL
disease_flags = CURABLE
cure_text = "Holy Water."
cures = list("holywater")
@@ -10,7 +10,7 @@
agent = "Avian Vengence"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
infectable_hosts = list(SPECIES_ORGANIC, SPECIES_UNDEAD, SPECIES_INORGANIC, SPECIES_ROBOTIC)
bypasses_immunity = TRUE //2spook
var/mob/living/simple_animal/parrot/Poly/ghost/parrot
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index 89dce44536..8f13d2e2fa 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will probably drive others to insanity."
- severity = VIRUS_SEVERITY_MEDIUM
+ severity = DISEASE_SEVERITY_MEDIUM
/datum/disease/pierrot_throat/stage_act()
..()
diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm
index ae5fa9655f..fe099e495b 100644
--- a/code/datums/diseases/retrovirus.dm
+++ b/code/datums/diseases/retrovirus.dm
@@ -2,20 +2,17 @@
name = "Retrovirus"
max_stages = 4
spread_text = "Contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Rest or an injection of mutadone"
cure_chance = 6
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
permeability_mod = 0.4
stage_prob = 2
- var/SE
- var/UI
var/restcure = 0
-
/datum/disease/dna_retrovirus/New()
..()
agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]"
@@ -24,6 +21,10 @@
else
restcure = 1
+/datum/disease/dna_retrovirus/Copy()
+ var/datum/disease/dna_retrovirus/D = ..()
+ D.restcure = restcure
+ return D
/datum/disease/dna_retrovirus/stage_act()
..()
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index 8217364fb5..1aee35741a 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -2,13 +2,13 @@
name = "The Rhumba Beat"
max_stages = 5
spread_text = "On contact"
- spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS
+ spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Chick Chicky Boom!"
cures = list("plasma")
agent = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
process_dead = TRUE
/datum/disease/rhumba_beat/stage_act()
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 17aebc4629..db88bd6777 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -2,11 +2,11 @@
name = "Transformation"
max_stages = 5
spread_text = "Acute"
- spread_flags = VIRUS_SPREAD_SPECIAL
+ spread_flags = DISEASE_SPREAD_SPECIAL
cure_text = "A coder's love (theoretical)."
agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien)
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 10
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
disease_flags = CURABLE
@@ -17,6 +17,16 @@
var/list/stage5 = list("Oh the humanity!")
var/new_form = /mob/living/carbon/human
+/datum/disease/transformation/Copy()
+ var/datum/disease/transformation/D = ..()
+ D.stage1 = stage1.Copy()
+ D.stage2 = stage2.Copy()
+ D.stage3 = stage3.Copy()
+ D.stage4 = stage4.Copy()
+ D.stage5 = stage5.Copy()
+ D.new_form = D.new_form
+ return D
+
/datum/disease/transformation/stage_act()
..()
switch(stage)
@@ -68,13 +78,13 @@
cure_text = "Death."
cures = list("adminordrazine")
spread_text = "Monkey Bites"
- spread_flags = VIRUS_SPREAD_SPECIAL
+ spread_flags = DISEASE_SPREAD_SPECIAL
viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human)
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 4
visibility_flags = 0
agent = "Kongey Vibrion M-909"
@@ -131,7 +141,7 @@
cure_chance = 5
agent = "R2D2 Nanomachines"
desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = null
stage2 = list("Your joints feel stiff.", "Beep...boop..")
@@ -163,7 +173,7 @@
cure_chance = 5
agent = "Rip-LEY Alien Microbes"
desc = "This disease changes the victim into a xenomorph."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = null
stage2 = list("Your throat feels scratchy.", "Kill...")
@@ -191,7 +201,7 @@
cure_chance = 80
agent = "Advanced Mutation Toxin"
desc = "This highly concentrated extract converts anything into more of itself."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("You don't feel very well.")
stage2 = list("Your skin feels a little slimy.")
@@ -219,7 +229,7 @@
cures = list("adminordrazine")
agent = "Fell Doge Majicks"
desc = "This disease transforms the victim into a corgi."
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("BARK.")
stage2 = list("You feel the need to wear silly hats.")
@@ -245,7 +255,7 @@
agent = "Gluttony's Blessing"
desc = "A 'gift' from somewhere terrible."
stage_prob = 20
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("Your stomach rumbles.")
stage2 = list("Your skin feels saggy.")
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index c8524fd038..e413891e75 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -10,7 +10,7 @@
cure_chance = 5//like hell are you getting out of hell
desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(/obj/item/organ/lungs)
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
/datum/disease/tuberculosis/stage_act() //it begins
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index 612418b1ca..cfc848000b 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -10,7 +10,7 @@
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 0.75
desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
required_organs = list(/obj/item/bodypart/head)
/*
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index fc6c09be14..54b28deeee 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -11,6 +11,7 @@ GLOBAL_LIST_INIT(huds, list(
DATA_HUD_DIAGNOSTIC_BASIC = new/datum/atom_hud/data/diagnostic/basic(),
DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(),
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),
+ DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(),
ANTAG_HUD_CULT = new/datum/atom_hud/antag(),
ANTAG_HUD_REV = new/datum/atom_hud/antag(),
ANTAG_HUD_OPS = new/datum/atom_hud/antag(),
@@ -32,6 +33,9 @@ GLOBAL_LIST_INIT(huds, list(
var/list/mob/hudusers = list() //list with all mobs who can see the hud
var/list/hud_icons = list() //these will be the indexes for the atom's hud_list
+ var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them
+ var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet
+
/datum/atom_hud/New()
GLOB.all_huds += src
@@ -48,8 +52,11 @@ GLOBAL_LIST_INIT(huds, list(
return
if (!--hudusers[M])
hudusers -= M
- for(var/atom/A in hudatoms)
- remove_from_single_hud(M, A)
+ if(queued_to_see[M])
+ queued_to_see -= M
+ else
+ for(var/atom/A in hudatoms)
+ remove_from_single_hud(M, A)
/datum/atom_hud/proc/remove_from_hud(atom/A)
if(!A)
@@ -68,13 +75,26 @@ GLOBAL_LIST_INIT(huds, list(
/datum/atom_hud/proc/add_hud_to(mob/M)
if(!M)
return
- if (!hudusers[M])
+ if(!hudusers[M])
hudusers[M] = 1
- for(var/atom/A in hudatoms)
- add_to_single_hud(M, A)
+ if(next_time_allowed[M] > world.time)
+ if(!queued_to_see[M])
+ addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time)
+ queued_to_see[M] = TRUE
+ else
+ next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
+ for(var/atom/A in hudatoms)
+ add_to_single_hud(M, A)
else
hudusers[M]++
+/datum/atom_hud/proc/show_hud_images_after_cooldown(M)
+ if(queued_to_see[M])
+ queued_to_see -= M
+ next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
+ for(var/atom/A in hudatoms)
+ add_to_single_hud(M, A)
+
/datum/atom_hud/proc/add_to_hud(atom/A)
if(!A)
return FALSE
diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm
index 6281514e71..b221ac95ca 100644
--- a/code/datums/mutations/cold_resistance.dm
+++ b/code/datums/mutations/cold_resistance.dm
@@ -14,6 +14,18 @@
/datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner)
return visual_indicators[1]
+/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.add_trait(TRAIT_RESISTCOLD, "cold_resistance")
+ owner.add_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance")
+
+/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner)
+ if(..())
+ return
+ owner.remove_trait(TRAIT_RESISTCOLD, "cold_resistance")
+ owner.remove_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance")
+
/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner)
if(owner.getFireLoss())
if(prob(1))
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index eed23e0711..eea4088905 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -280,4 +280,10 @@
suffix = "mrow_thats_right.dmm"
name = "Feline-Human Combination Den"
description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \
- are morally sound or not is another issue entirely."
\ No newline at end of file
+ are morally sound or not is another issue entirely."
+
+/datum/map_template/ruin/space/cloning_facility
+ id = "cloning_facility"
+ suffix = "cloning_facility.dmm"
+ name = "Ancient Cloning Lab"
+ description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures."
\ No newline at end of file
diff --git a/code/datums/votablemap.dm b/code/datums/votablemap.dm
deleted file mode 100644
index c1c0c7d818..0000000000
--- a/code/datums/votablemap.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/datum/votablemap
- var/name = ""
- var/friendlyname = ""
- var/minusers = 0
- var/maxusers = 0
- var/voteweight = 1
-
-/datum/votablemap/New(name)
- src.name = name
- src.friendlyname = name
\ No newline at end of file
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index 9c9bde19fc..0906a7e053 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -33,16 +33,15 @@
if(prob(40))
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.dna && H.dna.species)
- if(!(RADIMMUNE in H.dna.species.species_traits))
- if(prob(max(0,100-resist)))
- H.randmuti()
- if(prob(50))
- if(prob(90))
- H.randmutb()
- else
- H.randmutg()
- H.domutcheck()
+ if(H.dna && !H.has_trait(TRAIT_RADIMMUNE))
+ if(prob(max(0,100-resist)))
+ H.randmuti()
+ if(prob(50))
+ if(prob(90))
+ H.randmutb()
+ else
+ H.randmutg()
+ H.domutcheck()
L.rad_act(20)
/datum/weather/rad_storm/end()
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index 0f57c0ce3b..13b9905874 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -466,4 +466,8 @@
/area/ruin/space/has_grav/powered/scp_294
name = "Abandoned SCP-294 Containment"
+ icon_state = "yellow"
+
+/area/ruin/space/has_grav/powered/ancient_shuttle
+ name = "Ancient Shuttle"
icon_state = "yellow"
\ No newline at end of file
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 8024322037..24fa11eda0 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -63,6 +63,9 @@
/datum/atom_hud/abductor
hud_icons = list(GLAND_HUD)
+/datum/atom_hud/sentient_disease
+ hud_icons = list(SENTIENT_DISEASE_HUD)
+
/* MED/SEC/DIAG HUD HOOKS */
/*
@@ -78,7 +81,7 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
var/threat
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
if(!threat || D.severity > threat) //a buffing virus gets an icon
@@ -175,19 +178,19 @@
holder.icon_state = "huddead"
else
switch(virus_threat)
- if(VIRUS_SEVERITY_BIOHAZARD)
+ if(DISEASE_SEVERITY_BIOHAZARD)
holder.icon_state = "hudill5"
- if(VIRUS_SEVERITY_DANGEROUS)
+ if(DISEASE_SEVERITY_DANGEROUS)
holder.icon_state = "hudill4"
- if(VIRUS_SEVERITY_HARMFUL)
+ if(DISEASE_SEVERITY_HARMFUL)
holder.icon_state = "hudill3"
- if(VIRUS_SEVERITY_MEDIUM)
+ if(DISEASE_SEVERITY_MEDIUM)
holder.icon_state = "hudill2"
- if(VIRUS_SEVERITY_MINOR)
+ if(DISEASE_SEVERITY_MINOR)
holder.icon_state = "hudill1"
- if(VIRUS_SEVERITY_NONTHREAT)
+ if(DISEASE_SEVERITY_NONTHREAT)
holder.icon_state = "hudill0"
- if(VIRUS_SEVERITY_POSITIVE)
+ if(DISEASE_SEVERITY_POSITIVE)
holder.icon_state = "hudbuff"
if(null)
holder.icon_state = "hudhealthy"
diff --git a/code/game/gamemodes/antag_spawner_cit.dm b/code/game/gamemodes/antag_spawner_cit.dm
deleted file mode 100644
index 4cdc096072..0000000000
--- a/code/game/gamemodes/antag_spawner_cit.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-////////////Syndicate Cortical Borer
-obj/item/antag_spawner/syndi_borer
- name = "syndicate brain-slug container"
- desc = "Releases a modified cortical borer to assist the user."
- icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work.
- icon_state = "locator"
- var/polling = FALSE
-
-obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
- var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T)
-
- B.key = C.key
- if (owner)
- B.owner = owner
- B.faction = B.faction | owner.faction.Copy()
-
- B.mind.assigned_role = B.name
- B.mind.special_role = B.name
- var/datum/objective/syndi_borer/new_objective
- new_objective = new /datum/objective/syndi_borer
- new_objective.owner = B.mind
- new_objective.target = owner.mind
- new_objective.explanation_text = "You are a modified cortical borer. You obey [owner.real_name] and must assist them in completing their objectives."
- B.mind.objectives += new_objective
-
- to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!")
- if(new_objective)
- to_chat(B, "Objective #[1]: [new_objective.explanation_text]")
-
-/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user)
- if(used)
- to_chat(user, "[src] appears to be empty!")
- return 0
- if(polling == TRUE)
- to_chat(user, "[src] is busy activating!")
- return 0
- return 1
-
-/obj/item/antag_spawner/syndi_borer/attack_self(mob/user)
- if(!(check_usability(user)))
- return
- polling = TRUE
- var/list/borer_candidates = pollCandidatesForMob("Do you want to play as a syndicate cortical borer?", ROLE_BORER, null, ROLE_BORER, 150, src)
- if(borer_candidates.len)
- polling = FALSE
- if(!(check_usability(user)))
- return
- used = 1
- var/mob/dead/observer/theghost = pick(borer_candidates)
- spawn_antag(theghost.client, get_turf(src), user)
- var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread
- S.set_up(4, 1, src)
- S.start()
- qdel(src)
- else
- polling = FALSE
- to_chat(user, "Unable to connect to release specimen. Please wait and try again later or use the container on your uplink to get your points refunded.")
\ No newline at end of file
diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm
deleted file mode 100644
index fbcfc675e3..0000000000
--- a/code/game/gamemodes/cit_objectives.dm
+++ /dev/null
@@ -1,106 +0,0 @@
-#define MIN_LATE_TARGET_TIME 600 //lower bound of re-rolled timer, 1 min
-#define MAX_LATE_TARGET_TIME 6000 //upper bound of re-rolled timer, 10 min
-#define LATE_TARGET_HIT_CHANCE 70 //How often would the find_target succeed, otherwise it re-rolls later and tries again.
-//Hit chance is here to avoid people checking github and then hovering around new arrivals within the max minute range every round.
-
-/datum/objective/assassinate/late
- martyr_compatible = FALSE
-
-
-/datum/objective/assassinate/late/find_target()
- var/list/possible_targets = list()
- for(var/mob/M in GLOB.latejoiners)
- var/datum/mind/possible_target = M.mind
- if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target))
- possible_targets += possible_target
- if(possible_targets.len > 0 && prob(LATE_TARGET_HIT_CHANCE))
- target = pick(possible_targets)
- martyr_compatible = TRUE //Might never matter, but I guess if an admin gives another random objective, this should now be compatible
- update_explanation_text()
-
- message_admins("[target] has been selected as the assassination target of [owner].")
- log_game("[target] has been selected as the assassination target of [owner].")
-
- to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:")
- to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].")
- return target
- else
- update_explanation_text()
- addtimer(CALLBACK(src, .proc/find_target),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME))
- return null
-
-/datum/objective/assassinate/late/find_target_by_role(role, role_type=0, invert=0)
- var/list/possible_targets = list()
- for(var/mob/M in GLOB.latejoiners)
- var/datum/mind/possible_target = M.mind
- if((possible_target != owner) && ishuman(possible_target.current))
- var/is_role = 0
- if(role_type)
- if(possible_target.special_role == role)
- is_role++
- else
- if(possible_target.assigned_role == role)
- is_role++
-
- if(invert)
- if(is_role)
- continue
- possible_targets += possible_target
- //break
- else if(is_role)
- possible_targets += possible_target
- //break
- if(possible_targets && prob(LATE_TARGET_HIT_CHANCE))
- target = pick(possible_targets)
- update_explanation_text()
-
- message_admins("[target] has been selected as the assassination target of [owner].")
- log_game("[target] has been selected as the assassination target of [owner].")
-
- to_chat(owner, "You hear a crackling noise in your ears, as a one-way syndicate message plays:")
- to_chat(owner, "You target has been located. To succeed, find and eliminate [target], the [!target_role_type ? target.assigned_role : target.special_role].")
- else
- update_explanation_text()
- addtimer(CALLBACK(src, .proc/find_target_by_role, role, role_type, invert),rand(MIN_LATE_TARGET_TIME, MAX_LATE_TARGET_TIME))
-
-
-
-/datum/objective/assassinate/late/check_completion()
- if(target && target.current) //If target WAS assigned
- if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
- return TRUE
- return FALSE
- else //If no target was ever given
- if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
- return FALSE
- if(!is_special_character(owner.current))
- return FALSE
- return TRUE
-
-/datum/objective/assassinate/late/update_explanation_text()
- //..()
- if(target && target.current)
- explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]."
- else
- explanation_text = "Stay alive until your target arrives on the station, you will be notified when the target has been identified."
-
-
-
-//BORER STUFF
-//Because borers didn't use to have objectives
-/datum/objective/normal_borer //Default objective, should technically never be used unmodified but CAN work unmodified.
- explanation_text = "You must escape with at least one borer with host on the shuttle."
- target_amount = 1
- martyr_compatible = 0
-
-/datum/objective/normal_borer/check_completion()
- var/total_borer_hosts = 0
- for(var/mob/living/carbon/C in GLOB.mob_list)
- var/mob/living/simple_animal/borer/D = C.has_brain_worms()
- var/turf/location = get_turf(C)
- if(is_centcom_level(location.z) && D && D.stat != DEAD)
- total_borer_hosts++
- if(target_amount <= total_borer_hosts)
- return TRUE
- else
- return FALSE
diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm
deleted file mode 100644
index dd66edcfb1..0000000000
--- a/code/game/gamemodes/cult/blood_magic.dm
+++ /dev/null
@@ -1,769 +0,0 @@
-/datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans)
- name = "Prepare Blood Magic"
- button_icon_state = "carve"
- desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune"
- var/list/spells = list()
- var/channeling = FALSE
-
-/datum/action/innate/cult/blood_magic/Grant()
- ..()
- button.screen_loc = "6:-29,4:-2"
- button.moved = "6:-29,4:-2"
- button.locked = TRUE
-
-/datum/action/innate/cult/blood_magic/Remove()
- for(var/X in spells)
- qdel(X)
- ..()
-
-/datum/action/innate/cult/blood_magic/IsAvailable()
- if(!iscultist(owner))
- return FALSE
- return ..()
-
-/datum/action/innate/cult/blood_magic/proc/Positioning()
- for(var/datum/action/innate/cult/blood_spell/B in spells)
- var/pos = -29+spells.Find(B)*31
- B.button.screen_loc = "6:[pos],4:-2"
- B.button.moved = B.button.screen_loc
- B.button.locked = TRUE
-
-/datum/action/innate/cult/blood_magic/Activate()
- var/rune = FALSE
- var/limit = RUNELESS_MAX_BLOODCHARGE
- for(var/obj/effect/rune/empower/R in range(1, owner))
- rune = TRUE
- break
- if(rune)
- limit = MAX_BLOODCHARGE
- if(spells.len >= limit)
- if(rune)
- to_chat(owner, "Your body has reached its limit, you cannot store more than [MAX_BLOODCHARGE] spells at once. Pick a spell to nullify.")
- else
- to_chat(owner, "Your body has reached its limit, you cannot have more than [RUNELESS_MAX_BLOODCHARGE] spells at once without an empowering rune! Pick a spell to nullify.")
- var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells
- if(nullify_spell)
- qdel(nullify_spell)
- return
- var/entered_spell_name
- var/datum/action/innate/cult/blood_spell/BS
- var/list/possible_spells = list()
- for(var/I in subtypesof(/datum/action/innate/cult/blood_spell))
- var/datum/action/innate/cult/blood_spell/J = I
- var/cult_name = initial(J.name)
- possible_spells[cult_name] = J
- possible_spells += "(REMOVE SPELL)"
- entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells
- if(entered_spell_name == "(REMOVE SPELL)")
- var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells
- if(nullify_spell)
- qdel(nullify_spell)
- return
- BS = possible_spells[entered_spell_name]
- if(QDELETED(src) || owner.incapacitated() || !BS)
- return
- to_chat(owner,"You begin to carve unnatural symbols into your flesh!")
- SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10))
- if(!channeling)
- channeling = TRUE
- else
- to_chat(owner, "You are already invoking blood magic!")
- return
- if(do_after(owner, 100 - rune*65, target = owner))
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.bleed(30 - rune*25)
- var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner)
- new_spell.Grant(owner, src)
- spells += new_spell
- Positioning()
- to_chat(owner, "Your wounds glows with power, you have prepared a [new_spell.name] invocation!")
- channeling = FALSE
-
-/datum/action/innate/cult/blood_spell //The next generation of talismans
- name = "Blood Magic"
- button_icon_state = "telerune"
- desc = "Fear the Old Blood."
- var/charges = 1
- var/magic_path = null
- var/obj/item/melee/blood_magic/hand_magic
- var/datum/action/innate/cult/blood_magic/all_magic
- var/base_desc //To allow for updating tooltips
- var/invocation
- var/health_cost = 0
-
-/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM)
- if(health_cost)
- desc += "
Deals [health_cost] damage to your arm per use."
- base_desc = desc
- desc += "
Has [charges] use\s remaining."
- all_magic = BM
- ..()
-
-/datum/action/innate/cult/blood_spell/Remove()
- if(all_magic)
- all_magic.spells -= src
- if(hand_magic)
- qdel(hand_magic)
- hand_magic = null
- ..()
-
-/datum/action/innate/cult/blood_spell/IsAvailable()
- if(!iscultist(owner) || owner.incapacitated() || !charges)
- return FALSE
- return ..()
-
-/datum/action/innate/cult/blood_spell/Activate()
- if(magic_path) //If this spell flows from the hand
- if(!hand_magic)
- hand_magic = new magic_path(owner, src)
- if(!owner.put_in_hands(hand_magic))
- qdel(hand_magic)
- hand_magic = null
- to_chat(owner, "You have no empty hand for invoking blood magic!")
- return
- to_chat(owner, "Your old wounds glow again as you invoke the [name].")
- return
- if(hand_magic)
- qdel(hand_magic)
- hand_magic = null
- to_chat(owner, "You snuff out the spell with your hand, saving its power for another time.")
-
-
-//Cult Blood Spells
-/datum/action/innate/cult/blood_spell/stun
- name = "Stun"
- desc = "A potent spell that will stun and mute victims upon contact."
- button_icon_state = "hand"
- magic_path = "/obj/item/melee/blood_magic/stun"
- health_cost = 10
-
-/datum/action/innate/cult/blood_spell/teleport
- name = "Teleport"
- desc = "A useful spell that teleport cultists to a chosen destination on contact."
- button_icon_state = "tele"
- magic_path = "/obj/item/melee/blood_magic/teleport"
- health_cost = 7
-
-/datum/action/innate/cult/blood_spell/emp
- name = "Electromagnetic Pulse"
- desc = "A large spell that immediately disables all electronics in the area."
- button_icon_state = "emp"
- health_cost = 10
- invocation = "Ta'gh fara'qha fel d'amar det!"
-
-/datum/action/innate/cult/blood_spell/emp/Activate()
- owner.visible_message("[owner]'s hand flashes a bright blue!", \
- "You speak the cursed words, emitting an EMP blast from your hand.")
- empulse(owner, 3, 6)
- owner.whisper(invocation, language = /datum/language/common)
- charges--
- if(charges<=0)
- qdel(src)
-
-/datum/action/innate/cult/blood_spell/shackles
- name = "Shadow Shackles"
- desc = "A stealthy spell that will handcuff and temporarily silence your victim."
- button_icon_state = "cuff"
- charges = 4
- magic_path = "/obj/item/melee/blood_magic/shackles"
-
-/datum/action/innate/cult/blood_spell/construction
- name = "Twisted Construction"
- desc = "A sinister spell used to convert:
Plasteel into runed metal
25 metal into a construct shell
Cyborgs directly into constructs
Cyborg shells into construct shells
Airlocks into runed airlocks (harm intent)"
- button_icon_state = "transmute"
- magic_path = "/obj/item/melee/blood_magic/construction"
-
-/datum/action/innate/cult/blood_spell/equipment
- name = "Summon Equipment"
- desc = "A crucial spell that enables you to summon either a ritual dagger or combat gear including armored robes, the nar'sien bola, and an eldritch longsword."
- button_icon_state = "equip"
- magic_path = "/obj/item/melee/blood_magic/armor"
-
-/datum/action/innate/cult/blood_spell/equipment/Activate()
- var/choice = alert(owner,"Choose your equipment type",,"Combat Equipment","Ritual Dagger","Cancel")
- if(choice == "Ritual Dagger")
- var/turf/T = get_turf(owner)
- owner.visible_message("[owner]'s hand glows red for a moment.", \
- "Red light begins to shimmer and take form within your hand!")
- var/obj/O = new /obj/item/melee/cultblade/dagger(T)
- if(owner.put_in_hands(O))
- to_chat(owner, "A ritual dagger appears in your hand!")
- else
- owner.visible_message("A ritual dagger appears at [owner]'s feet!", \
- "A ritual dagger materializes at your feet.")
- SEND_SOUND(owner, sound('sound/effects/magic.ogg',0,1,25))
- charges--
- desc = base_desc
- desc += "
Has [charges] use\s remaining."
- if(charges<=0)
- qdel(src)
- else if(choice == "Combat Equipment")
- ..()
-
-/datum/action/innate/cult/blood_spell/horror
- name = "Hallucinations"
- desc = "A ranged yet stealthy spell that will break the mind of the victim with nightmarish hallucinations."
- button_icon_state = "horror"
- var/obj/effect/proc_holder/horror/PH
- charges = 4
-
-/datum/action/innate/cult/blood_spell/horror/New()
- PH = new()
- PH.attached_action = src
- ..()
-
-/datum/action/innate/cult/blood_spell/horror/Destroy()
- var/obj/effect/proc_holder/horror/destroy = PH
- . = ..()
- if(destroy && !QDELETED(destroy))
- QDEL_NULL(destroy)
-
-/datum/action/innate/cult/blood_spell/horror/Activate()
- PH.toggle(owner) //the important bit
- return TRUE
-
-/obj/effect/proc_holder/horror
- active = FALSE
- ranged_mousepointer = 'icons/effects/cult_target.dmi'
- var/datum/action/innate/cult/blood_spell/attached_action
-
-/obj/effect/proc_holder/horror/Destroy()
- var/datum/action/innate/cult/blood_spell/AA = attached_action
- . = ..()
- if(AA && !QDELETED(AA))
- QDEL_NULL(AA)
-
-/obj/effect/proc_holder/horror/proc/toggle(mob/user)
- if(active)
- remove_ranged_ability("You dispel the magic...")
- else
- add_ranged_ability(user, "You prepare to horrify a target...")
-
-/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return
- if(ranged_ability_user.incapacitated() || !iscultist(caller))
- remove_ranged_ability()
- return
- var/turf/T = get_turf(ranged_ability_user)
- if(!isturf(T))
- return FALSE
- if(target in view(7, get_turf(ranged_ability_user)))
- if(!ishuman(target) || iscultist(target))
- return
- var/mob/living/carbon/human/H = target
- H.hallucination = max(H.hallucination, 240)
- SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50))
- var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER)
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, FALSE)
- addtimer(CALLBACK(H,/atom/.proc/remove_alt_appearance,"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE)
- to_chat(ranged_ability_user,"[H] has been cursed with living nightmares!")
- attached_action.charges--
- attached_action.desc = attached_action.base_desc
- attached_action.desc += "
Has [attached_action.charges] use\s remaining."
- attached_action.UpdateButtonIcon()
- if(attached_action.charges <= 0)
- remove_mousepointer(ranged_ability_user.client)
- remove_ranged_ability("You have exhausted the spell's power!")
- qdel(src)
-
-/datum/action/innate/cult/blood_spell/veiling
- name = "Conceal Presence"
- desc = "A multi-function spell that alternates between hiding and revealing nearby cult runes, structures, turf, and airlocks."
- invocation = "Kla'atu barada nikt'o!"
- button_icon_state = "gone"
- charges = 10
- var/revealing = FALSE //if it reveals or not
-
-/datum/action/innate/cult/blood_spell/veiling/Activate()
- if(!revealing)
- owner.visible_message("Thin grey dust falls from [owner]'s hand!", \
- "You invoke the veiling spell, hiding nearby runes.")
- charges--
- SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25))
- owner.whisper(invocation, language = /datum/language/common)
- for(var/obj/effect/rune/R in range(5,owner))
- R.conceal()
- for(var/obj/structure/destructible/cult/S in range(5,owner))
- S.conceal()
- for(var/turf/open/floor/engine/cult/T in range(5,owner))
- T.realappearance.alpha = 0
- for(var/obj/machinery/door/airlock/cult/AL in range(5, owner))
- AL.conceal()
- revealing = TRUE
- name = "Reveal Runes"
- button_icon_state = "back"
- else
- owner.visible_message("A flash of light shines from [owner]'s hand!", \
- "You invoke the counterspell, revealing nearby runes.")
- charges--
- owner.whisper(invocation, language = /datum/language/common)
- SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25))
- for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot
- R.reveal()
- for(var/obj/structure/destructible/cult/S in range(6,owner))
- S.reveal()
- for(var/turf/open/floor/engine/cult/T in range(6,owner))
- T.realappearance.alpha = initial(T.realappearance.alpha)
- for(var/obj/machinery/door/airlock/cult/AL in range(6, owner))
- AL.reveal()
- revealing = FALSE
- name = "Conceal Runes"
- button_icon_state = "gone"
- if(charges<= 0)
- qdel(src)
- desc = base_desc
- desc += "
Has [charges] use\s remaining."
- UpdateButtonIcon()
-
-/datum/action/innate/cult/blood_spell/manipulation
- name = "Blood Rites"
- desc = "A complex spell that allows you to gather blood and use it for healing or other powerful spells."
- invocation = "Fel'th Dol Ab'orod!"
- button_icon_state = "manip"
- charges = 5
- magic_path = "/obj/item/melee/blood_magic/manipulator"
-
-
-// The "magic hand" items
-/obj/item/melee/blood_magic
- name = "\improper magical aura"
- desc = "Sinister looking aura that distorts the flow of reality around it."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "disintegrate"
- item_state = null
- flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
- w_class = WEIGHT_CLASS_HUGE
- throwforce = 0
- throw_range = 0
- throw_speed = 0
- var/invocation
- var/uses = 1
- var/health_cost = 0 //The amount of health taken from the user when invoking the spell
- var/datum/action/innate/cult/blood_spell/source
-
-/obj/item/melee/blood_magic/New(loc, spell)
- source = spell
- uses = source.charges
- health_cost = source.health_cost
- ..()
-
-/obj/item/melee/blood_magic/Destroy()
- if(!QDELETED(source))
- if(uses <= 0)
- source.hand_magic = null
- qdel(source)
- source = null
- else
- source.hand_magic = null
- source.charges = uses
- source.desc = source.base_desc
- source.desc += "
Has [uses] use\s remaining."
- source.UpdateButtonIcon()
- ..()
-
-/obj/item/melee/blood_magic/attack_self(mob/living/user)
- afterattack(user, user, TRUE)
-
-/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user)
- if(!iscarbon(user) || !iscultist(user))
- uses = 0
- qdel(src)
- return
- add_logs(user, M, "used a cult spell on", source.name, "")
- M.lastattacker = user.real_name
- M.lastattackerckey = user.ckey
-
-/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(invocation)
- user.whisper(invocation, language = /datum/language/common)
- if(health_cost)
- if(user.active_hand_index == 1)
- user.apply_damage(health_cost, BRUTE, "l_arm")
- else
- user.apply_damage(health_cost, BRUTE, "r_arm")
- if(uses <= 0)
- qdel(src)
- else if(source)
- source.desc = source.base_desc
- source.desc += "
Has [uses] use\s remaining."
- source.UpdateButtonIcon()
-
-//Stun
-/obj/item/melee/blood_magic/stun
- color = "#ff0000" // red
- invocation = "Fuu ma'jin!"
-
-/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(!isliving(target) || !proximity)
- return
- var/mob/living/L = target
- if(iscultist(target))
- return
- if(iscultist(user))
- user.visible_message("[user] holds up their hand, which explodes in a flash of red light!", \
- "You stun [L] with the spell!")
- var/obj/item/nullrod/N = locate() in L
- if(N)
- target.visible_message("[L]'s holy weapon absorbs the light!", \
- "Your holy weapon absorbs the blinding light!")
- else
- L.Knockdown(180)
- L.flash_act(1,1)
- if(issilicon(target))
- var/mob/living/silicon/S = L
- S.emp_act(EMP_HEAVY)
- else if(iscarbon(target))
- var/mob/living/carbon/C = L
- C.silent += 6
- C.stuttering += 15
- C.cultslurring += 15
- C.Jitter(15)
- if(is_servant_of_ratvar(L))
- L.adjustBruteLoss(15)
- uses--
- ..()
-
-//Teleportation
-/obj/item/melee/blood_magic/teleport
- color = RUNE_COLOR_TELEPORT
- desc = "A potent spell that teleport cultists on contact."
- invocation = "Sas'so c'arta forbici!"
-
-/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(!iscultist(target) || !proximity)
- to_chat(user, "You can only teleport adjacent cultists with this spell!")
- return
- if(iscultist(user))
- var/list/potential_runes = list()
- var/list/teleportnames = list()
- for(var/R in GLOB.teleport_runes)
- var/obj/effect/rune/teleport/T = R
- potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
-
- if(!potential_runes.len)
- to_chat(user, "There are no valid runes to teleport to!")
- log_game("Teleport talisman failed - no other teleport runes")
- return
-
- var/turf/T = get_turf(src)
- if(is_away_level(T.z))
- to_chat(user, "You are not in the right dimension!")
- log_game("Teleport spell failed - user in away mission")
- return
-
- var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
- var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
- if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune || !proximity)
- return
- var/turf/dest = get_turf(actual_selected_rune)
- if(is_blocked_turf(dest, TRUE))
- to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.")
- return
- uses--
- user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \
- "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.")
- var/mob/living/L = target
- L.forceMove(dest)
- dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
- ..()
-
-//Shackles
-/obj/item/melee/blood_magic/shackles
- name = "Shadow Shackles"
- desc = "Allows you to bind a victim and temporarily silence them."
- invocation = "In'totum Lig'abis!"
- color = "#000000" // black
-
-/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(iscultist(user) && iscarbon(target) && proximity)
- var/mob/living/carbon/C = target
- if(C.get_num_arms() >= 2 || C.get_arm_ignore())
- CuffAttack(C, user)
- else
- user.visible_message("This victim doesn't have enough arms to complete the restraint!")
- return
- ..()
-
-/obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
- if(!C.handcuffed)
- playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
- C.visible_message("[user] begins restraining [C] with dark magic!", \
- "[user] begins shaping a dark magic around your wrists!")
- if(do_mob(user, C, 30))
- if(!C.handcuffed)
- C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C)
- C.update_handcuffed()
- C.silent += 5
- to_chat(user, "You shackle [C].")
- add_logs(user, C, "shackled")
- uses--
- else
- to_chat(user, "[C] is already bound.")
- else
- to_chat(user, "You fail to shackle [C].")
- else
- to_chat(user, "[C] is already bound.")
-
-
-/obj/item/restraints/handcuffs/energy/cult //For the shackling spell
- name = "shadow shackles"
- desc = "Shackles that bind the wrists with sinister magic."
- trashtype = /obj/item/restraints/handcuffs/energy/used
- flags_1 = DROPDEL_1
-
-/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
- user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \
- "Your [src] shatters in a discharge of dark magic!")
- . = ..()
-
-
-//Construction: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal
-/obj/item/melee/blood_magic/construction
- name = "Twisted Construction"
- desc = "Corrupts metal and plasteel into more sinister forms."
- invocation = "Ethra p'ni dedol!"
- color = "#000000" // black
-
-/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if(proximity_flag && iscultist(user))
- var/turf/T = get_turf(target)
- if(istype(target, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/candidate = target
- if(candidate.use(50))
- uses--
- to_chat(user, "A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!")
- new /obj/structure/constructshell(T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else
- to_chat(user, "You need 50 metal to produce a construct shell!")
- else if(istype(target, /obj/item/stack/sheet/plasteel))
- var/obj/item/stack/sheet/plasteel/candidate = target
- var/quantity = min(candidate.amount, uses)
- uses -= quantity
- new /obj/item/stack/sheet/runed_metal(T,quantity)
- candidate.use(quantity)
- to_chat(user, "A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!")
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else if(istype(target,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/candidate = target
- if(candidate.mmi)
- user.visible_message("A dark cloud eminates from [user]'s hand and swirls around [candidate]!")
- playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1)
- var/prev_color = candidate.color
- candidate.color = "black"
- if(do_after(user, 90, target = candidate))
- candidate.emp_act(EMP_HEAVY)
- var/construct_class = alert(user, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
- user.visible_message("The dark cloud receedes from what was formerly [candidate], revealing a\n [construct_class]!")
- switch(construct_class)
- if("Juggernaut")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, candidate, user, 0, T)
- if("Wraith")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T)
- if("Artificer")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, candidate, user, 0, T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- uses--
- candidate.mmi = null
- qdel(candidate)
- else
- candidate.color = prev_color
- else
- uses--
- to_chat(user, "A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!")
- new /obj/structure/constructshell(T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else if(istype(target,/obj/machinery/door/airlock))
- target.narsie_act()
- uses--
- user.visible_message("Black ribbons suddenly eminate from [user]'s hand and cling to the airlock - twisting and corrupting it!")
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else
- to_chat(user, "The spell will not work on [target]!")
- ..()
-
-//Armor: Gives the target a basic cultist combat loadout
-/obj/item/melee/blood_magic/armor
- name = "Sinister Armaments"
- desc = "A spell that will equip the target with cultist equipment if there is a slot to equip it to."
- color = "#33cc33" // green
-
-/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(iscarbon(target) && proximity)
- uses--
- var/mob/living/carbon/C = target
- C.visible_message("Otherworldly armor suddenly appears on [C]!")
- C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,slot_w_uniform)
- C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
- C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
- C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
- C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
- if(C == user)
- qdel(src) //Clears the hands
- C.put_in_hands(new /obj/item/melee/cultblade(user))
- C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
- ..()
-
-/obj/item/melee/blood_magic/manipulator
- name = "Blood Rite"
- desc = "A spell that will absorb blood from anything you touch.
Touching cultists and constructs can heal them.
Clicking the hand will potentially let you focus the spell into something stronger."
- color = "#7D1717"
-
-/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
- if(proximity)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(NOBLOOD in H.dna.species.species_traits)
- to_chat(user,"Blood rites do not work on species with no blood!")
- return
- if(iscultist(H))
- if(H.stat == DEAD)
- to_chat(user,"Only a revive rune can bring back the dead!")
- return
- if(H.blood_volume < BLOOD_VOLUME_SAFE)
- var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume
- if(uses*2 < restore_blood)
- H.blood_volume += uses*2
- to_chat(user,"You use the last of your blood rites to restore what blood you could!")
- uses = 0
- return ..()
- else
- H.blood_volume = BLOOD_VOLUME_SAFE
- uses -= round(restore_blood/2)
- to_chat(user,"Your blood rites have restored [H == user ? "your" : "their"] blood to safe levels!")
- var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss()
- if(overall_damage == 0)
- to_chat(user,"That cultist doesn't require healing!")
- else
- var/ratio = uses/overall_damage
- if(H == user)
- to_chat(user,"Your blood healing is far less efficient when used on yourself!")
- ratio *= 0.35 // Healing is half as effective if you can't perform a full heal
- uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal
- if(ratio>1)
- ratio = 1
- uses -= round(overall_damage)
- H.visible_message("[H] is fully healed by [H==user ? "their":"[H]'s"]'s blood magic!")
- else
- H.visible_message("[H] is partially healed by [H==user ? "their":"[H]'s"] blood magic.")
- uses = 0
- ratio *= -1
- H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
- H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0)
- H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0)
- H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0)
- H.updatehealth()
- playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25)
- new /obj/effect/temp_visual/cult/sparks(get_turf(H))
- user.Beam(H,icon_state="sendbeam",time=15)
- else
- if(H.stat == DEAD)
- to_chat(user,"Their blood has stopped flowing, you'll have to find another way to extract it.")
- return
- if(H.cultslurring)
- to_chat(user,"Their blood has been tainted by an even stronger form of blood magic, it's no use to us like this!")
- return
- if(H.blood_volume > BLOOD_VOLUME_SAFE)
- H.blood_volume -= 100
- uses += 50
- user.Beam(H,icon_state="drainbeam",time=10)
- playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50)
- H.visible_message("[user] has drained some of [H]'s blood!")
- to_chat(user,"Your blood rite gains 50 charges from draining [H]'s blood.")
- new /obj/effect/temp_visual/cult/sparks(get_turf(H))
- else
- to_chat(user,"They're missing too much blood - you cannot drain them further!")
- return
- if(isconstruct(target))
- var/mob/living/simple_animal/M = target
- var/missing = M.maxHealth - M.health
- if(missing)
- if(uses > missing)
- M.adjustHealth(-missing)
- M.visible_message("[M] is fully-healed by [user]'s blood magic!")
- uses -= missing
- else
- M.adjustHealth(-uses)
- M.visible_message("[M] is healed by [user]'sblood magic!")
- uses = 0
- playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25)
- user.Beam(M,icon_state="sendbeam",time=10)
- if(istype(target, /obj/effect/decal/cleanable/blood))
- blood_draw(target, user)
- ..()
-
-/obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user)
- var/temp = 0
- var/turf/T = get_turf(target)
- if(T)
- for(var/obj/effect/decal/cleanable/blood/B in view(T, 2))
- if(B.blood_state == "blood")
- if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam
- temp += 30
- else
- temp += max((B.bloodiness**2)/800,1)
- new /obj/effect/temp_visual/cult/turf/floor(get_turf(B))
- qdel(B)
- for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2))
- qdel(TH)
- var/obj/item/clothing/shoes/shoecheck = user.shoes
- if(shoecheck && shoecheck.bloody_shoes["blood"])
- temp += shoecheck.bloody_shoes["blood"]/20
- shoecheck.bloody_shoes["blood"] = 0
- if(temp)
- user.Beam(T,icon_state="drainbeam",time=15)
- new /obj/effect/temp_visual/cult/sparks(get_turf(user))
- playsound(T, 'sound/magic/enter_blood.ogg', 50)
- to_chat(user, "Your blood rite has gained [round(temp)] charge\s from blood sources around you!")
- uses += round(temp)
-
-/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
- if(iscultist(user))
- var/list/options = list("Blood Spear (200)", "Blood Bolt Barrage (400)", "Blood Beam (600)")
- var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options
- if(!choice)
- to_chat(user, "You decide against conducting a greater blood rite.")
- return
- switch(choice)
- if("Blood Spear (200)")
- if(uses < 200)
- to_chat(user, "You need 200 charges to perform this rite.")
- else
- uses -= 200
- var/turf/T = get_turf(user)
- qdel(src)
- var/datum/action/innate/cult/spear/S = new(user)
- var/obj/item/twohanded/cult_spear/rite = new(T)
- S.Grant(user, rite)
- rite.spear_act = S
- if(user.put_in_hands(rite))
- to_chat(user, "A [rite.name] appears in your hand!")
- else
- user.visible_message("A [rite.name] appears at [user]'s feet!", \
- "A [rite.name] materializes at your feet.")
- if("Blood Bolt Barrage (400)")
- if(uses < 400)
- to_chat(user, "You need 400 charges to perform this rite.")
- else
- var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
- uses -= 400
- qdel(src)
- if(user.put_in_hands(rite))
- to_chat(user, "Your hands glow with power!")
- else
- to_chat(user, "You need a free hand for this rite!")
- qdel(rite)
- if("Blood Beam (600)")
- if(uses < 600)
- to_chat(user, "You need 600 charges to perform this rite.")
- else
- var/obj/rite = new /obj/item/blood_beam()
- uses -= 600
- qdel(src)
- if(user.put_in_hands(rite))
- to_chat(user, "Your hands glow with POWER OVERWHELMING!!!")
- else
- to_chat(user, "You need a free hand for this rite!")
- qdel(rite)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 5d87f65537..048cac8326 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -29,6 +29,7 @@
var/datum/mind/clonemind
var/grab_ghost_when = CLONER_MATURE_CLONE
+ var/internal_radio = TRUE
var/obj/item/device/radio/radio
var/radio_key = /obj/item/device/encryptionkey/headset_med
var/radio_channel = "Medical"
@@ -38,24 +39,17 @@
var/list/unattached_flesh
var/flesh_number = 0
- // The "brine" is the reagents that are automatically added in small
- // amounts to the occupant.
- var/static/list/brine_types = list(
- "salbutamol", // anti-oxyloss
- "bicaridine", // NOBREATHE species take brute in crit
- "corazone", // prevents cardiac arrest and liver failure damage
- "mimesbane", // stops them gasping from lack of air.
- "mutetoxin") // stops them from killing themselves BY DEATHWHISPERING INSIDE A CLONE POD NICE JOB BREAKING IT HERO
/obj/machinery/clonepod/Initialize()
. = ..()
countdown = new(src)
- radio = new(src)
- radio.keyslot = new radio_key
- radio.subspace_transmission = TRUE
- radio.canhear_range = 0
- radio.recalculateChannels()
+ if(internal_radio)
+ radio = new(src)
+ radio.keyslot = new radio_key
+ radio.subspace_transmission = TRUE
+ radio.canhear_range = 0
+ radio.recalculateChannels()
/obj/machinery/clonepod/Destroy()
go_out()
@@ -116,7 +110,7 @@
/obj/machinery/clonepod/return_air()
// We want to simulate the clone not being in contact with
// the atmosphere, so we'll put them in a constant pressure
- // nitrogen. They'll breathe through the chemicals we pump into them.
+ // nitrogen. They don't need to breathe while cloning anyway.
var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods
if(!GM)
GM = new
@@ -184,7 +178,11 @@
icon_state = "pod_1"
//Get the clone body ready
maim_clone(H)
- check_brine() // put in chemicals NOW to stop death via cardiac arrest
+ H.add_trait(TRAIT_STABLEHEART, "cloning")
+ H.add_trait(TRAIT_EMOTEMUTE, "cloning")
+ H.add_trait(TRAIT_MUTE, "cloning")
+ H.add_trait(TRAIT_NOBREATH, "cloning")
+ H.add_trait(TRAIT_NOCRITDAMAGE, "cloning")
H.Unconscious(80)
clonemind.transfer_to(H)
@@ -219,8 +217,9 @@
else if(mob_occupant && (mob_occupant.loc == src))
if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
connected_message("Clone Rejected: Deceased.")
- SPEAK("The cloning of [mob_occupant.real_name] has been \
- aborted due to unrecoverable tissue failure.")
+ if(internal_radio)
+ SPEAK("The cloning of [mob_occupant.real_name] has been \
+ aborted due to unrecoverable tissue failure.")
go_out()
mob_occupant.apply_vore_prefs()
@@ -248,13 +247,12 @@
//Premature clones may have brain damage.
mob_occupant.adjustBrainLoss(-((speed_coeff / 2) * dmg_mult))
- check_brine()
-
use_power(7500) //This might need tweaking.
else if((mob_occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
- SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
+ if(internal_radio)
+ SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.")
// If the cloner is upgraded to debugging high levels, sometimes
// organs and limbs can be missing.
@@ -356,6 +354,11 @@
if(!mob_occupant)
return
+ mob_occupant.remove_trait(TRAIT_STABLEHEART, "cloning")
+ mob_occupant.remove_trait(TRAIT_EMOTEMUTE, "cloning")
+ mob_occupant.remove_trait(TRAIT_MUTE, "cloning")
+ mob_occupant.remove_trait(TRAIT_NOCRITDAMAGE, "cloning")
+ mob_occupant.remove_trait(TRAIT_NOBREATH, "cloning")
if(grab_ghost_when == CLONER_MATURE_CLONE)
mob_occupant.grab_ghost()
@@ -440,7 +443,7 @@
// brain function, they also have no limbs or internal organs.
- if(!NODISMEMBER in H.dna.species.species_traits)
+ if(!H.has_trait(TRAIT_NODISMEMBER))
var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
for(var/zone in zones)
var/obj/item/bodypart/BP = H.get_bodypart(zone)
@@ -459,15 +462,6 @@
flesh_number = unattached_flesh.len
-/obj/machinery/clonepod/proc/check_brine()
- // Clones are in a pickled bath of mild chemicals, keeping
- // them alive, despite their lack of internal organs
- for(var/bt in brine_types)
- if(bt == "corazone" && occupant.reagents.get_reagent_amount(bt) < 2)
- occupant.reagents.add_reagent(bt, 2)//pump it full of extra corazone as a safety, you can't OD on corazone.
- else if(occupant.reagents.get_reagent_amount(bt) < 1)
- occupant.reagents.add_reagent(bt, 1)
-
/*
* Manual -- A big ol' manual.
*/
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index de0089d5c6..3b6113e67b 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -81,7 +81,7 @@
if(connected && connected.is_operational())
if(connected.occupant) //set occupant_status message
viable_occupant = connected.occupant
- if(viable_occupant.has_dna() && (!(RADIMMUNE in viable_occupant.dna.species.species_traits)) && (!(viable_occupant.has_trait(TRAIT_NOCLONE)) || (connected.scan_level == 3))) //occupant is viable for dna modification
+ if(viable_occupant.has_dna() && !viable_occupant.has_trait(TRAIT_RADIMMUNE) && !viable_occupant.has_trait(TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
occupant_status += "[viable_occupant.name] => "
switch(viable_occupant.stat)
if(CONSCIOUS)
@@ -528,7 +528,7 @@
var/mob/living/carbon/viable_occupant = null
if(connected)
viable_occupant = connected.occupant
- if(!istype(viable_occupant) || !viable_occupant.dna || (RADIMMUNE in viable_occupant.dna.species.species_traits) || (viable_occupant.has_trait(TRAIT_NOCLONE)))
+ if(!istype(viable_occupant) || !viable_occupant.dna || viable_occupant.has_trait(TRAIT_RADIMMUNE) || viable_occupant.has_trait(TRAIT_NOCLONE))
viable_occupant = null
return viable_occupant
diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm
new file mode 100644
index 0000000000..27618668fa
--- /dev/null
+++ b/code/game/machinery/exp_cloner.dm
@@ -0,0 +1,297 @@
+//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead
+/obj/machinery/clonepod/experimental
+ name = "experimental cloning pod"
+ desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations."
+ icon = 'icons/obj/machines/cloning.dmi'
+ icon_state = "pod_0"
+ req_access = null
+ circuit = /obj/item/circuitboard/machine/clonepod/experimental
+ internal_radio = FALSE
+
+//Start growing a human clone in the pod!
+/obj/machinery/clonepod/experimental/growclone(clonename, ui, se, datum/species/mrace, list/features, factions)
+ if(panel_open)
+ return FALSE
+ if(mess || attempting)
+ return FALSE
+
+ attempting = TRUE //One at a time!!
+ countdown.start()
+
+ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
+
+ H.hardset_dna(ui, se, H.real_name, null, mrace, features)
+
+ if(efficiency > 2)
+ var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
+ H.dna.remove_mutation_group(unclean_mutations)
+ if(efficiency > 5 && prob(20))
+ H.randmutvg()
+ if(efficiency < 3 && prob(50))
+ var/mob/M = H.randmutb()
+ if(ismob(M))
+ H = M
+
+ H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
+ occupant = H
+
+ if(!clonename) //to prevent null names
+ clonename = "clone ([rand(0,999)])"
+ H.real_name = clonename
+
+ icon_state = "pod_1"
+ //Get the clone body ready
+ maim_clone(H)
+ H.add_trait(TRAIT_STABLEHEART, "cloning")
+ H.add_trait(TRAIT_EMOTEMUTE, "cloning")
+ H.add_trait(TRAIT_MUTE, "cloning")
+ H.add_trait(TRAIT_NOBREATH, "cloning")
+ H.add_trait(TRAIT_NOCRITDAMAGE, "cloning")
+ H.Unconscious(80)
+
+ var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H)
+ if(LAZYLEN(candidates))
+ var/mob/dead/observer/C = pick(candidates)
+ H.key = C.key
+
+ if(grab_ghost_when == CLONER_FRESH_CLONE)
+ H.grab_ghost()
+ to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?")
+
+ if(grab_ghost_when == CLONER_MATURE_CLONE)
+ H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
+ to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")
+
+ if(H)
+ H.faction |= factions
+
+ H.set_cloned_appearance()
+
+ H.suiciding = FALSE
+ attempting = FALSE
+ return TRUE
+
+
+//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks.
+/obj/machinery/computer/prototype_cloning
+ name = "prototype cloning console"
+ desc = "Used to operate an experimental cloner."
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
+ circuit = /obj/item/circuitboard/computer/prototype_cloning
+ var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
+ var/list/pods //Linked experimental cloning pods
+ var/temp = "Inactive"
+ var/scantemp = "Ready to Scan"
+ var/loading = FALSE // Nice loading text
+
+ light_color = LIGHT_COLOR_BLUE
+
+/obj/machinery/computer/prototype_cloning/Initialize()
+ . = ..()
+ updatemodules(TRUE)
+
+/obj/machinery/computer/prototype_cloning/Destroy()
+ if(pods)
+ for(var/P in pods)
+ DetachCloner(P)
+ pods = null
+ return ..()
+
+/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null)
+ if(pods)
+ for(var/P in pods)
+ var/obj/machinery/clonepod/experimental/pod = P
+ if(pod.is_operational() && !(pod.occupant || pod.mess))
+ return pod
+
+/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner)
+ scanner = findscanner()
+ if(findfirstcloner && !LAZYLEN(pods))
+ findcloner()
+
+/obj/machinery/computer/prototype_cloning/proc/findscanner()
+ var/obj/machinery/dna_scannernew/scannerf = null
+
+ // Loop through every direction
+ for(var/direction in GLOB.cardinals)
+ // Try to find a scanner in that direction
+ scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
+ // If found and operational, return the scanner
+ if (!isnull(scannerf) && scannerf.is_operational())
+ return scannerf
+
+ // If no scanner was found, it will return null
+ return null
+
+/obj/machinery/computer/prototype_cloning/proc/findcloner()
+ var/obj/machinery/clonepod/experimental/podf = null
+ for(var/direction in GLOB.cardinals)
+ podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction))
+ if (!isnull(podf) && podf.is_operational())
+ AttachCloner(podf)
+
+/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod)
+ if(!pod.connected)
+ pod.connected = src
+ LAZYADD(pods, pod)
+
+/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod)
+ pod.connected = null
+ LAZYREMOVE(pods, pod)
+
+/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ var/obj/item/device/multitool/P = W
+
+ if(istype(P.buffer, /obj/machinery/clonepod/experimental))
+ if(get_area(P.buffer) != get_area(src))
+ to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-")
+ P.buffer = null
+ return
+ to_chat(user, "-% Successfully linked [P.buffer] with [src] %-")
+ var/obj/machinery/clonepod/experimental/pod = P.buffer
+ if(pod.connected)
+ pod.connected.DetachCloner(pod)
+ AttachCloner(pod)
+ else
+ P.buffer = src
+ to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-")
+ return
+ else
+ return ..()
+
+/obj/machinery/computer/prototype_cloning/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/computer/prototype_cloning/interact(mob/user)
+ user.set_machine(src)
+ add_fingerprint(user)
+
+ if(..())
+ return
+
+ updatemodules(TRUE)
+
+ var/dat = ""
+ dat += "Refresh"
+
+ dat += "Cloning Pod Status
"
+ dat += "[temp]
"
+
+ if (isnull(src.scanner) || !LAZYLEN(pods))
+ dat += "Modules
"
+ //dat += "Reload Modules"
+ if (isnull(src.scanner))
+ dat += "ERROR: No Scanner detected!
"
+ if (!LAZYLEN(pods))
+ dat += "ERROR: No Pod detected
"
+
+ // Scan-n-Clone
+ if (!isnull(src.scanner))
+ var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant)
+
+ dat += "Cloning
"
+
+ dat += ""
+ if(!scanner_occupant)
+ dat += "Scanner Unoccupied"
+ else if(loading)
+ dat += "[scanner_occupant] => Scanning..."
+ else
+ scantemp = "Ready to Clone"
+ dat += "[scanner_occupant] => [scantemp]"
+ dat += "
"
+
+ if(scanner_occupant)
+ dat += "Clone"
+ dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]"
+ else
+ dat += "Clone"
+
+ var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control")
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+
+/obj/machinery/computer/prototype_cloning/Topic(href, href_list)
+ if(..())
+ return
+
+ if(loading)
+ return
+
+ else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational())
+ scantemp = ""
+
+ loading = TRUE
+ updateUsrDialog()
+ playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
+ say("Initiating scan...")
+
+ spawn(20)
+ clone_occupant(scanner.occupant)
+ loading = FALSE
+ updateUsrDialog()
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+ //No locking an open scanner.
+ else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational())
+ if ((!scanner.locked) && (scanner.occupant))
+ scanner.locked = TRUE
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else
+ scanner.locked = FALSE
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
+
+ else if (href_list["refresh"])
+ updateUsrDialog()
+ playsound(src, "terminal_type", 25, 0)
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant)
+ var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
+ var/datum/dna/dna
+ if(ishuman(mob_occupant))
+ var/mob/living/carbon/C = mob_occupant
+ dna = C.has_dna()
+ if(isbrain(mob_occupant))
+ var/mob/living/brain/B = mob_occupant
+ dna = B.stored_dna
+
+ if(!istype(dna))
+ scantemp = "Unable to locate valid genetic data."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ return
+ if((mob_occupant.has_trait(TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
+ scantemp = "Subject no longer contains the fundamental materials required to create a living clone."
+ playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ return
+
+ var/clone_species
+ if(dna.species)
+ clone_species = dna.species
+ else
+ var/datum/species/rando_race = pick(GLOB.roundstart_races)
+ clone_species = rando_race.type
+
+ var/obj/machinery/clonepod/pod = GetAvailablePod()
+ //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
+ if(!LAZYLEN(pods))
+ temp = "No Clonepods detected."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(!pod)
+ temp = "No Clonepods available."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else if(pod.occupant)
+ temp = "Cloning cycle already in progress."
+ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+ else
+ pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.struc_enzymes, clone_species, dna.features, mob_occupant.faction)
+ temp = "[mob_occupant.real_name] => Cloning data sent to pod."
+ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
\ No newline at end of file
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 264f773b89..bce12597ab 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -26,7 +26,6 @@ Possible to do for anyone motivated enough:
#define HOLOPAD_PASSIVE_POWER_USAGE 1
#define HOLOGRAM_POWER_USAGE 2
-#define HOLOPAD_MODE RANGE_BASED
/obj/machinery/holopad
name = "holopad"
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 3e29a6f07e..b9dcbbfd03 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -370,15 +370,21 @@
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3)
else
occupant.clear_alert("mech damage")
- var/actual_loc = occupant.loc
- if(istype(actual_loc, /obj/item/device/mmi))
- var/obj/item/device/mmi/M = actual_loc
- actual_loc = M.mecha
- if(actual_loc != src) //something went wrong
- occupant.clear_alert("charge")
- occupant.clear_alert("mech damage")
- RemoveActions(occupant, human_occupant=1)
- occupant = null
+ var/atom/checking = occupant.loc
+ // recursive check to handle all cases regarding very nested occupants,
+ // such as brainmob inside brainitem inside MMI inside mecha
+ while (!isnull(checking))
+ if (isturf(checking))
+ // hit a turf before hitting the mecha, seems like they have
+ // been moved out
+ occupant.clear_alert("charge")
+ occupant.clear_alert("mech damage")
+ RemoveActions(occupant, human_occupant=1)
+ occupant = null
+ break
+ else if (checking == src)
+ break // all good
+ checking = checking.loc
if(lights)
var/lights_energy_drain = 2
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index f1c18f50a6..f23f13cca4 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -19,7 +19,7 @@
if(LAZYLEN(diseases))
var/list/datum/disease/diseases_to_add = list()
for(var/datum/disease/D in diseases)
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)
diseases_to_add += D
if(LAZYLEN(diseases_to_add))
AddComponent(/datum/component/infective, diseases_to_add)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4267f69657..0cd102cb5a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
can_handle_hot = TRUE
else if(C.gloves && (C.gloves.max_heat_protection_temperature > 360))
can_handle_hot = TRUE
- else if(RESISTHOT in C.dna.species.species_traits)
+ else if(C.has_trait(TRAIT_RESISTHEAT))
can_handle_hot = TRUE
if(can_handle_hot)
@@ -674,6 +674,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
return 0
/obj/item/attack_animal(mob/living/simple_animal/M)
+ if (obj_flags & CAN_BE_HIT)
+ return ..()
return 0
/obj/item/mech_melee_attack(obj/mecha/M)
@@ -820,4 +822,4 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped
/obj/item/proc/get_part_rating()
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 24038d9c69..f3c047715e 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -111,6 +111,10 @@
name = "Cloning (Computer Board)"
build_path = /obj/machinery/computer/cloning
+/obj/item/circuitboard/computer/prototype_cloning
+ name = "Prototype Cloning (Computer Board)"
+ build_path = /obj/machinery/computer/prototype_cloning
+
/obj/item/circuitboard/computer/arcade/battle
name = "Arcade Battle (Computer Board)"
build_path = /obj/machinery/computer/arcade/battle
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index bb0357b4b1..5fc4bf7068 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -31,6 +31,10 @@
/obj/item/stock_parts/manipulator = 2,
/obj/item/stack/sheet/glass = 1)
+/obj/item/circuitboard/machine/clonepod/experimental
+ name = "Experimental Clone Pod (Machine Board)"
+ build_path = /obj/machinery/clonepod/experimental
+
/obj/item/circuitboard/machine/abductor
name = "alien board (Report This)"
icon_state = "abductor_mod"
diff --git a/code/citadel/dogborgstuff.dm b/code/game/objects/items/devices/dogborg_sleeper.dm
similarity index 56%
rename from code/citadel/dogborgstuff.dm
rename to code/game/objects/items/devices/dogborg_sleeper.dm
index daafd135f6..217786f142 100644
--- a/code/citadel/dogborgstuff.dm
+++ b/code/game/objects/items/devices/dogborg_sleeper.dm
@@ -1,306 +1,4 @@
-/obj/item/dogborg/jaws/big
- name = "combat jaws"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "jaws"
- desc = "The jaws of the law."
- flags_1 = CONDUCT_1
- force = 12
- throwforce = 0
- hitsound = 'sound/weapons/bite.ogg'
- attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
- w_class = 3
- sharpness = IS_SHARP
-
-/obj/item/dogborg/jaws/small
- name = "puppy jaws"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "smalljaws"
- desc = "The jaws of a small dog."
- flags_1 = CONDUCT_1
- force = 6
- throwforce = 0
- hitsound = 'sound/weapons/bite.ogg'
- attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
- w_class = 3
- sharpness = IS_SHARP
-
-/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
- ..()
- user.do_attack_animation(A, ATTACK_EFFECT_BITE)
-
-/obj/item/dogborg/jaws/small/attack_self(mob/user)
- var/mob/living/silicon/robot.R = user
- if(R.emagged)
- name = "combat jaws"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "jaws"
- desc = "The jaws of the law."
- flags_1 = CONDUCT_1
- force = 12
- throwforce = 0
- hitsound = 'sound/weapons/bite.ogg'
- attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
- w_class = 3
- sharpness = IS_SHARP
- else
- name = "puppy jaws"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "smalljaws"
- desc = "The jaws of a small dog."
- flags_1 = CONDUCT_1
- force = 5
- throwforce = 0
- hitsound = 'sound/weapons/bite.ogg'
- attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
- w_class = 3
- sharpness = IS_SHARP
- update_icon()
-
-
-//Cuffs
-
-/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
- if(!C.handcuffed)
- playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2)
- C.visible_message("[user] is trying to put zipties on [C]!", \
- "[user] is trying to put zipties on [C]!")
- if(do_mob(user, C, 60))
- if(!C.handcuffed)
- C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
- C.update_inv_handcuffed(0)
- to_chat(user,"You handcuff [C].")
- playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
- add_logs(user, C, "handcuffed")
- else
- to_chat(user,"You fail to handcuff [C]!")
-
-
-//Boop
-
-/obj/item/device/analyzer/nose
- name = "boop module"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "nose"
- desc = "The BOOP module"
- flags_1 = CONDUCT_1
- force = 0
- throwforce = 0
- attack_verb = list("nuzzled", "nosed", "booped")
- w_class = 1
-
-/obj/item/device/analyzer/nose/attack_self(mob/user)
- user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.")
-
- var/turf/location = user.loc
- if(!istype(location))
- return
-
- var/datum/gas_mixture/environment = location.return_air()
-
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles()
-
- to_chat(user, "Results:")
- if(abs(pressure - ONE_ATMOSPHERE) < 10)
- to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
- else
- to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
- if(total_moles)
- var/list/env_gases = environment.gases
-
- environment.assert_gases(arglist(GLOB.hardcoded_gases))
- var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles
- var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles
- var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles
- var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles
- environment.garbage_collect()
-
- if(abs(n2_concentration - N2STANDARD) < 20)
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
- else
- to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
-
- if(abs(o2_concentration - O2STANDARD) < 2)
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
- else
- to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
-
- if(co2_concentration > 0.01)
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
- else
- to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
-
- if(plasma_concentration > 0.005)
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
- else
- to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
-
-
- for(var/id in env_gases)
- if(id in GLOB.hardcoded_gases)
- continue
- var/gas_concentration = env_gases[id][MOLES]/total_moles
- to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %")
- to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C")
-
-/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens
- . = ..()
-
-//Delivery
-
-/obj/item/storage/bag/borgdelivery
- name = "fetching storage"
- desc = "Fetch the thing!"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "dbag"
- //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm)
- w_class = 5
- max_w_class = 2
- max_combined_w_class = 2
- storage_slots = 1
- collection_mode = 0
- can_hold = list() // any
- cant_hold = list(/obj/item/disk/nuclear)
-
-
-//Tongue stuff
-
-/obj/item/soap/tongue
- name = "synthetic tongue"
- desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "synthtongue"
- hitsound = 'sound/effects/attackblob.ogg'
- cleanspeed = 80
-
-/obj/item/soap/tongue/scrubpup
- cleanspeed = 25 //slightly faster than a mop.
-
-/obj/item/soap/tongue/New()
- ..()
- flags_1 |= NOBLUDGEON_1 //No more attack messages
-
-/obj/item/trash/rkibble
- name = "robo kibble"
- desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge."
- icon = 'icons/mob/dogborg.dmi'
- icon_state= "kibble"
-
-/obj/item/soap/tongue/attack_self(mob/user)
- var/mob/living/silicon/robot.R = user
- if(R.emagged)
- name = "hacked tongue of doom"
- desc = "Your tongue has been upgraded successfully. Congratulations."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "syndietongue"
- cleanspeed = 10 //(nerf'd)tator soap stat
- else
- name = "synthetic tongue"
- desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "synthtongue"
- cleanspeed = initial(cleanspeed)
- update_icon()
-
-/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
- var/mob/living/silicon/robot.R = user
- if(!proximity || !check_allowed_items(target))
- return
- if(R.client && (target in R.client.screen))
- to_chat(R, "You need to take that [target.name] off before cleaning it!")
- else if(is_cleanable(target))
- R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...")
- if(do_after(R, src.cleanspeed, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't eat them.
- to_chat(R, "You finish licking off \the [target.name].")
- qdel(target)
- R.cell.give(50)
- else if(isobj(target)) //hoo boy. danger zone man
- if(istype(target,/obj/item/trash))
- R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...")
- if(do_after(R, src.cleanspeed, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't eat them.
- to_chat(R, "You finish off \the [target.name].")
- qdel(target)
- R.cell.give(250)
- return
- if(istype(target,/obj/item/stock_parts/cell))
- R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...")
- if(do_after(R, 50, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't eat them.
- to_chat(R, "You finish off \the [target.name].")
- var/obj/item/stock_parts/cell.C = target
- R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
- qdel(target)
- return
- var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT
- if(!I.anchored && R.emagged)
- R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...")
- if(do_after(R, 100, target = I)) //Nerf dat time yo
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
- return //If they moved away, you can't eat them.
- visible_message("[R] chews up \the [target.name] and cleans off the debris!")
- to_chat(R, "You finish off \the [target.name].")
- qdel(I)
- R.cell.give(500)
- return
- R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
- if(do_after(R, src.cleanspeed, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't clean them.
- to_chat(R,"You clean \the [target.name].")
- var/obj/effect/decal/cleanable/C = locate() in target
- qdel(C)
- SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- else if(ishuman(target))
- if(R.emagged)
- var/mob/living/L = target
- if(R.cell.charge <= 666)
- return
- L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
- L.Knockdown(80)
- L.apply_effect(STUTTER, 4)
- L.visible_message("[R] has shocked [L] with its tongue!", \
- "[R] has shocked you with its tongue! You can feel the betrayal.")
- playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
- R.cell.use(666)
- else
- R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!")
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- return
- else if(istype(target, /obj/structure/window))
- R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
- if(do_after(R, src.cleanspeed, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't clean them.
- to_chat(R, "You clean \the [target.name].")
- target.color = initial(target.color)
- else
- R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
- if(do_after(R, src.cleanspeed, target = target))
- if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
- return //If they moved away, you can't clean them.
- to_chat(R, "You clean \the [target.name].")
- var/obj/effect/decal/cleanable/C = locate() in target
- qdel(C)
- SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- return
-
-
-
-//Defibs
-
-/obj/item/twohanded/shockpaddles/cyborg/hound
- name = "defibrillator paws"
- desc = "MediHound specific shock paws."
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "defibpaddles0"
- item_state = "defibpaddles0"
-
-//Sleeper
+// Dogborg Sleeper units
/obj/item/device/dogborg/sleeper
name = "hound sleeper"
@@ -361,6 +59,9 @@
return
if(!iscarbon(target))
return
+ if(!(target.client && target.client.prefs && target.client.prefs.toggles && (target.client.prefs.toggles & MEDIHOUND_SLEEPER)))
+ to_chat(user, "This person is incompatible with our equipment.")
+ return
if(target.buckled)
to_chat(user, "The user is buckled and can not be put into your [src.name].")
return
@@ -605,6 +306,12 @@
playsound(get_turf(hound),"death_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
T.stop_sound_channel(CHANNEL_PRED)
T.playsound_local("death_prey",60)
+ for(var/belly in T.vore_organs)
+ var/obj/belly/B = belly
+ for(var/atom/movable/thing in B)
+ thing.forceMove(src)
+ if(ismob(thing))
+ to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]")
for(var/obj/item/W in T)
if(!T.dropItemToGround(W))
qdel(W)
@@ -790,101 +497,4 @@
user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
return
- return
-
-
-// Pounce stuff for K-9
-
-/obj/item/dogborg/pounce
- name = "pounce"
- icon = 'icons/mob/dogborg.dmi'
- icon_state = "pounce"
- desc = "Leap at your target to momentarily stun them."
- force = 0
- throwforce = 0
-
-/obj/item/dogborg/pounce/New()
- ..()
- flags_1 |= NOBLUDGEON_1
-
-/mob/living/silicon/robot
- var/leaping = 0
- var/pounce_cooldown = 0
- var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
- var/pounce_spoolup = 3
- var/leap_at
- var/disabler
- var/laser
- var/sleeper_g
- var/sleeper_r
-
-#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
-
-/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
- var/mob/living/silicon/robot/R = user
- if(R && !R.pounce_cooldown)
- R.pounce_cooldown = !R.pounce_cooldown
- to_chat(R, "Your targeting systems lock on to [A]...")
- addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup)
- spawn(R.pounce_cooldown_time)
- R.pounce_cooldown = !R.pounce_cooldown
- else if(R && R.pounce_cooldown)
- to_chat(R, "Your leg actuators are still recharging!")
-
-/mob/living/silicon/robot/proc/leap_at(atom/A)
- if(leaping || stat || buckled || lying)
- return
-
- if(!has_gravity(src) || !has_gravity(A))
- to_chat(src,"It is unsafe to leap without gravity!")
- //It's also extremely buggy visually, so it's balance+bugfix
- return
-
- if(cell.charge <= 500)
- to_chat(src,"Insufficent reserves for jump actuators!")
- return
-
- else
- leaping = 1
- weather_immunities += "lava"
- pixel_y = 10
- update_icons()
- throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
- cell.use(500) //Doubled the energy consumption
- weather_immunities -= "lava"
-
-/mob/living/silicon/robot/throw_impact(atom/A)
-
- if(!leaping)
- return ..()
-
- if(A)
- if(isliving(A))
- var/mob/living/L = A
- var/blocked = 0
- if(ishuman(A))
- var/mob/living/carbon/human/H = A
- if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
- blocked = 1
- if(!blocked)
- L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Knockdown(45)
- playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
- sleep(2)//Runtime prevention (infinite bump() calls on hulks)
- step_towards(src,L)
- else
- Knockdown(45, 1, 1)
-
- pounce_cooldown = !pounce_cooldown
- spawn(pounce_cooldown_time) //3s by default
- pounce_cooldown = !pounce_cooldown
- else if(A.density && !A.CanPass(src))
- visible_message("[src] smashes into [A]!", "You smash into [A]!")
- playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
- Knockdown(45, 1, 1)
-
- if(leaping)
- leaping = 0
- pixel_y = initial(pixel_y)
- update_icons()
- update_canmove()
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index eb1ccd15f4..2e65a6c108 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -67,9 +67,12 @@
if (!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this!")
return
+ if(user.has_trait(TRAIT_NOGUNS))
+ to_chat(user, "Your fingers can't press the button!")
+ return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.dna.check_mutation(HULK) || (NOGUNS in H.dna.species.species_traits))
+ if(H.dna.check_mutation(HULK))
to_chat(user, "Your fingers can't press the button!")
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 05264aaa5a..6488b4e001 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -262,7 +262,7 @@ GAS ANALYZER
if(tdelta < (DEFIB_TIME_LIMIT * 10))
to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!")
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]")
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index c908b619c4..0e8c82d963 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -31,7 +31,7 @@
/obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user)
prepare()
- if(M.has_dna() && !(RADIMMUNE in M.dna.species.species_traits) && !(M.has_trait(TRAIT_NOCLONE)))
+ if(M.has_dna() && !M.has_trait(TRAIT_RADIMMUNE) && !M.has_trait(TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]"
for(var/datum/mutation/human/HM in remove_mutations)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index ae73824899..fba0c1b1a2 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -274,13 +274,14 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm"
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(!H.gloves && !(PIERCEIMMUNE in H.dna.species.species_traits)) // golems, etc
+ if(!H.gloves && !H.has_trait(TRAIT_PIERCEIMMUNE)) // golems, etc
to_chat(H, "[src] cuts into your hand!")
H.apply_damage(force*0.5, BRUTE, hit_hand)
else if(ismonkey(user))
var/mob/living/carbon/monkey/M = user
- to_chat(M, "[src] cuts into your hand!")
- M.apply_damage(force*0.5, BRUTE, hit_hand)
+ if(!M.has_trait(TRAIT_PIERCEIMMUNE))
+ to_chat(M, "[src] cuts into your hand!")
+ M.apply_damage(force*0.5, BRUTE, hit_hand)
/obj/item/shard/attackby(obj/item/I, mob/user, params)
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index 1c5250dcf2..2a17e0038c 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -11,8 +11,7 @@
new /obj/item/clothing/under/shorts/red(src)
new /obj/item/clothing/under/shorts/blue(src)
new /obj/item/clothing/under/shorts/green(src)
- if(prob(3))
- new /obj/item/clothing/under/jabroni(src)
+ new /obj/item/clothing/under/jabroni(src)
/obj/structure/closet/boxinggloves
@@ -63,4 +62,4 @@
new /obj/item/gun/energy/laser/bluetag(src)
for(var/i in 1 to 3)
new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/head/helmet/bluetaghelm(src)
+ new /obj/item/clothing/head/helmet/bluetaghelm(src)
\ No newline at end of file
diff --git a/code/game/skincmd.dm b/code/game/skincmd.dm
deleted file mode 100644
index ad2f97f55a..0000000000
--- a/code/game/skincmd.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/mob/var/skincmds = list()
-/obj/proc/SkinCmd(mob/user as mob, var/data as text)
-
-/proc/SkinCmdRegister(mob/user, name as text, obj/O)
- user.skincmds[name] = O
-
-/mob/verb/skincmd(data as text)
- set hidden = 1
-
- var/ref = copytext(data, 1, findtext(data, ";"))
- if (src.skincmds[ref] != null)
- var/obj/a = src.skincmds[ref]
- a.SkinCmd(src, copytext(data, findtext(data, ";") + 1))
\ No newline at end of file
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index da1f941ccc..bcd597424d 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -269,9 +269,6 @@
if(TURF_WET_PERMAFROST)
intensity = 120
lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP
- if(TURF_WET_SLIDE)
- intensity = 80
- lube_flags = SLIDE | GALOSHES_DONT_HELP
else
qdel(GetComponent(/datum/component/slippery))
return
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 2414c55528..c915816ed0 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -42,9 +42,6 @@ GLOBAL_PROTECT(admin_ranks)
/datum/admin_rank/vv_edit_var(var_name, var_value)
return FALSE
-#if DM_VERSION > 512
-#error remove the rejuv keyword from this proc
-#endif
/proc/admin_keyword_to_flag(word, previous_rights=0)
var/flag = 0
switch(ckey(word))
@@ -80,9 +77,6 @@ GLOBAL_PROTECT(admin_ranks)
flag = R_AUTOLOGIN
if("@","prev")
flag = previous_rights
- if("rejuv","rejuvinate")
- stack_trace("Legacy keyword rejuvinate used defaulting to R_ADMIN")
- flag = R_ADMIN
return flag
/proc/admin_keyword_to_path(word) //use this with verb keywords eg +/client/proc/blah
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 51cfdbe529..85811f693c 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/smite
))
GLOBAL_PROTECT(admin_verbs_spawn)
-GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /client/proc/respawn_character))
+GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_server)
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/world/proc/AVerbsServer()
@@ -589,14 +589,17 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/give_disease(mob/T in GLOB.mob_list)
+/client/proc/give_disease(mob/living/T in GLOB.mob_living_list)
set category = "Fun"
set name = "Give Disease"
set desc = "Gives a Disease to a mob."
+ if(!istype(T))
+ to_chat(src, "You can only give a disease to a mob of type /mob/living.")
+ return
var/datum/disease/D = input("Choose the disease to give to that guy", "ACHOO") as null|anything in SSdisease.diseases
if(!D)
return
- T.ForceContractDisease(new D)
+ T.ForceContractDisease(new D, FALSE, TRUE)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].")
message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].")
diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm
new file mode 100644
index 0000000000..f51f776d6f
--- /dev/null
+++ b/code/modules/admin/verbs/spawnobjasmob.dm
@@ -0,0 +1,70 @@
+/datum/admins/proc/spawn_objasmob(object as text)
+ set category = "Debug"
+ set desc = "(obj path) Spawn object-mob"
+ set name = "Spawn object-mob"
+
+ if(!check_rights(R_SPAWN))
+ return
+
+ var/chosen = pick_closest_path(object, make_types_fancy(subtypesof(/obj)))
+
+ if (!chosen)
+ return
+
+ var/mob/living/simple_animal/hostile/mimic/copy/basemob = /mob/living/simple_animal/hostile/mimic/copy
+
+ var/obj/chosen_obj = text2path(chosen)
+
+ var/list/settings = list(
+ "mainsettings" = list(
+ "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"),
+ "maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100),
+ "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"),
+ "objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"),
+ "googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"),
+ "disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"),
+ "idledamage" = list("desc" = "Damaged while idle", "type" = "boolean", "value" = "No"),
+ "dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"),
+ "mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"),
+ "ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"),
+ )
+ )
+
+ var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings)
+ if (prefreturn["button"] == 1)
+ settings = prefreturn["settings"]
+ var/mainsettings = settings["mainsettings"]
+ chosen_obj = text2path(mainsettings["objtype"]["value"])
+
+ basemob = text2path(mainsettings["mobtype"]["value"])
+ if (!ispath(basemob, /mob/living/simple_animal/hostile/mimic/copy) || !ispath(chosen_obj, /obj))
+ to_chat(usr, "Mob or object path invalid")
+
+ basemob = new basemob(get_turf(usr), new chosen_obj(get_turf(usr)), usr, mainsettings["dropitem"]["value"] == "Yes" ? FALSE : TRUE, (mainsettings["googlyeyes"]["value"] == "Yes" ? FALSE : TRUE))
+
+ if (mainsettings["disableai"]["value"] == "Yes")
+ basemob.toggle_ai(AI_OFF)
+
+ if (mainsettings["idledamage"]["value"] == "No")
+ basemob.idledamage = FALSE
+
+ if (mainsettings["access"])
+ var/newaccess = text2path(mainsettings["access"]["value"])
+ if (ispath(newaccess))
+ basemob.access_card = new newaccess
+
+ if (mainsettings["maxhealth"]["value"])
+ if (!isnum(mainsettings["maxhealth"]["value"]))
+ mainsettings["maxhealth"]["value"] = text2num(mainsettings["maxhealth"]["value"])
+ if (mainsettings["maxhealth"]["value"] > 0)
+ basemob.maxHealth = basemob.maxHealth = mainsettings["maxhealth"]["value"]
+
+ if (mainsettings["name"]["value"])
+ basemob.name = basemob.real_name = html_decode(mainsettings["name"]["value"])
+
+ if (mainsettings["ckey"]["value"] != "none")
+ basemob.ckey = mainsettings["ckey"]["value"]
+
+
+ log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at ([usr.x],[usr.y],[usr.z])")
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn object-mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm
index faa6b6c1e3..3db66dee57 100644
--- a/code/modules/antagonists/abductor/equipment/gland.dm
+++ b/code/modules/antagonists/abductor/equipment/gland.dm
@@ -194,15 +194,12 @@
to_chat(owner, "You feel sick.")
var/datum/disease/advance/A = random_virus(pick(2,6),6)
A.carrier = TRUE
- owner.viruses += A
- A.affected_mob = owner
- owner.med_hud_set_status()
+ owner.ForceContractDisease(A, FALSE, TRUE)
/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
- if(max_symptoms > SYMPTOM_LIMIT)
- max_symptoms = SYMPTOM_LIMIT
- var/datum/disease/advance/A = new(FALSE, null)
- A.symptoms = list()
+ if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
+ max_symptoms = VIRUS_SYMPTOM_LIMIT
+ var/datum/disease/advance/A = new /datum/disease/advance()
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm
index 6c852684b2..9d31852d28 100644
--- a/code/modules/antagonists/blob/blob/overmind.dm
+++ b/code/modules/antagonists/blob/blob/overmind.dm
@@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
pass_flags = PASSBLOB
faction = list(ROLE_BLOB)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ call_life = TRUE
var/obj/structure/blob/core/blob_core = null // The blob overmind's core
var/blob_points = 0
var/max_blob_points = 100
@@ -67,7 +68,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
if(!T)
CRASH("No blobspawnpoints and blob spawned in nullspace.")
forceMove(T)
-
+
/mob/camera/blob/proc/is_valid_turf(turf/T)
var/area/A = get_area(T)
if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T))
@@ -217,9 +218,6 @@ GLOBAL_LIST_EMPTY(blob_nodes)
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [rendered]")
-/mob/camera/blob/emote(act,m_type=1,message = null)
- return
-
/mob/camera/blob/blob_act(obj/structure/blob/B)
return
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 93a05834fe..cb5aba6c99 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -30,9 +30,11 @@
user.reagents.add_reagent("antihol", 10)
user.reagents.add_reagent("mannitol", 25)
- for(var/thing in user.viruses)
- var/datum/disease/D = thing
- if(D.severity == VIRUS_SEVERITY_POSITIVE)
- continue
- D.cure()
+ if(isliving(user))
+ var/mob/living/L = user
+ for(var/thing in L.diseases)
+ var/datum/disease/D = thing
+ if(D.severity == DISEASE_SEVERITY_POSITIVE)
+ continue
+ D.cure()
return TRUE
diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm
index 961f071b02..308cd38c80 100644
--- a/code/modules/antagonists/cult/cult_comms.dm
+++ b/code/modules/antagonists/cult/cult_comms.dm
@@ -1,5 +1,4 @@
// Contains cult communion, guide, and cult master abilities
-#define MARK_COOLDOWN
/datum/action/innate/cult
icon_icon = 'icons/mob/actions/actions_cult.dmi'
diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm
new file mode 100644
index 0000000000..8172d58d8e
--- /dev/null
+++ b/code/modules/antagonists/disease/disease_abilities.dm
@@ -0,0 +1,347 @@
+/*
+Abilities that can be purchased by disease mobs. Most are just passive symptoms that will be
+added to their disease, but some are active abilites that affect only the target the overmind
+is currently following.
+*/
+
+GLOBAL_LIST_INIT(disease_ability_singletons, list(
+ new /datum/disease_ability/action/cough(),
+ new /datum/disease_ability/action/sneeze(),
+ new /datum/disease_ability/symptom/cough(),
+ new /datum/disease_ability/symptom/sneeze(),\
+ new /datum/disease_ability/symptom/hallucigen(),
+ new /datum/disease_ability/symptom/choking(),
+ new /datum/disease_ability/symptom/confusion(),
+ new /datum/disease_ability/symptom/youth(),
+ new /datum/disease_ability/symptom/vomit(),
+ new /datum/disease_ability/symptom/voice_change(),
+ new /datum/disease_ability/symptom/visionloss(),
+ new /datum/disease_ability/symptom/viraladaptation(),
+ new /datum/disease_ability/symptom/vitiligo(),
+ new /datum/disease_ability/symptom/sensory_restoration(),
+ new /datum/disease_ability/symptom/itching(),
+ new /datum/disease_ability/symptom/weight_loss(),
+ new /datum/disease_ability/symptom/metabolism_heal(),
+ new /datum/disease_ability/symptom/coma_heal()
+ ))
+
+/datum/disease_ability
+ var/name
+ var/cost = 0
+ var/required_total_points = 0
+ var/start_with = FALSE
+ var/short_desc = ""
+ var/long_desc = ""
+ var/stat_block = ""
+ var/threshold_block = ""
+ var/category = ""
+
+ var/list/symptoms
+ var/list/actions
+
+/datum/disease_ability/New()
+ ..()
+ if(symptoms)
+ var/stealth = 0
+ var/resistance = 0
+ var/stage_speed = 0
+ var/transmittable = 0
+ for(var/T in symptoms)
+ var/datum/symptom/S = T
+ stealth += initial(S.stealth)
+ resistance += initial(S.resistance)
+ stage_speed += initial(S.stage_speed)
+ transmittable += initial(S.transmittable)
+ threshold_block += "
[initial(S.threshold_desc)]"
+ stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmittability: [transmittable]
"
+
+/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
+ if(world.time < D.next_adaptation_time)
+ return FALSE
+ if(!D.unpurchased_abilities[src])
+ return FALSE
+ return (D.points >= cost) && (D.total_points >= required_total_points)
+
+/datum/disease_ability/proc/Buy(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE)
+ if(!silent)
+ to_chat(D, "Purchased [name].")
+ D.points -= cost
+ D.unpurchased_abilities -= src
+ if(trigger_cooldown)
+ D.adapt_cooldown()
+ D.purchased_abilities[src] = TRUE
+ for(var/V in (D.disease_instances+D.disease_template))
+ var/datum/disease/advance/sentient_disease/SD = V
+ if(symptoms)
+ for(var/T in symptoms)
+ var/datum/symptom/S = new T()
+ SD.symptoms += S
+ if(SD.processing)
+ S.Start(SD)
+ SD.Refresh()
+ for(var/T in actions)
+ var/datum/action/A = new T()
+ A.Grant(D)
+
+
+/datum/disease_ability/proc/CanRefund(mob/camera/disease/D)
+ if(world.time < D.next_adaptation_time)
+ return FALSE
+ return D.purchased_abilities[src]
+
+/datum/disease_ability/proc/Refund(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE)
+ if(!silent)
+ to_chat(D, "Refunded [name].")
+ D.points += cost
+ D.unpurchased_abilities[src] = TRUE
+ if(trigger_cooldown)
+ D.adapt_cooldown()
+ D.purchased_abilities -= src
+ for(var/V in (D.disease_instances+D.disease_template))
+ var/datum/disease/advance/sentient_disease/SD = V
+ if(symptoms)
+ for(var/T in symptoms)
+ var/datum/symptom/S = locate(T) in SD.symptoms
+ if(S)
+ SD.symptoms -= S
+ if(SD.processing)
+ S.End(SD)
+ qdel(S)
+ SD.Refresh()
+ for(var/T in actions)
+ var/datum/action/A = locate(T) in D.actions
+ qdel(A)
+
+//these sybtypes are for conveniently separating the different categories, they have no unique code.
+
+/datum/disease_ability/action
+ category = "Active"
+
+/datum/disease_ability/symptom
+ category = "Symptom"
+
+//active abilities and their associated actions
+
+/datum/disease_ability/action/cough
+ name = "Voluntary Coughing"
+ actions = list(/datum/action/cooldown/disease_cough)
+ cost = 0
+ required_total_points = 0
+ start_with = TRUE
+ short_desc = "Force the host you are following to cough, spreading your infection to those nearby."
+ long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds"
+
+
+/datum/action/cooldown/disease_cough
+ name = "Cough"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon_state = "cough"
+ desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.
Cooldown: 10 seconds"
+ cooldown_time = 100
+
+/datum/action/cooldown/disease_cough/Trigger()
+ if(!..())
+ return FALSE
+ var/mob/camera/disease/D = owner
+ var/mob/living/L = D.following_host
+ if(!L)
+ return FALSE
+ if(L.stat != CONSCIOUS)
+ to_chat(D, "Your host must be concious to cough.")
+ return FALSE
+ to_chat(D, "You force [L.real_name] to cough.")
+ L.emote("cough")
+ var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
+ SD.spread(2)
+ StartCooldown()
+ return TRUE
+
+
+/datum/disease_ability/action/sneeze
+ name = "Voluntary Sneezing"
+ actions = list(/datum/action/cooldown/disease_sneeze)
+ cost = 2
+ required_total_points = 3
+ short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them."
+ long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds"
+
+
+/datum/action/cooldown/disease_sneeze
+ name = "Sneeze"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon_state = "sneeze"
+ desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmitability is low.
Cooldown: 20 seconds"
+ cooldown_time = 200
+
+/datum/action/cooldown/disease_sneeze/Trigger()
+ if(!..())
+ return FALSE
+ var/mob/camera/disease/D = owner
+ var/mob/living/L = D.following_host
+ if(!L)
+ return FALSE
+ if(L.stat != CONSCIOUS)
+ to_chat(D, "Your host must be concious to sneeze.")
+ return FALSE
+ to_chat(D, "You force [L.real_name] to sneeze.")
+ L.emote("sneeze")
+ var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
+
+ for(var/mob/living/M in oview(4, SD.affected_mob))
+ if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
+ M.AirborneContractDisease(SD, TRUE)
+
+ StartCooldown()
+ return TRUE
+
+//passive symptom abilities
+
+/datum/disease_ability/symptom/cough
+ name = "Involuntary Coughing"
+ symptoms = list(/datum/symptom/cough)
+ cost = 2
+ required_total_points = 4
+ short_desc = "Cause victims to cough intermittently."
+ long_desc = "Cause victims to cough intermittently, spreading your infection if your transmitability is high."
+
+/datum/disease_ability/symptom/sneeze
+ name = "Involuntary Sneezing"
+ symptoms = list(/datum/symptom/sneeze)
+ cost = 2
+ required_total_points = 4
+ short_desc = "Cause victims to sneeze intermittently."
+ long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmitability and resistance, at the cost of stealth."
+
+/datum/disease_ability/symptom/beard
+ //I don't think I need to justify the fact that this is the best symptom
+ name = "Beard Growth"
+ symptoms = list(/datum/symptom/beard)
+ cost = 1
+ required_total_points = 8
+ short_desc = "Cause all victims to grow a luscious beard."
+ long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
+
+/datum/disease_ability/symptom/hallucigen
+ name = "Hallucinations"
+ symptoms = list(/datum/symptom/hallucigen)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to hallucinate."
+ long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
+
+
+/datum/disease_ability/symptom/choking
+ name = "Choking"
+ symptoms = list(/datum/symptom/choking)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to choke."
+ long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmittability."
+
+
+/datum/disease_ability/symptom/confusion
+ name = "Confusion"
+ symptoms = list(/datum/symptom/confusion)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to become confused."
+ long_desc = "Cause victims to become confused intermittently."
+
+
+/datum/disease_ability/symptom/youth
+ name = "Eternal Youth"
+ symptoms = list(/datum/symptom/youth)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to become eternally young."
+ long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmittability."
+
+
+/datum/disease_ability/symptom/vomit
+ name = "Vomiting"
+ symptoms = list(/datum/symptom/vomit)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to vomit."
+ long_desc = "Cause victims to vomit. Slightly increases transmittability. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
+
+
+/datum/disease_ability/symptom/voice_change
+ name = "Voice Changing"
+ symptoms = list(/datum/symptom/voice_change)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Change the voice of victims."
+ long_desc = "Change the voice of victims, causing confusion in communications."
+
+
+/datum/disease_ability/symptom/visionloss
+ name = "Vision Loss"
+ symptoms = list(/datum/symptom/visionloss)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Damage the eyes of victims, eventually causing blindness."
+ long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
+
+
+/datum/disease_ability/symptom/viraladaptation
+ name = "Self-Adaptation"
+ symptoms = list(/datum/symptom/viraladaptation)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause your infection to become more resistant to detection and eradication."
+ long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
+
+
+/datum/disease_ability/symptom/vitiligo
+ name = "Skin Paleness"
+ symptoms = list(/datum/symptom/vitiligo)
+ cost = 1
+ required_total_points = 8
+ short_desc = "Cause victims to become pale."
+ long_desc = "Cause victims to become pale. Decreases all stats."
+
+
+/datum/disease_ability/symptom/sensory_restoration
+ name = "Sensory Restoration"
+ symptoms = list(/datum/symptom/sensory_restoration)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Regenerate eye and ear damage of victims."
+ long_desc = "Regenerate eye and ear damage of victims."
+
+
+/datum/disease_ability/symptom/itching
+ name = "Itching"
+ symptoms = list(/datum/symptom/itching)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to itch."
+ long_desc = "Cause victims to itch, increasing all stats except stealth."
+
+
+/datum/disease_ability/symptom/weight_loss
+ name = "Weight Loss"
+ symptoms = list(/datum/symptom/weight_loss)
+ cost = 4
+ required_total_points = 8
+ short_desc = "Cause victims to lose weight."
+ long_desc = "Cause victims to lose weight, and make it almost immpossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
+
+
+/datum/disease_ability/symptom/metabolism_heal
+ name = "Metabolic Boost"
+ symptoms = list(/datum/symptom/heal/metabolism)
+ cost = 4
+ required_total_points = 16
+ short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
+ long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
+
+
+/datum/disease_ability/symptom/coma_heal
+ name = "Regenerative Coma"
+ symptoms = list(/datum/symptom/heal/coma)
+ cost = 8
+ required_total_points = 16
+ short_desc = "Cause victims to fall into a healing coma when hurt."
+ long_desc = "Cause victims to fall into a healing coma when hurt."
diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm
new file mode 100644
index 0000000000..0589b0c595
--- /dev/null
+++ b/code/modules/antagonists/disease/disease_datum.dm
@@ -0,0 +1,100 @@
+/datum/antagonist/disease
+ name = "Sentient Disease"
+ roundend_category = "diseases"
+ antagpanel_category = "Disease"
+ var/disease_name = ""
+
+/datum/antagonist/disease/on_gain()
+ owner.special_role = "Sentient Disease"
+ owner.assigned_role = "Sentient Disease"
+ var/datum/objective/O = new /datum/objective/disease_infect()
+ O.owner = owner
+ objectives += O
+ owner.objectives += O
+
+ O = new /datum/objective/disease_infect_centcom()
+ O.owner = owner
+ objectives += O
+ owner.objectives += O
+
+ . = ..()
+
+/datum/antagonist/disease/greet()
+ to_chat(owner.current, "You are the [owner.special_role]!")
+ to_chat(owner.current, "Infect members of the crew to gain adaptation points, and spread your infection further.")
+ owner.announce_objectives()
+
+/datum/antagonist/disease/apply_innate_effects(mob/living/mob_override)
+ if(!istype(owner.current, /mob/camera/disease))
+ var/turf/T = get_turf(owner.current)
+ T = T ? T : locate(1, 1, 1)
+ var/mob/camera/disease/D = new /mob/camera/disease(T)
+ owner.transfer_to(D)
+
+/datum/antagonist/disease/admin_add(datum/mind/new_owner,mob/admin)
+ ..()
+ var/mob/camera/disease/D = new_owner.current
+ D.infect_patient_zero()
+ D.pick_name()
+
+/datum/antagonist/disease/roundend_report()
+ var/list/result = list()
+
+ result += "Disease name: [disease_name]"
+ result += printplayer(owner)
+
+ var/win = TRUE
+ var/objectives_text = ""
+ var/count = 1
+ for(var/datum/objective/objective in objectives)
+ if(objective.check_completion())
+ objectives_text += "
Objective #[count]: [objective.explanation_text] Success!"
+ else
+ objectives_text += "
Objective #[count]: [objective.explanation_text] Fail."
+ win = FALSE
+ count++
+
+ result += objectives_text
+
+ var/special_role_text = lowertext(name)
+
+ if(win)
+ result += "The [special_role_text] was successful!"
+ else
+ result += "The [special_role_text] has failed!"
+
+ if(istype(owner.current, /mob/camera/disease))
+ var/mob/camera/disease/D = owner.current
+ result += "[disease_name] completed the round with [D.hosts.len] infected hosts, and reached a maximum of [D.total_points] concurrent infections."
+ result += "[disease_name] completed the round with the following adaptations:"
+ var/list/adaptations = list()
+ for(var/V in D.purchased_abilities)
+ var/datum/disease_ability/A = V
+ adaptations += A.name
+ result += adaptations.Join(", ")
+
+ return result.Join("
")
+
+
+/datum/objective/disease_infect
+ explanation_text = "Survive and infect as many people as possible."
+
+/datum/objective/disease_infect/check_completion()
+ var/mob/camera/disease/D = owner.current
+ if(istype(D) && D.hosts.len) //theoretically it should not exist if it has no hosts, but better safe than sorry.
+ return TRUE
+ return FALSE
+
+
+/datum/objective/disease_infect_centcom
+ explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod."
+
+/datum/objective/disease_infect_centcom/check_completion()
+ var/mob/camera/disease/D = owner.current
+ if(!istype(D))
+ return FALSE
+ for(var/V in D.hosts)
+ var/mob/living/L = V
+ if(L.onCentCom() || L.onSyndieBase())
+ return TRUE
+ return FALSE
diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm
new file mode 100644
index 0000000000..8ee36e8829
--- /dev/null
+++ b/code/modules/antagonists/disease/disease_disease.dm
@@ -0,0 +1,59 @@
+/datum/disease/advance/sentient_disease
+ form = "Virus"
+ name = "Sentient Virus"
+ desc = "An apparently sentient virus, extremely adaptable and resistant to outside sources of mutation."
+ viable_mobtypes = list(/mob/living/carbon/human)
+ mutable = FALSE
+ var/mob/camera/disease/overmind
+
+/datum/disease/advance/sentient_disease/New()
+ ..()
+ GLOB.sentient_disease_instances += src
+
+/datum/disease/advance/sentient_disease/Destroy()
+ . = ..()
+ GLOB.sentient_disease_instances -= src
+
+/datum/disease/advance/sentient_disease/remove_disease()
+ if(overmind)
+ overmind.remove_infection(src)
+ ..()
+
+/datum/disease/advance/sentient_disease/infect(var/mob/living/infectee, make_copy = TRUE)
+ if(make_copy && overmind && (overmind.disease_template != src))
+ overmind.disease_template.infect(infectee, TRUE) //get an updated version of the virus
+ else
+ ..()
+
+
+/datum/disease/advance/sentient_disease/IsSame(datum/disease/D)
+ if(istype(src, D.type))
+ var/datum/disease/advance/sentient_disease/V = D
+ if(V.overmind == overmind)
+ return TRUE
+ return FALSE
+
+
+/datum/disease/advance/sentient_disease/Copy()
+ var/datum/disease/advance/sentient_disease/D = ..()
+ D.overmind = overmind
+ return D
+
+/datum/disease/advance/sentient_disease/after_add()
+ if(overmind)
+ overmind.add_infection(src)
+
+
+/datum/disease/advance/sentient_disease/GetDiseaseID()
+ return "[type]|[overmind ? overmind.tag : null]"
+
+/datum/disease/advance/sentient_disease/GenerateCure()
+ if(cures.len)
+ return
+ var/list/not_used = advance_cures.Copy()
+ cures = list(pick_n_take(not_used), pick_n_take(not_used))
+
+ // Get the cure name from the cure_id
+ var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]]
+ var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]]
+ cure_text = "[D1.name] and [D2.name]"
diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm
new file mode 100644
index 0000000000..ad9d07e95b
--- /dev/null
+++ b/code/modules/antagonists/disease/disease_event.dm
@@ -0,0 +1,30 @@
+
+/datum/round_event_control/sentient_disease
+ name = "Spawn Sentient Disease"
+ typepath = /datum/round_event/ghost_role/sentient_disease
+ weight = 7
+ max_occurrences = 1
+ min_players = 5
+
+
+/datum/round_event/ghost_role/sentient_disease
+ role_name = "sentient disease"
+
+/datum/round_event/ghost_role/sentient_disease/spawn_role()
+ var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
+ if(!candidates.len)
+ return NOT_ENOUGH_PLAYERS
+
+ var/mob/dead/observer/selected = pick_n_take(candidates)
+
+ var/mob/camera/disease/virus = new /mob/camera/disease(locate(1, 1, 1))
+ if(!virus.infect_patient_zero())
+ message_admins("Event attempted to spawn a sentient disease, but infection of patient zero failed.")
+ qdel(virus)
+ return WAITING_FOR_SOMETHING
+ virus.key = selected.key
+ INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name)
+ message_admins("[key_name_admin(virus)] has been made into a sentient disease by an event.")
+ log_game("[key_name(virus)] was spawned as a sentient disease by an event.")
+ spawned_mobs += virus
+ return SUCCESSFUL_SPAWN
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
new file mode 100644
index 0000000000..d14d34ef75
--- /dev/null
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -0,0 +1,318 @@
+/*
+A mob of type /mob/camera/disease is an overmind coordinating at least one instance of /datum/disease/advance/sentient_disease
+that has infected a host. All instances in a host will be synchronized with the stats of the overmind's disease_template. Any
+samples outside of a host will retain the stats they had when they left the host, but infecting a new host will cause
+the new instance inside the host to be updated to the template's stats.
+*/
+
+/mob/camera/disease
+ name = ""
+ real_name = ""
+ desc = ""
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "marker"
+ mouse_opacity = MOUSE_OPACITY_ICON
+ move_on_shuttle = 1
+ see_in_dark = 8
+ invisibility = INVISIBILITY_OBSERVER
+ layer = BELOW_MOB_LAYER
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ sight = SEE_SELF
+ initial_language_holder = /datum/language_holder/empty
+
+ var/datum/action/innate/disease_adapt/adaptation_menu_action
+ var/datum/disease_ability/examining_ability
+ var/datum/browser/browser
+ var/browser_open = FALSE
+
+ var/mob/living/following_host
+ var/datum/component/redirect/move_listener
+ var/list/disease_instances
+ var/list/hosts //this list is associative, affected_mob -> disease_instance
+ var/datum/disease/advance/sentient_disease/disease_template
+
+ var/total_points = 0
+ var/points = 0
+
+ var/last_move_tick = 0
+ var/move_delay = 1
+
+ var/next_adaptation_time = 0
+ var/adaptation_cooldown = 1200
+
+ var/list/purchased_abilities
+ var/list/unpurchased_abilities
+
+/mob/camera/disease/Initialize(mapload)
+ .= ..()
+ adaptation_menu_action = new /datum/action/innate/disease_adapt()
+ adaptation_menu_action.Grant(src)
+
+ disease_instances = list()
+ hosts = list()
+
+ purchased_abilities = list()
+ unpurchased_abilities = list()
+ for(var/V in GLOB.disease_ability_singletons)
+ unpurchased_abilities[V] = TRUE
+ var/datum/disease_ability/A = V
+ if(A.start_with && A.CanBuy(src))
+ A.Buy(src, TRUE, FALSE)
+
+ disease_template = new /datum/disease/advance/sentient_disease()
+ disease_template.overmind = src
+ qdel(SSdisease.archive_diseases[disease_template.GetDiseaseID()])
+ SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs
+
+ var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
+ my_hud.add_hud_to(src)
+
+ browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src)
+
+/mob/camera/disease/Destroy()
+ . = ..()
+ for(var/V in GLOB.sentient_disease_instances)
+ var/datum/disease/advance/sentient_disease/S = V
+ if(S.overmind == src)
+ S.overmind = null
+
+/mob/camera/disease/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat("Adaptation Points: [points]/[total_points]")
+ stat("Hosts: [disease_instances.len]")
+ var/adapt_ready = next_adaptation_time - world.time
+ if(adapt_ready > 0)
+ stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s")
+
+/mob/camera/disease/say(message)
+ return
+
+/mob/camera/disease/Move(NewLoc, Dir = 0)
+ if(world.time > (last_move_tick + move_delay))
+ follow_next(Dir & NORTHWEST)
+ last_move_tick = world.time
+
+/mob/camera/disease/mind_initialize()
+ . = ..()
+ if(!mind.has_antag_datum(/datum/antagonist/disease))
+ mind.add_antag_datum(/datum/antagonist/disease)
+
+/mob/camera/disease/proc/pick_name()
+ var/static/list/taken_names
+ if(!taken_names)
+ taken_names = list("Unknown" = TRUE)
+ for(var/T in (subtypesof(/datum/disease) - /datum/disease/advance))
+ var/datum/disease/D = T
+ taken_names[initial(D.name)] = TRUE
+ var/set_name
+ while(!set_name)
+ var/input = stripped_input(src, "Select a name for your disease", "Select Name", "", MAX_NAME_LEN)
+ if(!input)
+ set_name = "Sentient Virus"
+ break
+ if(taken_names[input])
+ to_chat(src, "You cannot use the name of such a well-known disease!")
+ else
+ set_name = input
+ real_name = "[set_name] (Sentient Disease)"
+ name = "[set_name] (Sentient Disease)"
+ disease_template.AssignName(set_name)
+ var/datum/antagonist/disease/A = mind.has_antag_datum(/datum/antagonist/disease)
+ if(A)
+ A.disease_name = set_name
+
+/mob/camera/disease/proc/infect_patient_zero()
+ var/list/possible_hosts = list()
+ var/datum/disease/advance/sentient_disease/V = disease_template.Copy()
+ for(var/mob/living/carbon/human/H in GLOB.carbon_list)
+ if((H.stat != DEAD) && H.CanContractDisease(V))
+ possible_hosts += H
+ if(!possible_hosts.len)
+ return FALSE
+ var/mob/living/carbon/human/H = pick(possible_hosts)
+ if(H.ForceContractDisease(V, FALSE, TRUE))
+ return TRUE
+ return FALSE
+
+/mob/camera/disease/proc/force_infect(mob/living/L)
+ var/datum/disease/advance/sentient_disease/V = disease_template.Copy()
+ return L.ForceContractDisease(V, FALSE, TRUE)
+
+/mob/camera/disease/proc/add_infection(datum/disease/advance/sentient_disease/V)
+ disease_instances += V
+ hosts[V.affected_mob] = V
+ total_points = max(total_points, disease_instances.len)
+ points += 1
+
+ var/image/holder = V.affected_mob.hud_list[SENTIENT_DISEASE_HUD]
+ var/mutable_appearance/MA = new /mutable_appearance(holder)
+ MA.icon_state = "virus_infected"
+ MA.layer = BELOW_MOB_LAYER
+ MA.color = COLOR_GREEN_GRAY
+ MA.alpha = 200
+ holder.appearance = MA
+ var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
+ my_hud.add_to_hud(V.affected_mob)
+
+ to_chat(src, "A new host, [V.affected_mob.real_name], has been infected.")
+
+ if(!following_host)
+ set_following(V.affected_mob)
+ refresh_adaptation_menu()
+
+/mob/camera/disease/proc/remove_infection(datum/disease/advance/sentient_disease/V)
+ if(QDELETED(src))
+ disease_instances -= V
+ hosts -= V.affected_mob
+ else
+ points -= 1
+ to_chat(src, "One of your hosts, [V.affected_mob.real_name], has been purged of your infection.")
+
+ var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
+ my_hud.remove_from_hud(V.affected_mob)
+
+ if(following_host == V.affected_mob)
+ follow_next()
+
+ disease_instances -= V
+ hosts -= V.affected_mob
+
+ if(!disease_instances.len)
+ to_chat(src, "The last of your infection has disappeared.")
+ set_following(null)
+ qdel(src)
+ refresh_adaptation_menu()
+
+/mob/camera/disease/proc/set_following(mob/living/L)
+ following_host = L
+ if(!move_listener)
+ move_listener = L.AddComponent(/datum/component/redirect, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/follow_mob))
+ else
+ L.TakeComponent(move_listener)
+ if(QDELING(move_listener))
+ move_listener = null
+ follow_mob()
+
+/mob/camera/disease/proc/follow_next(reverse = FALSE)
+ var/index = hosts.Find(following_host)
+ if(index)
+ if(reverse)
+ index = index == 1 ? hosts.len : index - 1
+ else
+ index = index == hosts.len ? 1 : index + 1
+ set_following(hosts[index])
+
+/mob/camera/disease/proc/follow_mob(newloc, dir)
+ var/turf/T = get_turf(following_host)
+ if(T)
+ forceMove(T)
+
+/mob/camera/disease/DblClickOn(var/atom/A, params)
+ if(hosts[A])
+ set_following(A)
+ else
+ ..()
+
+/mob/camera/disease/proc/adapt_cooldown()
+ to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.")
+ next_adaptation_time = world.time + adaptation_cooldown
+ addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown)
+
+/mob/camera/disease/proc/notify_adapt_ready()
+ to_chat(src, "You are now ready to adapt again.")
+ refresh_adaptation_menu()
+
+/mob/camera/disease/proc/refresh_adaptation_menu()
+ if(browser_open)
+ adaptation_menu()
+
+/mob/camera/disease/proc/adaptation_menu()
+ var/datum/disease/advance/sentient_disease/DT = disease_template
+ if(!DT)
+ return
+ var/list/dat = list()
+
+ if(examining_ability)
+ dat += "Back
[examining_ability.name]
[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]"
+ else
+ dat += "Disease Statistics
\
+ Resistance: [DT.totalResistance()]
\
+ Stealth: [DT.totalStealth()]
\
+ Stage Speed: [DT.totalStageSpeed()]
\
+ Transmittability: [DT.totalTransmittable()]
\
+ Cure: [DT.cure_text]"
+ dat += "
Adaptations
\
+ Points: [points] / [total_points]\
+ \
+ | Cost | | Unlock | Name | Type | Description |
"
+ for(var/V in GLOB.disease_ability_singletons)
+ var/datum/disease_ability/A = V
+ var/purchase_text
+ if(unpurchased_abilities[A])
+ if(A.CanBuy(src))
+ purchase_text = "Purchase"
+ else
+ purchase_text = "Purchase"
+ else
+ if(A.CanRefund(src))
+ purchase_text = "Refund"
+ else
+ purchase_text = "Refund"
+ dat += "| [A.cost] | [purchase_text] | [A.required_total_points] | [A.name] | [A.category] | [A.short_desc] |
"
+
+ dat += "
Infect many hosts at once to gain adaptation points.
Infected Hosts
"
+ for(var/V in hosts)
+ var/mob/living/L = V
+ dat += "
[L.real_name]"
+
+ browser.set_content(dat.Join())
+ browser.open()
+ browser_open = TRUE
+
+/mob/camera/disease/Topic(href, list/href_list)
+ ..()
+ if(href_list["close"])
+ browser_open = FALSE
+ if(usr != src)
+ return
+ if(href_list["follow_instance"])
+ var/mob/living/L = locate(href_list["follow_instance"]) in hosts
+ set_following(L)
+
+ if(href_list["buy_ability"])
+ var/datum/disease_ability/A = locate(href_list["buy_ability"])
+ if(!istype(A))
+ return
+ if(A.CanBuy(src))
+ A.Buy(src)
+ adaptation_menu()
+
+ if(href_list["refund_ability"])
+ var/datum/disease_ability/A = locate(href_list["refund_ability"])
+ if(!istype(A))
+ return
+ if(A.CanRefund(src))
+ A.Refund(src)
+ adaptation_menu()
+
+ if(href_list["examine_ability"])
+ var/datum/disease_ability/A = locate(href_list["examine_ability"])
+ if(!istype(A))
+ return
+ examining_ability = A
+ adaptation_menu()
+
+ if(href_list["main_menu"])
+ examining_ability = null
+ adaptation_menu()
+
+
+/datum/action/innate/disease_adapt
+ name = "Adaptation Menu"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon_state = "disease_menu"
+
+/datum/action/innate/disease_adapt/Activate()
+ var/mob/camera/disease/D = owner
+ D.adaptation_menu()
diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm
index 185bedba8f..aeca9c18bd 100644
--- a/code/modules/antagonists/highlander/highlander.dm
+++ b/code/modules/antagonists/highlander/highlander.dm
@@ -5,16 +5,12 @@
show_name_in_check_antagonists = TRUE
/datum/antagonist/highlander/apply_innate_effects(mob/living/mob_override)
- var/mob/living/carbon/human/H = owner.current || mob_override
- if(!istype(H))
- return
- H.dna.species.species_traits |= NOGUNS //nice try jackass
+ var/mob/living/L = owner.current || mob_override
+ L.add_trait(TRAIT_NOGUNS, "highlander")
/datum/antagonist/highlander/remove_innate_effects(mob/living/mob_override)
- var/mob/living/carbon/human/H = owner.current || mob_override
- if(!istype(H))
- return
- H.dna.species.species_traits &= ~NOGUNS
+ var/mob/living/L = owner.current || mob_override
+ L.remove_trait(TRAIT_NOGUNS, "highlander")
/datum/antagonist/highlander/on_removal()
owner.objectives -= objectives
@@ -76,7 +72,7 @@
sword.admin_spawned = TRUE //To prevent announcing
sword.pickup(H) //For the stun shielding
H.put_in_hands(sword)
-
+
var/obj/item/bloodcrawl/antiwelder = new(H)
antiwelder.name = "compulsion of honor"
diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm
index 196adf5c22..9ce28eb60d 100644
--- a/code/modules/antagonists/monkey/monkey.dm
+++ b/code/modules/antagonists/monkey/monkey.dm
@@ -40,11 +40,10 @@
owner.special_role = null
SSticker.mode.ape_infectees -= owner
- var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.viruses
+ var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.diseases
if(D)
- D.remove_virus()
qdel(D)
-
+
. = ..()
/datum/antagonist/monkey/create_team(datum/team/monkey/new_team)
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index b83892dd46..f81371b504 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -354,12 +354,12 @@
if(H.dna && H.dna.species)
H.dna.species.handle_hair(H,"#1d2953") //will be reset when blight is cured
var/blightfound = FALSE
- for(var/datum/disease/revblight/blight in H.viruses)
+ for(var/datum/disease/revblight/blight in H.diseases)
blightfound = TRUE
if(blight.stage < 5)
blight.stage++
if(!blightfound)
- H.AddDisease(new /datum/disease/revblight)
+ H.ForceContractDisease(new /datum/disease/revblight(), FALSE, TRUE)
to_chat(H, "You feel [pick("suddenly sick", "a surge of nausea", "like your skin is wrong")].")
else
if(mob.reagents)
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index 21bc534f27..7037ecae86 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -2,7 +2,7 @@
name = "Unnatural Wasting"
max_stages = 5
stage_prob = 10
- spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS
+ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
cure_text = "Holy water or extensive rest."
spread_text = "A burst of unholy energy"
cures = list("holywater")
@@ -11,7 +11,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE
permeability_mod = 1
- severity = VIRUS_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_HARMFUL
var/stagedamage = 0 //Highest stage reached.
var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index fb37c878a3..2ffe64f327 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -44,7 +44,7 @@
var/obj/item/bodypart/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if(PIERCEIMMUNE in H.dna.species.species_traits)
+ if(H.has_trait(TRAIT_PIERCEIMMUNE))
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
update_icon()
diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm
deleted file mode 100644
index d12c6196ec..0000000000
--- a/code/modules/atmospherics/machinery/other/zvent.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-/obj/machinery/zvent
- name = "interfloor air transfer system"
-
- icon = 'icons/obj/atmospherics/components/unary_devices.dmi'
- icon_state = "vent_map"
- density = FALSE
- anchored=1
- desc = "This may be needed some day."
-
- var/on = FALSE
- var/volume_rate = 800
-
-/obj/machinery/zvent/New()
- ..()
- SSair.atmos_machinery += src
-
-/obj/machinery/zvent/Destroy()
- SSair.atmos_machinery -= src
- return ..()
-
-/obj/machinery/zvent/process_atmos()
-
- //all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
- if(isturf(loc)) //if we're not on a valid turf, forget it
- for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented
- var/turf/open/zturf_conn = locate(x,y,z+new_z)
- if (istype(zturf_conn))
- var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn
- if (istype(zvent_conn))
- //both floors have simulated turfs, share()
- var/turf/open/myturf = loc
- var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference
- var/datum/gas_mixture/my_air = myturf.air
- if (istype(conn_air) && istype(my_air))
- my_air.share(conn_air)
- air_update_turf()
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index bfde6397b7..4fc3aaf55a 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -232,8 +232,8 @@
explosion(loc,-1,0,2, flame_range = 2)
if(9)
//Cold
- var/datum/disease/D = new /datum/disease/cold
- user.ForceContractDisease(D)
+ var/datum/disease/D = new /datum/disease/cold()
+ user.ForceContractDisease(D, FALSE, TRUE)
if(10)
//Nothing
visible_message("[src] roll perfectly.")
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index b246c0c7b0..9181945ebd 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -409,7 +409,21 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
"Someone come hold me :(",\
"I need someone on me :(",\
"What happened? Where has everyone gone?",\
- "Forever alone :("\
+ "Forever alone :(",\
+ "My nipples are so stiff, but Zelda ain't here. :(",\
+ "Leon senpai, play more Spessmans. :(",\
+ "If only Serdy were here...",\
+ "Panic bunker can't keep my love for you out.",\
+ "Cebu needs to Awoo herself back into my heart.",\
+ "I don't even have a Turry to snuggle viciously here.",\
+ "MOM, WHERE ARE YOU??? D:",\
+ "It's a beautiful day outside. Birds are singing, flowers are blooming. On days like this...kids like you...SHOULD BE BURNING IN HELL.",\
+ "Sometimes when I have sex, I think about putting an entire peanut butter and jelly sandwich in the VCR.",\
+ "Oh good, no-one around to watch me lick Goofball's nipples. :D",\
+ "I've replaced Beepsky with a fidget spinner, glory be autism abuse.",\
+ "i shure hop dere are no PRED arund!!!!",\
+ "NO PRED CAN eVER CATCH MI",\
+ "help, the clown is honking his horn in front of dorms and its interrupting everyones erp"\
)
send2irc("Server", "[cheesy_message] (No admins online)")
@@ -716,6 +730,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if (isnull(new_size))
CRASH("change_view called without argument.")
+//CIT CHANGES START HERE - makes change_view change DEFAULT_VIEW to 15x15 depending on preferences
+ if(prefs && CONFIG_GET(string/default_view))
+ if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view))
+ new_size = "15x15"
+//END OF CIT CHANGES
+
view = new_size
apply_clickcatcher()
if (isliving(mob))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f2ef23f1ce..c565847c18 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -316,6 +316,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
"
dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
"
dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
"
+ dat += "Allow MediHound sleeper: [(toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
"
dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
"
dat += "Ghost sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
"
dat += "Ghost whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"]
"
@@ -323,6 +324,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ghost pda: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"]
"
dat += "Pull requests: [(chat_toggles & CHAT_PULLR) ? "Yes" : "No"]
"
dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Yes" : "No"]
"
+ //VORE SOUNDS
+ dat += "Hear Vore Sounds: [(toggles & EATING_NOISES) ? "Yes" : "No"]
"
+ dat += "Hear Vore Digestion Sounds: [(toggles & DIGESTION_NOISES) ? "Yes" : "No"]
"
if(CONFIG_GET(flag/allow_metadata))
dat += "OOC Notes: Edit
"
@@ -1764,6 +1768,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
user.client.playtitlemusic()
else
user.stop_sound_channel(CHANNEL_LOBBYMUSIC)
+ // VORE SOUND TOGGLES
+ if("toggleeatingnoise")
+ toggles ^= EATING_NOISES
+
+ if("toggledigestionnoise")
+ toggles ^= DIGESTION_NOISES
if("ghost_ears")
chat_toggles ^= CHAT_GHOSTEARS
@@ -1783,6 +1793,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("pull_requests")
chat_toggles ^= CHAT_PULLR
+ if("hound_sleeper")
+ toggles ^= MEDIHOUND_SLEEPER
+
if("allow_midround_antag")
toggles ^= MIDROUND_ANTAG
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 12f2b8d4ee..9b776c48b2 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -1,8 +1,12 @@
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
-#define SAVEFILE_VERSION_MIN 15
+#define SAVEFILE_VERSION_MIN 18
//This is the current version, anything below this will attempt to update (if it's not obsolete)
+// You do not need to raise this if you are adding new values that have sane defaults.
+// Only raise this value when changing the meaning/format/name/layout of an existing value
+// where you would want the updater procs below to run
#define SAVEFILE_VERSION_MAX 20
+
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating
@@ -30,83 +34,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
return savefile_version
return -1
-
-/datum/preferences/proc/update_antagchoices(current_version, savefile/S)
- if((!islist(be_special) || old_be_special ) && current_version < 12)
- //Archived values of when antag pref defines were a bitfield+fitflags
- var/B_traitor = 1
- var/B_operative = 2
- var/B_changeling = 4
- var/B_wizard = 8
- var/B_malf = 16
- var/B_rev = 32
- var/B_alien = 64
- var/B_pai = 128
- var/B_cultist = 256
- var/B_blob = 512
- var/B_ninja = 1024
- var/B_monkey = 2048
- var/B_gang = 4096
- var/B_abductor = 16384
- var/B_brother = 32768
-
- var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_blob,B_ninja,B_monkey,B_gang,B_abductor,B_brother)
-
- be_special = list()
-
- for(var/flag in archived)
- if(old_be_special & flag)
- //this is shitty, but this proc should only be run once per player and then never again for the rest of eternity,
- switch(flag)
- if(1) //why aren't these the variables above? Good question, it's because byond complains the expression isn't constant, when it is.
- be_special += ROLE_TRAITOR
- if(2)
- be_special += ROLE_OPERATIVE
- if(4)
- be_special += ROLE_CHANGELING
- if(8)
- be_special += ROLE_WIZARD
- if(16)
- be_special += ROLE_MALF
- if(32)
- be_special += ROLE_REV
- if(64)
- be_special += ROLE_ALIEN
- if(128)
- be_special += ROLE_PAI
- if(256)
- be_special += ROLE_CULTIST
- if(512)
- be_special += ROLE_BLOB
- if(1024)
- be_special += ROLE_NINJA
- if(2048)
- be_special += ROLE_MONKEY
- if(16384)
- be_special += ROLE_ABDUCTOR
- if(32768)
- be_special += ROLE_BROTHER
-
-
-/datum/preferences/proc/update_preferences(current_version, savefile/S)
-
-
-//should this proc get fairly long (say 3 versions long),
+//should these procs get fairly long
//just increase SAVEFILE_VERSION_MIN so it's not as far behind
//SAVEFILE_VERSION_MAX and then delete any obsolete if clauses
-//from this proc.
-//It's only really meant to avoid annoying frequent players
+//from these procs.
+//This only really meant to avoid annoying frequent players
//if your savefile is 3 months out of date, then 'tough shit'.
+
+/datum/preferences/proc/update_preferences(current_version, savefile/S)
+ return
+
/datum/preferences/proc/update_character(current_version, savefile/S)
- if(current_version < 16)
- var/berandom
- S["userandomjob"] >> berandom
- if (berandom)
- joblessrole = BERANDOMJOB
- else
- joblessrole = BEASSISTANT
- if(current_version < 17)
- features["legs"] = "Normal Legs"
if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save.
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list)
@@ -139,6 +77,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
//womb features
features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0)
+
if(current_version < 19)
pda_style = "mono"
if(current_version < 20)
@@ -206,7 +145,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//try to fix any outdated data if necessary
if(needs_update >= 0)
update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer)
- update_antagchoices(needs_update, S)
//Sanitize
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 255423a4fc..52139fd7bc 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -250,6 +250,20 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)()
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
return C.prefs.chat_toggles & CHAT_OOC
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglehoundsleeper)()
+ set name = "Allow/Deny Hound Sleeper"
+ set category = "Preferences"
+ set desc = "Allow MediHound Sleepers"
+ usr.client.prefs.toggles ^= MEDIHOUND_SLEEPER
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & MEDIHOUND_SLEEPER)
+ to_chat(usr, "You will now allow MediHounds to place you in their sleeper.")
+ else
+ to_chat(usr, "You will no longer allow MediHounds to place you in their sleeper.")
+ SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle MediHound Sleeper", "[usr.client.prefs.toggles & MEDIHOUND_SLEEPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/verbs/menu/Settings/Sound/togglehoundsleeper/Get_checked(client/C)
+ return C.prefs.toggles & MEDIHOUND_SLEEPER
+
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
@@ -415,3 +429,4 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
prefs.save_preferences()
to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Visibility", "[prefs.chat_toggles & CHAT_PRAYER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 0f9b6935d3..d787e7e9a8 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -5,4 +5,7 @@
/datum/preferences/proc/set_biological_gender(var/gender)
biological_gender = gender
- identifying_gender = gender
\ No newline at end of file
+ identifying_gender = gender
+
+
+/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this?
diff --git a/code/modules/client/verbs/sethotkeys.dm b/code/modules/client/verbs/sethotkeys.dm
deleted file mode 100644
index ee14787011..0000000000
--- a/code/modules/client/verbs/sethotkeys.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/client/verb/sethotkeys(from_pref = 0 as num)
- set name = "Set Hotkeys"
- set hidden = TRUE
- set waitfor = FALSE
- set desc = "Used to set mob-specific hotkeys or load hoykey mode from preferences"
-
- var/hotkey_default = "default"
- var/hotkey_macro = "hotkeys"
- var/current_setting
-
- var/list/default_macros = list("default", "robot-default")
-
- if(from_pref)
- current_setting = (prefs.hotkeys ? hotkey_macro : hotkey_default)
- else
- current_setting = winget(src, "mainwindow", "macro")
-
- if(mob)
- hotkey_macro = mob.macro_hotkeys
- hotkey_default = mob.macro_default
-
- if(current_setting in default_macros)
- winset(src, null, "mainwindow.macro=[hotkey_default] input.focus=true input.background-color=#d3b5b5")
- else
- winset(src, null, "mainwindow.macro=[hotkey_macro] mapwindow.map.focus=true input.background-color=#e0e0e0")
diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm
index 91b004e0e0..304ddce7eb 100644
--- a/code/modules/error_handler/error_handler.dm
+++ b/code/modules/error_handler/error_handler.dm
@@ -2,6 +2,9 @@ GLOBAL_VAR_INIT(total_runtimes, GLOB.total_runtimes || 0)
GLOBAL_VAR_INIT(total_runtimes_skipped, 0)
#ifdef DEBUG
+
+#define ERROR_USEFUL_LEN 2
+
/world/Error(exception/E, datum/e_src)
GLOB.total_runtimes++
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index c8b8db0681..b19c8358c2 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -39,10 +39,10 @@
continue
if(H.stat == DEAD)
continue
- if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything.
+ if(H.has_trait(TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything.
continue
var/foundAlready = FALSE // don't infect someone that already has a disease
- for(var/thing in H.viruses)
+ for(var/thing in H.diseases)
foundAlready = TRUE
break
if(foundAlready)
@@ -63,7 +63,7 @@
else
D = make_virus(max_severity, max_severity)
D.carrier = TRUE
- H.AddDisease(D)
+ H.ForceContractDisease(D, FALSE, TRUE)
if(advanced_virus)
var/datum/disease/advance/A = D
@@ -75,10 +75,9 @@
break
/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level)
- if(max_symptoms > SYMPTOM_LIMIT)
- max_symptoms = SYMPTOM_LIMIT
- var/datum/disease/advance/A = new(FALSE, null)
- A.symptoms = list()
+ if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
+ max_symptoms = VIRUS_SYMPTOM_LIMIT
+ var/datum/disease/advance/A = new /datum/disease/advance()
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index ebe7dd5bfd..7f9c09dfd9 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -8,7 +8,7 @@
/datum/round_event/heart_attack/start()
var/list/heart_attack_contestants = list()
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
- if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.viruses) || H.undergoing_cardiac_arrest())
+ if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
continue
if(H.satiety <= -60) //Multiple junk food items recently
heart_attack_contestants[H] = 3
@@ -17,6 +17,6 @@
if(LAZYLEN(heart_attack_contestants))
var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants)
- var/datum/disease/D = new /datum/disease/heart_failure
- winner.ForceContractDisease(D)
- notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT)
\ No newline at end of file
+ var/datum/disease/D = new /datum/disease/heart_failure()
+ winner.ForceContractDisease(D, FALSE, TRUE)
+ notify_ghosts("[winner] is beginning to have a heart attack!", enter_link="(Click to orbit)", source=winner, action=NOTIFY_ORBIT)
diff --git a/code/modules/events/solar_flare.dm b/code/modules/events/solar_flare.dm
deleted file mode 100644
index 5f64570c7d..0000000000
--- a/code/modules/events/solar_flare.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/datum/round_event_control/solar_flare
- name = "Solar Flare"
- typepath = /datum/round_event/solar_flare
- max_occurrences = 1
-
-/datum/round_event/solar_flare
-
-/datum/round_event/solar_flare/setup()
- startWhen = 3
- endWhen = startWhen + 1
- announceWhen = 1
-
-/datum/round_event/solar_flare/announce()
- priority_announce("Incoming solar flare detected near the station. Expect power outages in all exposed areas for a short duration.", "Anomaly Alert", 'sound/effects/alert.ogg')
-
-/datum/round_event/solar_flare/start()
- SSweather.run_weather("solar flare",1)
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index dfceb682cd..1407a98518 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -18,12 +18,12 @@
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
continue
var/foundAlready = FALSE //don't infect someone that already has appendicitis
- for(var/datum/disease/appendicitis/A in H.viruses)
+ for(var/datum/disease/appendicitis/A in H.diseases)
foundAlready = TRUE
break
if(foundAlready)
continue
- var/datum/disease/D = new /datum/disease/appendicitis
- H.ForceContractDisease(D)
+ var/datum/disease/D = new /datum/disease/appendicitis()
+ H.ForceContractDisease(D, FALSE, TRUE)
break
\ No newline at end of file
diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm
index edb1a6ce6b..7d7454f46a 100644
--- a/code/modules/fields/turf_objects.dm
+++ b/code/modules/fields/turf_objects.dm
@@ -74,4 +74,4 @@
return FIELD_EDGE
if(O.parent == F)
return FIELD_TURF
- return NO_FIELD
+ return FALSE
diff --git a/code/modules/holodeck/computer_funcs.dm b/code/modules/holodeck/computer_funcs.dm
deleted file mode 100644
index 65741eafea..0000000000
--- a/code/modules/holodeck/computer_funcs.dm
+++ /dev/null
@@ -1,111 +0,0 @@
-/obj/machinery/computer/holodeck/attack_hand(var/mob/user as mob)
- user.set_machine(src)
-
- var/dat = "Current Loaded Programs
"
- dat += "Power Off
"
- for(var/area/A in program_cache)
- dat += "[A.name]
"
- if(emagged && emag_programs.len)
- dat += "SUPERVISOR ACCESS - SAFETY PROTOCOLS DISABLED - CAUTION: EMITTER ANOMALY
"
- for(var/area/A in emag_programs)
- dat += "[A.name]
"
-
- var/datum/browser/popup = new(user, "computer", name, 400, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/computer/holodeck/attack_ai(var/mob/user as mob)
- var/dat = "Current Loaded Programs
"
-
- dat += "Power Off
"
- for(var/area/A in program_cache)
- dat += "[A.name]
"
-
- if(emag_programs.len)
- dat += "
"
- if(emagged)
- dat += "Safety protocol: Offline Engage
"
- for(var/area/A in emag_programs)
- dat += "[A.name]
"
- else
- dat += "Safety protocol: Online Disengage
"
-
- var/datum/browser/popup = new(user, "computer", name, 400, 500)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
-
-
-/obj/machinery/computer/holodeck/proc/load_program(var/area/A, var/force = 0, var/delay = 0)
- if(stat)
- A = offline_program
- force = 1
- delay = 0
- if(program == A)
- return
- if(world.time < (last_change + 25 + (damaged?500:0)) && !force)
- if(delay)
- sleep(25)
- else
- if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
- return
- if(get_dist(usr,src) <= 3)
- to_chat(usr, "ERROR. Recalibrating projection apparatus.")
- return
-
- last_change = world.time
- active = (A != offline_program)
- use_power = active ? ACTIVE_POWER_USE : IDLE_POWER_USE
-
- for(var/obj/effect/holodeck_effect/HE in effects)
- HE.deactivate(src)
-
- for(var/item in spawned)
- derez(item, forced=force)
-
- program = A
- // note nerfing does not yet work on guns, should
- // should also remove/limit/filter reagents?
- // this is an exercise left to others I'm afraid. -Sayu
- spawned = A.copy_contents_to(linked, 1, nerf_weapons = !emagged)
- for(var/obj/machinery/M in spawned)
- M.flags_1 |= NODECONSTRUCT_1
- for(var/obj/structure/S in spawned)
- S.flags_1 |= NODECONSTRUCT_1
- effects = list()
-
- spawn(30)
- var/list/added = list()
- for(var/obj/effect/holodeck_effect/HE in spawned)
- effects += HE
- spawned -= HE
- var/atom/x = HE.activate(src)
- if(istype(x) || islist(x))
- spawned += x // holocarp are not forever
- added += x
- for(var/obj/machinery/M in added)
- M.flags_1 |= NODECONSTRUCT_1
- for(var/obj/structure/S in added)
- S.flags_1 |= NODECONSTRUCT_1
-
-/obj/machinery/computer/holodeck/proc/derez(var/obj/obj, var/silent = 1, var/forced = 0)
- // Emagging a machine creates an anomaly in the derez systems.
- if(obj && src.emagged && !src.stat && !forced)
- if((ismob(obj) || istype(obj.loc,/mob)) && prob(50))
- spawn(50) .(obj,silent) // may last a disturbingly long time
- return
- spawned.Remove(obj)
-
- if(!obj)
- return
- var/turf/T = get_turf(obj)
- for(var/atom/movable/AM in obj.contents) // these should be derezed if they were generated
- AM.loc = T
- if(ismob(AM))
- silent = FALSE // otherwise make sure they are dropped
-
- if(!silent)
- visible_message("The [obj.name] fades away!")
- qdel(obj)
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 9ec936c1f2..bb1a0d2f23 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -56,11 +56,8 @@
var/mob/living/carbon/C = user
if(C.gloves)
return FALSE
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(H.dna && H.dna.species)
- if(PIERCEIMMUNE in H.dna.species.species_traits)
- return FALSE
+ if(C.has_trait(TRAIT_PIERCEIMMUNE))
+ return FALSE
var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
if(affecting)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index d15bc4c117..c1a336eb69 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -136,6 +136,10 @@
languages = list(/datum/language/common)
shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
+/datum/language_holder/empty
+ languages = list()
+ shadow_languages = list()
+
/datum/language_holder/universal/New()
..()
grant_all_languages(omnitongue=TRUE)
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index 3aa963ef5e..02c54ffbd3 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -173,18 +173,13 @@
if(!check_spot())
return
-
- var/atom/movable/rcd_target
var/turf/target_turf = get_turf(remote_eye)
+ var/atom/rcd_target = target_turf
- //Find airlocks
- rcd_target = locate(/obj/machinery/door/airlock) in target_turf
-
- if(!rcd_target)
- rcd_target = locate (/obj/structure) in target_turf
-
- if(!rcd_target || !rcd_target.anchored)
- rcd_target = target_turf
+ //Find airlocks and other shite
+ for(var/obj/S in target_turf)
+ if(LAZYLEN(S.rcd_vals(owner,B.RCD)))
+ rcd_target = S //If we don't break out of this loop we'll get the last placed thing
owner.changeNext_move(CLICK_CD_RANGE)
B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely!
@@ -276,4 +271,4 @@ datum/action/innate/aux_base/install_turret/Activate()
B.turret_stock--
to_chat(owner, "Turret installation complete!")
- playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1)
\ No newline at end of file
+ playsound(turret_turf, 'sound/items/drill_use.ogg', 65, 1)
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 66faa7cb2c..632c9e1cba 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -203,7 +203,6 @@
desc = "A large machine releasing a constant gust of air."
anchored = TRUE
density = TRUE
- var/arbitraryatmosblockingvar = TRUE
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 5
CanAtmosPass = ATMOS_PASS_NO
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e5b9ddb4e4..450c2d5d0d 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -789,7 +789,7 @@
agent = "dragon's blood"
desc = "What do dragons have to do with Space Station 13?"
stage_prob = 20
- severity = VIRUS_SEVERITY_BIOHAZARD
+ severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("Your bones ache.")
stage2 = list("Your skin feels scaly.")
diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm
index 9a95bc9a4a..5f99cd8aa2 100644
--- a/code/modules/mob/camera/camera.dm
+++ b/code/modules/mob/camera/camera.dm
@@ -9,10 +9,24 @@
see_in_dark = 7
invisibility = INVISIBILITY_ABSTRACT // No one can see us
sight = SEE_SELF
- move_on_shuttle = 0
+ move_on_shuttle = FALSE
+ var/call_life = FALSE //TRUE if Life() should be called on this camera every tick of the mobs subystem, as if it were a living mob
+
+/mob/camera/Initialize()
+ . = ..()
+ if(call_life)
+ GLOB.living_cameras += src
+
+/mob/camera/Destroy()
+ . = ..()
+ if(call_life)
+ GLOB.living_cameras -= src
/mob/camera/experience_pressure_difference()
return
/mob/camera/forceMove(atom/destination)
loc = destination
+
+/mob/camera/emote(act, m_type=1, message = null)
+ return
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index dd8c84c969..f7b3d15155 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -31,7 +31,7 @@
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
- if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits))
+ if(blood_volume < BLOOD_VOLUME_NORMAL && !has_trait(TRAIT_NOHUNGER))
var/nutrition_ratio = 0
switch(nutrition)
if(0 to NUTRITION_LEVEL_STARVING)
@@ -140,7 +140,7 @@
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS))
+ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)))
@@ -164,13 +164,13 @@
blood_data["donor"] = src
blood_data["viruses"] = list()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
- if(resistances && resistances.len)
- blood_data["resistances"] = resistances.Copy()
+ if(disease_resistances && disease_resistances.len)
+ blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
for(var/datum/reagent/R in reagents.reagent_list)
temp_chem[R.id] = R.volume
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 8b8b8d5761..fe4454caeb 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -202,7 +202,6 @@
return
if(!sterile)
- //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance
target.visible_message("[src] falls limp after violating [target]'s face!", \
"[src] falls limp after violating [target]'s face!")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 8444779a79..ddc4e2e9c1 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -440,7 +440,7 @@
return ..()
/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
- if(dna && dna.species && NOHUNGER in dna.species.species_traits)
+ if(has_trait(TRAIT_NOHUNGER))
return 1
if(nutrition < 100 && !blood)
@@ -754,9 +754,9 @@
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
if(B)
B.damaged_brain = FALSE
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if(D.severity != VIRUS_SEVERITY_POSITIVE)
+ if(D.severity != DISEASE_SEVERITY_POSITIVE)
D.cure(FALSE)
if(admin_revive)
regenerate_limbs()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 56420df35a..4995caaca0 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -110,14 +110,14 @@
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
user.ContactContractDisease(D)
- for(var/thing in user.viruses)
+ for(var/thing in user.diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
if(lying && surgeries.len)
@@ -131,14 +131,14 @@
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
if(can_inject(M, TRUE))
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN) && prob(85))
+ if((D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) && prob(85))
M.ContactContractDisease(D)
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
if(M.a_intent == INTENT_HELP)
@@ -146,7 +146,7 @@
return 0
if(..()) //successful monkey bite.
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
ForceContractDisease(D)
return 1
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 27c64625a8..662a42eea4 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -50,7 +50,7 @@
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(. && mob_has_gravity()) //floating is easy
- if(dna && dna.species && (NOHUNGER in dna.species.species_traits))
+ if(has_trait(TRAIT_NOHUNGER))
nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous
else if(nutrition && stat != DEAD)
nutrition -= HUNGER_FACTOR/10
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index a626266f01..b437b6a4f2 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -80,7 +80,7 @@
/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
- if(!forced && has_dna() && TOXINLOVER in dna.species.species_traits) //damage becomes healing and healing becomes damage
+ if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
amount = -amount
if(amount > 0)
blood_volume -= 5*amount
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 82706b46ee..d090b9f0f7 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -252,10 +252,6 @@
if(91.01 to INFINITY)
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
- for (var/I in src.vore_organs)
- var/datum/belly/B = vore_organs[I]
- msg += B.get_examine_msg()
-
msg += ""
if(!appears_dead)
@@ -329,7 +325,7 @@
if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
msg += "[print_flavor_text()]\n"
-
+
msg += "*---------*"
to_chat(user, msg)
diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm
index 8578db809e..6ef1b687c2 100644
--- a/code/modules/mob/living/carbon/human/examine_vr.dm
+++ b/code/modules/mob/living/carbon/human/examine_vr.dm
@@ -42,13 +42,4 @@
message = "[t_His] stomach is firmly packed with digesting slop. [t_He] must have eaten at least a few times worth their body weight! It looks hard for them to stand, and [t_his] gut jiggles when they move.\n"
if(4075 to 10000) // Four or more people.
message = "[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!\n"
- return message
-
-/mob/living/carbon/human/proc/examine_bellies()
- var/message = ""
-
- for (var/I in src.vore_organs)
- var/datum/belly/B = vore_organs[I]
- message += B.get_examine_msg()
-
return message
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 64ffc91ae7..2061924951 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -32,6 +32,7 @@
/mob/living/carbon/human/Destroy()
QDEL_NULL(physiology)
+ QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff
return ..()
/mob/living/carbon/human/OpenCraftingMenu()
@@ -90,10 +91,10 @@
stat("Radiation Levels:","[radiation] rad")
stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)")
- //Virsuses
- if(viruses.len)
+ //Diseases
+ if(diseases.len)
stat("Viruses:", null)
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
@@ -482,7 +483,7 @@
. = 1 // Default to returning true.
if(user && !target_zone)
target_zone = user.zone_selected
- if(dna && (PIERCEIMMUNE in dna.species.species_traits))
+ if(has_trait(TRAIT_PIERCEIMMUNE))
. = 0
// If targeting the head, see if the head item is thin enough.
// If targeting anything else, see if the wear suit is thin enough.
@@ -643,7 +644,7 @@
to_chat(src, "You fail to perform CPR on [C]!")
return 0
- var/they_breathe = (!(NOBREATH in C.dna.species.species_traits))
+ var/they_breathe = !C.has_trait(TRAIT_NOBREATH)
var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS)
if(C.health > HEALTH_THRESHOLD_CRIT)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index b524e7efc4..c7d2541b08 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -136,7 +136,7 @@
else if(I)
if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
if(can_embed(I))
- if(prob(I.embedding.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits)))
+ if(prob(I.embedding.embed_chance) && !has_trait(TRAIT_PIERCEIMMUNE))
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/bodypart/L = pick(bodyparts)
L.embedded_objects |= I
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 2bc4de894e..60bb0fe497 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human
- hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD)
+ hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD)
possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
pressure_resistance = 25
can_buckle = TRUE
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index c5e4581253..f3f0fe0215 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -138,7 +138,7 @@
if(src.dna.check_mutation(HULK))
to_chat(src, "Your meaty finger is much too large for the trigger guard!")
return FALSE
- if(NOGUNS in src.dna.species.species_traits)
+ if(has_trait(TRAIT_NOGUNS))
to_chat(src, "Your fingers don't fit in the trigger guard!")
return FALSE
if(mind)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 55e0325632..bf9a4492d6 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -20,6 +20,22 @@
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
+// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
+// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
+// The values here should add up to 1.
+// Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30%
+#define THERMAL_PROTECTION_HEAD 0.3
+#define THERMAL_PROTECTION_CHEST 0.15
+#define THERMAL_PROTECTION_GROIN 0.15
+#define THERMAL_PROTECTION_LEG_LEFT 0.075
+#define THERMAL_PROTECTION_LEG_RIGHT 0.075
+#define THERMAL_PROTECTION_FOOT_LEFT 0.025
+#define THERMAL_PROTECTION_FOOT_RIGHT 0.025
+#define THERMAL_PROTECTION_ARM_LEFT 0.075
+#define THERMAL_PROTECTION_ARM_RIGHT 0.075
+#define THERMAL_PROTECTION_HAND_LEFT 0.025
+#define THERMAL_PROTECTION_HAND_RIGHT 0.025
+
/mob/living/carbon/human/Life()
set invisibility = 0
if (notransform)
@@ -48,6 +64,10 @@
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1)))
return ONE_ATMOSPHERE
+ if(istype(loc, /obj/belly))
+ return ONE_ATMOSPHERE
+ if(istype(loc, /obj/item/device/dogborg/sleeper))
+ return ONE_ATMOSPHERE
else
return pressure
@@ -81,7 +101,7 @@
if(!L)
if(health >= HEALTH_THRESHOLD_CRIT)
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
- else if(!(NOCRITDAMAGE in dna.species.species_traits))
+ else if(!has_trait(TRAIT_NOCRITDAMAGE))
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
failed_last_breath = 1
@@ -122,6 +142,8 @@
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
if(ismob(loc))
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
+ if(istype(loc, /obj/belly))
+ return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
//END EDIT
if(wear_suit)
if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT)
@@ -228,16 +250,14 @@
return thermal_protection_flags
/mob/living/carbon/human/proc/get_cold_protection(temperature)
-
- if(dna.check_mutation(COLDRES))
- return TRUE //Fully protected from the cold.
-
- if(RESISTCOLD in dna.species.species_traits)
+ if(has_trait(TRAIT_RESISTCOLD))
return TRUE
-
+
//CITADEL EDIT Mandatory for vore code.
if(istype(loc, /obj/item/device/dogborg/sleeper))
return 1 //freezing to death in sleepers ruins fun.
+ if(istype(loc, /obj/belly))
+ return 1
if(ismob(loc))
return 1 //because lazy and being inside somemone insulates you from space
//END EDIT
@@ -285,16 +305,14 @@
/mob/living/carbon/human/has_smoke_protection()
if(wear_mask)
if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
+ return TRUE
if(glasses)
if(glasses.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
+ return TRUE
if(head)
if(head.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1)
- . = 1
- if(NOBREATH in dna.species.species_traits)
- . = 1
- return .
+ return TRUE
+ return ..()
/mob/living/carbon/human/proc/handle_embedded_objects()
@@ -321,14 +339,14 @@
if(!can_heartattack())
return
- var/we_breath = (!(NOBREATH in dna.species.species_traits))
+ var/we_breath = !has_trait(TRAIT_NOBREATH, SPECIES_TRAIT)
if(!undergoing_cardiac_arrest())
return
- // Cardiac arrest, unless corazone
- if(reagents.get_reagent_amount("corazone"))
+ // Cardiac arrest, unless heart is stabilized
+ if(has_trait(TRAIT_STABLEHEART))
return
if(we_breath)
@@ -430,3 +448,14 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
adjustToxLoss(4) //Let's be honest you shouldn't be alive by now
#undef HUMAN_MAX_OXYLOSS
+#undef THERMAL_PROTECTION_HEAD
+#undef THERMAL_PROTECTION_CHEST
+#undef THERMAL_PROTECTION_GROIN
+#undef THERMAL_PROTECTION_LEG_LEFT
+#undef THERMAL_PROTECTION_LEG_RIGHT
+#undef THERMAL_PROTECTION_FOOT_LEFT
+#undef THERMAL_PROTECTION_FOOT_RIGHT
+#undef THERMAL_PROTECTION_ARM_LEFT
+#undef THERMAL_PROTECTION_ARM_RIGHT
+#undef THERMAL_PROTECTION_HAND_LEFT
+#undef THERMAL_PROTECTION_HAND_RIGHT
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index c601f1445c..c008be1093 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -7,8 +7,8 @@
/mob/living/carbon/human/treat_message(message)
message = dna.species.handle_speech(message,src)
- if(viruses.len)
- for(var/datum/disease/pierrot_throat/D in viruses)
+ if(diseases.len)
+ for(var/datum/disease/pierrot_throat/D in diseases)
var/list/temp_message = splittext(message, " ") //List each word in the message
var/list/pick_list = list()
for(var/i = 1, i <= temp_message.len, i++) //Create a second list for excluding words down the line
@@ -48,14 +48,12 @@
return real_name
/mob/living/carbon/human/IsVocal()
- CHECK_DNA_AND_SPECIES(src)
-
// how do species that don't breathe talk? magic, that's what.
- if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS))
- return 0
+ if(!has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS))
+ return FALSE
if(mind)
return !mind.miming
- return 1
+ return TRUE
/mob/living/carbon/human/proc/SetSpecialVoice(new_voice)
if(new_voice)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3978811236..8a78c1532e 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -53,8 +53,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
- // species flags. these can be found in flags.dm
+ // species-only traits. Can be found in DNA.dm
var/list/species_traits = list()
+ // generic traits tied to having the species
+ var/list/inherent_traits = list()
var/attack_verb = "punch" // punch-specific attack verb
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
@@ -151,8 +153,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/should_have_brain = TRUE
var/should_have_heart = !(NOBLOOD in species_traits)
- var/should_have_lungs = !(NOBREATH in species_traits)
- var/should_have_appendix = !(NOHUNGER in species_traits)
+ var/should_have_lungs = !(TRAIT_NOBREATH in inherent_traits)
+ var/should_have_appendix = !(TRAIT_NOHUNGER in inherent_traits)
var/should_have_eyes = TRUE
var/should_have_ears = TRUE
var/should_have_tongue = TRUE
@@ -287,8 +289,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
C.put_in_hands(new mutanthands())
- if(VIRUSIMMUNE in species_traits)
- for(var/datum/disease/A in C.viruses)
+ for(var/X in inherent_traits)
+ C.add_trait(X, SPECIES_TRAIT)
+
+ if(TRAIT_VIRUSIMMUNE in inherent_traits)
+ for(var/datum/disease/A in C.diseases)
A.cure(FALSE)
//CITADEL EDIT
@@ -304,6 +309,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
C.dna.blood_type = random_blood_type()
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
+ for(var/X in inherent_traits)
+ C.remove_trait(X, SPECIES_TRAIT)
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
H.remove_overlay(HAIR_LAYER)
@@ -855,11 +862,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//END EDIT
/datum/species/proc/spec_life(mob/living/carbon/human/H)
- if(NOBREATH in species_traits)
+ if(H.has_trait(TRAIT_NOBREATH))
H.setOxyLoss(0)
H.losebreath = 0
- var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits))
+ var/takes_crit_damage = (!H.has_trait(TRAIT_NOCRITDAMAGE))
if((H.health < HEALTH_THRESHOLD_CRIT) && takes_crit_damage)
H.adjustBruteLoss(1)
@@ -1111,8 +1118,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_inv_wear_suit()
// nutrition decrease and satiety
- if (H.nutrition > 0 && H.stat != DEAD && \
- H.dna && H.dna.species && (!(NOHUNGER in H.dna.species.species_traits)))
+ if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
if(H.satiety > 0)
@@ -1136,7 +1142,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.nutrition > NUTRITION_LEVEL_FAT)
H.metabolism_efficiency = 1
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
- if(H.metabolism_efficiency != 1.25 && (H.dna && H.dna.species && !(NOHUNGER in H.dna.species.species_traits)))
+ if(H.metabolism_efficiency != 1.25 && !H.has_trait(TRAIT_NOHUNGER))
to_chat(H, "You feel vigorous.")
H.metabolism_efficiency = 1.25
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
@@ -1165,7 +1171,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
. = FALSE
var/radiation = H.radiation
- if(RADIMMUNE in species_traits)
+ if(H.has_trait(TRAIT_RADIMMUNE))
radiation = 0
return TRUE
@@ -1285,7 +1291,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
add_logs(user, target, "shaked")
return 1
else
- var/we_breathe = (!(NOBREATH in user.dna.species.species_traits))
+ var/we_breathe = !user.has_trait(TRAIT_NOBREATH)
var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS)
if(we_breathe && we_lung)
@@ -1483,7 +1489,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//dismemberment
var/probability = I.get_dismemberment_chance(affecting)
- if(prob(probability) || ((EASYDISMEMBER in species_traits) && prob(2*probability)))
+ if(prob(probability) || (H.has_trait(TRAIT_EASYDISMEMBER) && prob(2*probability)))
if(affecting.dismember(I.damtype))
I.add_mob_blood(H)
playsound(get_turf(H), I.get_dismember_sound(), 80, 1)
@@ -1612,7 +1618,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/////////////
/datum/species/proc/breathe(mob/living/carbon/human/H)
- if(NOBREATH in species_traits)
+ if(H.has_trait(TRAIT_NOBREATH))
return TRUE
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
@@ -1644,7 +1650,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
// +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt.
- if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHOT in species_traits))
+ if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT))
//Body temperature is too hot.
var/burn_damage
switch(H.bodytemperature)
@@ -1683,7 +1689,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
- if(!(RESISTPRESSURE in species_traits))
+ if(!H.has_trait(TRAIT_RESISTHIGHPRESSURE))
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod)
H.throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
@@ -1695,7 +1701,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
- if(H.dna.check_mutation(COLDRES) || (RESISTPRESSURE in species_traits))
+ if(H.has_trait(TRAIT_RESISTLOWPRESSURE))
H.clear_alert("pressure")
else
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod)
@@ -1706,7 +1712,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//////////
/datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
- if(NOFIRE in species_traits)
+ if(H.has_trait(TRAIT_NOFIRE))
return
if(H.on_fire)
//the fire tries to damage the exposed clothes and items
@@ -1773,7 +1779,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12))
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)
- if(NOFIRE in species_traits)
+ if(H.has_trait(TRAIT_NOFIRE))
return FALSE
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 447245cad0..54549b15b9 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -3,7 +3,8 @@
id = "abductor"
say_mod = "gibbers"
sexes = FALSE
- species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER,NOEYES)
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
+ inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
var/scientist = FALSE // vars to not pollute spieces list with castes
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 4badfa8405..0178a99dad 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -2,7 +2,8 @@
name = "Android"
id = "android"
say_mod = "states"
- species_traits = list(SPECIES_ROBOTIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOBLOOD,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT)
+ species_traits = list(SPECIES_ROBOTIC,NOBLOOD)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
meat = null
damage_overlay_type = "synth"
mutanttongue = /obj/item/organ/tongue/robot
diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm
index bc1fcc9b1e..552e413f4d 100644
--- a/code/modules/mob/living/carbon/human/species_types/corporate.dm
+++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm
@@ -15,5 +15,6 @@
attack_sound = 'sound/weapons/resonator_blast.ogg'
blacklisted = 1
use_skintones = 0
- species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER)
- sexes = 0
\ No newline at end of file
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
+ sexes = 0
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 78cf1a3b7a..3a0e5a8415 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -2,7 +2,8 @@
name = "dullahan"
id = "dullahan"
default_color = "FFFFFF"
- species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS,NOBREATH,NOHUNGER)
+ species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
+ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 05e428de40..2208c5a597 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -248,7 +248,8 @@
name = "Slimeperson"
id = "slimeperson"
default_color = "00FFFF"
- species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,TOXINLOVER)
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "taur")
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None")
say_mod = "says"
@@ -351,3 +352,10 @@
H.update_body()
else
return
+
+//misc
+/mob/living/carbon/human/dummy
+ no_vore = TRUE
+
+/mob/living/carbon/human/vore
+ devourable = TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 3619e04584..d274261a2b 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -2,7 +2,8 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
mutant_organs = list(/obj/item/organ/adamantine_resonator)
speedmod = 2
armor = 55
@@ -84,7 +85,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/stack/ore/plasma
//Can burn and takes damage from heat
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -258,7 +259,7 @@
fixed_mut_color = "49311c"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
- species_traits = list(SPECIES_ORGANIC,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -565,7 +566,7 @@
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie."
- species_traits = list(SPECIES_INORGANIC,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOEYES) //no mutcolors
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors
prefix = "Runic"
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
@@ -619,7 +620,7 @@
limbs_id = "clockgolem"
info_text = "As a clockwork golem, you are faster than \
other types of golem (being a machine), and are immune to electric shocks."
- species_traits = list(SPECIES_INORGANIC,NO_UNDERWEAR, NOTRANSSTING, NOBREATH, NOZOMBIE, RADIMMUNE, NOBLOOD, RESISTCOLD, RESISTPRESSURE, PIERCEIMMUNE, NOEYES)
+ species_traits = list(SPECIES_ROBOTIC,NOBLOOD,NO_UNDERWEAR,NOEYES)
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
@@ -671,7 +672,8 @@
limbs_id = "clothgolem"
sexes = FALSE
info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable."
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS)
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
speedmod = 1 // not as heavy as stone
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index f32588d6b3..2297fffa97 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -4,7 +4,8 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
- species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,HAIR,FACEHAIR,TOXINLOVER) //CIT CHANGE - adds HAIR and FACEHAIR to species traits
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,,HAIR,FACEHAIR,NOBLOOD)
+ inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "taur") //CIT CHANGE
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") //CIT CHANGE
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
@@ -118,6 +119,7 @@
name = "Slimeperson"
id = "slime"
default_color = "00FFFF"
+ species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 0d006196aa..15c8f70dc8 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -54,4 +54,5 @@
name = "Ash Walker"
id = "ashlizard"
limbs_id = "lizard"
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE)
+ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
+ inherent_traits = list(TRAIT_NOGUNS,TRAIT_NOBREATH)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index a5c6720db5..5209fe8310 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -4,7 +4,8 @@
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
- species_traits = list(SPECIES_INORGANIC,NOBLOOD,RESISTCOLD,RADIMMUNE,NOTRANSSTING,NOHUNGER)
+ species_traits = list(SPECIES_INORGANIC,NOBLOOD,NOTRANSSTING)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
mutantliver = /obj/item/organ/liver/plasmaman
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 9357855191..17e7649cb6 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -9,7 +9,8 @@
blacklisted = 1
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
- species_traits = list(SPECIES_ORGANIC,NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,NOEYES)
+ species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
dangerous_existence = 1
mutanteyes = /obj/item/organ/eyes/night_vision
@@ -37,7 +38,8 @@
burnmod = 1.5
blacklisted = TRUE
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store)
- species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING,NOEYES)
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutant_organs = list(/obj/item/organ/heart/nightmare)
mutant_brain = /obj/item/organ/brain/nightmare
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index d47f3d71d5..c6a7e7a127 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -6,7 +6,8 @@
blacklisted = 1
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT)
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT)
mutanttongue = /obj/item/organ/tongue/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 856a472a73..786872544e 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -3,13 +3,15 @@
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
- species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER) //all of these + whatever we inherit from the real species
+ species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //all of these + whatever we inherit from the real species
+ inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
dangerous_existence = 1
blacklisted = 1
meat = null
damage_overlay_type = "synth"
limbs_id = "synth"
- var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING,NOBREATH,VIRUSIMMUNE,NODISMEMBER,NOHUNGER,NO_DNA_COPY) //for getting these values back for assume_disguise()
+ var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //for getting these values back for assume_disguise()
+ var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
@@ -41,7 +43,9 @@
say_mod = S.say_mod
sexes = S.sexes
species_traits = initial_species_traits.Copy()
+ inherent_traits = initial_inherent_traits.Copy()
species_traits |= S.species_traits
+ inherent_traits |= S.inherent_traits
species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD)
attack_verb = S.attack_verb
attack_sound = S.attack_sound
@@ -61,6 +65,7 @@
name = initial(name)
say_mod = initial(say_mod)
species_traits = initial_species_traits.Copy()
+ inherent_traits = initial_inherent_traits.Copy()
attack_verb = initial(attack_verb)
attack_sound = initial(attack_sound)
miss_sound = initial(miss_sound)
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 5186811331..2267be85f2 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -2,7 +2,8 @@
name = "vampire"
id = "vampire"
default_color = "FFFFFF"
- species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD)
+ species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
+ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human", "ears", "wings")
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
exotic_bloodtype = "U"
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 14502aa931..7fcc470661 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -8,7 +8,8 @@
sexes = 0
blacklisted = 1
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
- species_traits = list(SPECIES_UNDEAD,NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING)
+ species_traits = list(SPECIES_UNDEAD,NOBLOOD,NOZOMBIE,NOTRANSSTING)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
disliked_food = NONE
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8cbbc2b90f..e5c82f0ead 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -52,6 +52,8 @@
return
if(ismob(loc))
return
+ if(istype(loc, /obj/belly))
+ return
var/datum/gas_mixture/environment
if(loc)
@@ -102,7 +104,9 @@
air_update_turf()
/mob/living/carbon/proc/has_smoke_protection()
- return 0
+ if(has_trait(TRAIT_NOBREATH))
+ return TRUE
+ return FALSE
//Third link in a breath chain, calls handle_breath_temperature()
@@ -249,7 +253,7 @@
O.on_life()
/mob/living/carbon/handle_diseases()
- for(var/thing in viruses)
+ for(var/thing in diseases)
var/datum/disease/D = thing
if(prob(D.infectivity))
D.spread()
@@ -434,10 +438,10 @@
L.damage += d
/mob/living/carbon/proc/liver_failure()
- if(reagents.get_reagent_amount("corazone"))//corazone is processed here an not in the liver because a failing liver can't metabolize reagents
- reagents.remove_reagent("corazone", 0.4) //corazone slowly deletes itself.
+ reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE)
+ if(has_trait(TRAIT_STABLEHEART))
return
- adjustToxLoss(8, TRUE, TRUE)
+ adjustToxLoss(8, TRUE, TRUE)
if(prob(30))
to_chat(src, "You feel confused and nauseous...")//actual symptoms of liver failure
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 32b368db4f..79c9613906 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -1,3 +1,4 @@
+#define MAX_RANGE_FIND 32
/mob/living/carbon/monkey
var/aggressive=0 // set to 1 using VV for an angry monkey
@@ -475,3 +476,5 @@
if(A)
dropItemToGround(A, TRUE)
update_icons()
+
+#undef MAX_RANGE_FIND
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 8043f055bb..0c63ad2ab4 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -54,9 +54,6 @@
handle_fire()
- // Citadel Vore code for belly processes
- handle_internal_contents()
-
//stuff in the stomach
handle_stomach()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c78d8b19d7..dcd3789360 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -48,7 +48,7 @@
staticOverlays.len = 0
remove_from_all_data_huds()
GLOB.mob_living_list -= src
-
+ QDEL_LIST(diseases)
return ..()
/mob/living/ghostize(can_reenter_corpse = 1)
@@ -108,24 +108,24 @@
/mob/living/proc/MobCollide(mob/M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
- //Also diseases
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- M.ContactContractDisease(D)
-
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- ContactContractDisease(D)
if(now_pushing)
return TRUE
-
- //Should stop you pushing a restrained person out of the way
if(isliving(M))
var/mob/living/L = M
+ //Also spread diseases
+ for(var/thing in diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ L.ContactContractDisease(D)
+
+ for(var/thing in L.diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ ContactContractDisease(D)
+
+ //Should stop you pushing a restrained person out of the way
if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
to_chat(src, "[L] is restrained, you cannot push past.")
@@ -224,6 +224,60 @@
AM.setDir(current_dir)
now_pushing = 0
+/mob/living/start_pulling(atom/movable/AM, supress_message = 0)
+ if(!AM || !src)
+ return FALSE
+ if(!(AM.can_be_pulled(src)))
+ return FALSE
+ if(throwing || incapacitated())
+ return FALSE
+
+ AM.add_fingerprint(src)
+
+ // If we're pulling something then drop what we're currently pulling and pull this instead.
+ if(pulling)
+ // Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
+ if(AM == pulling)
+ return
+ stop_pulling()
+
+ changeNext_move(CLICK_CD_GRABBING)
+
+ if(AM.pulledby)
+ if(!supress_message)
+ visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.")
+ add_logs(AM, AM.pulledby, "pulled from", src)
+ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+
+ pulling = AM
+ AM.pulledby = src
+ if(!supress_message)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ update_pull_hud_icon()
+
+ if(ismob(AM))
+ var/mob/M = AM
+
+ add_logs(src, M, "grabbed", addition="passive grab")
+ if(!supress_message)
+ visible_message("[src] has grabbed [M] passively!")
+ if(!iscarbon(src))
+ M.LAssailant = null
+ else
+ M.LAssailant = usr
+ if(isliving(M))
+ var/mob/living/L = M
+ //Share diseases that are spread by touch
+ for(var/thing in diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ L.ContactContractDisease(D)
+
+ for(var/thing in L.diseases)
+ var/datum/disease/D = thing
+ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
+ ContactContractDisease(D)
+
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1))
@@ -235,6 +289,15 @@
else
stop_pulling()
+/mob/living/stop_pulling()
+ ..()
+ update_pull_hud_icon()
+
+/mob/living/verb/stop_pulling1()
+ set name = "Stop Pulling"
+ set category = "IC"
+ stop_pulling()
+
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(incapacitated())
@@ -1074,3 +1137,54 @@
return FALSE
mob_pickup(user)
return TRUE
+
+/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects
+ if(!LAZYLEN(diseases))
+ return
+ var/list/datum/disease/result = list()
+ for(var/datum/disease/D in diseases)
+ var/static_virus = D.Copy()
+ result += static_virus
+ return result
+
+/mob/living/reset_perspective(atom/A)
+ if(..())
+ update_sight()
+ if(client.eye && client.eye != src)
+ var/atom/AT = client.eye
+ AT.get_remote_view_fullscreens(src)
+ else
+ clear_fullscreen("remote_view", 0)
+ update_pipe_vision()
+
+/mob/living/vv_edit_var(var_name, var_value)
+ switch(var_name)
+ if("stat")
+ if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life
+ GLOB.dead_mob_list -= src
+ GLOB.alive_mob_list += src
+ if((stat < DEAD) && (var_value == DEAD))//Kill he
+ GLOB.alive_mob_list -= src
+ GLOB.dead_mob_list += src
+ . = ..()
+ switch(var_name)
+ if("knockdown")
+ SetKnockdown(var_value)
+ if("stun")
+ SetStun(var_value)
+ if("unconscious")
+ SetUnconscious(var_value)
+ if("sleeping")
+ SetSleeping(var_value)
+ if("eye_blind")
+ set_blindness(var_value)
+ if("eye_damage")
+ set_eye_damage(var_value)
+ if("eye_blurry")
+ set_blurriness(var_value)
+ if("maxHealth")
+ updatehealth()
+ if("resize")
+ update_transform()
+ if("lighting_alpha")
+ sync_lighting_plane_alpha()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index f5c00b874a..f31d95a9d7 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -107,3 +107,7 @@
var/radiation = 0 //If the mob is irradiated.
var/ventcrawl_layer = PIPING_LAYER_DEFAULT
var/losebreath = 0
+
+ //List of active diseases
+ var/list/diseases = list() // list of all diseases in a mob
+ var/list/disease_resistances = list()
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 97034d389c..ae95a317a3 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -50,7 +50,7 @@
var/turf/T = get_turf(src)
var/area/A = get_area(src)
switch(requires_power)
- if(POWER_REQ_NONE)
+ if(NONE)
return FALSE
if(POWER_REQ_ALL)
return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index b55fa2a663..75f0fb5e81 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -154,6 +154,7 @@
return 1
return 0
+#undef VOX_DELAY
#endif
/mob/living/silicon/ai/could_speak_in_language(datum/language/dt)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index cc17d8e4bd..2a2cda19e0 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -511,7 +511,7 @@
Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"}
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
dat += {"Infection Detected.
Name: [D.name]
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 6946c8992f..4cf1f6b13f 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -383,12 +383,12 @@
return TRUE
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
- for(var/thing in C.viruses)
+ for(var/thing in C.diseases)
var/datum/disease/D = thing
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \
- && D.severity != VIRUS_SEVERITY_POSITIVE \
- && (D.stage > 1 || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne.
+ && D.severity != DISEASE_SEVERITY_POSITIVE \
+ && (D.stage > 1 || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne.
return TRUE //STOP DISEASE FOREVER
return FALSE
@@ -435,12 +435,12 @@
else
if(treat_virus)
var/virus = 0
- for(var/thing in C.viruses)
+ for(var/thing in C.diseases)
var/datum/disease/D = thing
//detectable virus
if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC)))
- if(D.severity != VIRUS_SEVERITY_POSITIVE) //virus is harmful
- if((D.stage > 1) || (D.spread_flags & VIRUS_SPREAD_AIRBORNE))
+ if(D.severity != DISEASE_SEVERITY_POSITIVE) //virus is harmful
+ if((D.stage > 1) || (D.spread_flags & DISEASE_SPREAD_AIRBORNE))
virus = 1
if(!reagent_id && (virus))
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 1c12b48919..71aea41e51 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -340,12 +340,9 @@
/mob/living/simple_animal/hostile/construct/harvester/AttackingTarget()
if(iscarbon(target))
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(H.dna && H.dna.species)
- if(NODISMEMBER in H.dna.species.species_traits)
- return ..() //ATTACK!
var/mob/living/carbon/C = target
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return ..() //ATTACK!
var/list/parts = list()
var/undismembermerable_limbs = 0
for(var/X in C.bodyparts)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 8207f321cd..edb6e47ca8 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -106,7 +106,7 @@
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
- var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden))
+ var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/device/electronic_assembly))
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
if(can_see(targets_from, HM, vision_range))
@@ -209,6 +209,11 @@
return FALSE
return TRUE
+ if(istype(the_target, /obj/item/device/electronic_assembly))
+ var/obj/item/device/electronic_assembly/O = the_target
+ if(O.combat_circuits)
+ return TRUE
+
if(istype(the_target, /obj/structure/destructible/clockwork/ocular_warden))
var/obj/structure/destructible/clockwork/ocular_warden/OW = the_target
if(OW.target != src)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
index 898a2ad734..1af22a8960 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm
@@ -1,26 +1,27 @@
/mob/living/simple_animal/hostile/megafauna/dragon
vore_active = TRUE
+ no_vore = FALSE
/mob/living/simple_animal/hostile/megafauna/dragon/Initialize()
// Create and register 'stomachs'
- var/datum/belly/megafauna/dragon/maw/maw = new(src)
- var/datum/belly/megafauna/dragon/gullet/gullet = new(src)
- var/datum/belly/megafauna/dragon/gut/gut = new(src)
- for(var/datum/belly/X in list(maw, gullet, gut))
- vore_organs[X.name] = X
+ var/obj/belly/megafauna/dragon/maw/maw = new(src)
+ var/obj/belly/megafauna/dragon/gullet/gullet = new(src)
+ var/obj/belly/megafauna/dragon/gut/gut = new(src)
+// for(var/obj/belly/X in list(maw, gullet, gut))
+// vore_organs[X.name] = X
// Connect 'stomachs' together
maw.transferlocation = gullet
gullet.transferlocation = gut
- vore_selected = maw.name // NPC eats into maw
+ vore_selected = maw // NPC eats into maw
return ..()
-/datum/belly/megafauna/dragon
+/obj/belly/megafauna/dragon
human_prey_swallow_time = 50 // maybe enough to switch targets if distracted
nonhuman_prey_swallow_time = 50
-/datum/belly/megafauna/dragon/maw
+/obj/belly/megafauna/dragon/maw
name = "maw"
- inside_flavor = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond."
+ desc = "The maw of the dreaded Ash drake closes around you, engulfing you into a swelteringly hot, disgusting enviroment. The acidic saliva tingles over your form while that tongue pushes you further back...towards the dark gullet beyond."
vore_verb = "scoop"
vore_sound = 'sound/vore/pred/taurswallow.ogg'
swallow_time = 20
@@ -30,9 +31,9 @@
autotransferchance = 66
autotransferwait = 200
-/datum/belly/megafauna/dragon/gullet
+/obj/belly/megafauna/dragon/gullet
name = "gullet"
- inside_flavor = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you."
+ desc = "A ripple of muscle and arching of the tongue pushes you down like any other food. No choice in the matter, you're simply consumed. The dark ambiance of the outside world is replaced with working, wet flesh. Your only light being what you brought with you."
swallow_time = 60 // costs extra time to eat directly to here
escapechance = 5
// From above, will transfer into gut
@@ -40,10 +41,10 @@
autotransferchance = 50
autotransferwait = 200
-/datum/belly/megafauna/dragon/gut
+/obj/belly/megafauna/dragon/gut
name = "stomach"
vore_capacity = 5 //I doubt this many people will actually last in the gut, but...
- inside_flavor = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny."
+ desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny."
digest_mode = DM_DRAGON
digest_burn = 5
swallow_time = 100 // costs extra time to eat directly to here
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 670d571d4d..7259a730e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -101,15 +101,19 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
var/destroy_objects = 0
var/knockdown_people = 0
var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes")
+ var/overlay_googly_eyes = TRUE
+ var/idledamage = TRUE
gold_core_spawnable = NO_SPAWN
-/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0)
+/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0, no_googlies = FALSE)
. = ..()
+ if (no_googlies)
+ overlay_googly_eyes = FALSE
CopyObject(copy, creator, destroy_original)
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
- if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
+ if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
adjustBruteLoss(1)
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
death()
@@ -143,7 +147,8 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
icon_state = O.icon_state
icon_living = icon_state
copy_overlays(O)
- add_overlay(googly_eyes)
+ if (overlay_googly_eyes)
+ add_overlay(googly_eyes)
if(isstructure(O) || ismachinery(O))
health = (anchored * 50) + 50
destroy_objects = 1
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 09eb099ae7..61e7153434 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -103,7 +103,8 @@
stack_trace("Simple animal being instantiated in nullspace")
if(vore_active)
init_belly()
- verbs |= /mob/living/proc/animal_nom
+ if(!IsAdvancedToolUser())
+ verbs |= /mob/living/simple_animal/proc/animal_nom
/mob/living/simple_animal/Destroy()
GLOB.simple_animals[AIStatus] -= src
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 2eca841c17..72459cc74d 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -7,18 +7,18 @@
var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)
var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted
var/vore_escape_chance = 25 // Chance of resisting out of mob
+ var/vore_absorb_chance = 0 // chance of absorbtion by mob
var/vore_stomach_name // The name for the first belly if not "stomach"
var/vore_stomach_flavor // The flavortext for the first belly if not the default
var/vore_fullness = 0 // How "full" the belly is (controls icons)
+ var/list/living_mobs = list()
// Release belly contents beforey being gc'd!
/mob/living/simple_animal/Destroy()
- for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
+ release_vore_contents()
prey_excludes.Cut()
. = ..()
@@ -34,10 +34,10 @@
vore_fullness = new_fullness
-
+/*
/mob/living/simple_animal/proc/swallow_check()
for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
+ var/obj/belly/B = vore_organs[I]
if(vore_active)
update_fullness()
if(!vore_fullness)
@@ -48,16 +48,14 @@
/mob/living/simple_animal/proc/swallow_mob()
for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- for(var/mob/living/M in B.internal_contents)
- B.transfer_contents(M, B.transferlocation)
-
+ var/obj/belly/B = vore_organs[I]
+ for(var/mob/living/M in B.contents)
+ B.transfer_contents(M, transferlocation)
+*/
/mob/living/simple_animal/death()
- for(var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- B.release_all_contents() // When your stomach is empty
- ..() // then you have my permission to die.
+ release_vore_contents()
+ . = ..()
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/proc/init_belly()
@@ -66,18 +64,19 @@
if(no_vore) //If it can't vore, let's not give it a stomach.
return
- var/datum/belly/B = new /datum/belly(src)
- B.immutable = TRUE
+ var/obj/belly/B = new /obj/belly(src)
+ vore_selected = B
+ B.immutable = 1
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
- B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
+ B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
B.escapable = vore_escape_chance > 0
B.escapechance = vore_escape_chance
B.digestchance = vore_digest_chance
+ B.absorbchance = vore_absorb_chance
B.human_prey_swallow_time = swallowTime
B.nonhuman_prey_swallow_time = swallowTime
B.vore_verb = "swallow"
- // TODO - Customizable per mob
B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
"The insides knead at you gently for a moment.",
"The guts glorp wetly around you as some air shifts.",
@@ -98,5 +97,21 @@
"The juices pooling beneath you sizzle against your sore skin.",
"The churning walls slowly pulverize you into meaty nutrients.",
"The stomach glorps and gurgles as it tries to work you into slop.")
- src.vore_organs[B.name] = B
- src.vore_selected = B.name
+/* B.emote_lists[DM_ITEMWEAK] = list(
+ "The burning acids eat away at your form.",
+ "The muscular stomach flesh grinds harshly against you.",
+ "The caustic air stings your chest when you try to breathe.",
+ "The slimy guts squeeze inward to help the digestive juices soften you up.",
+ "The onslaught against your body doesn't seem to be letting up; you're food now.",
+ "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
+ "The juices pooling beneath you sizzle against your sore skin.",
+ "The churning walls slowly pulverize you into meaty nutrients.",
+ "The stomach glorps and gurgles as it tries to work you into slop.")*/
+
+//Grab = Nomf
+/*
+/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity)
+ . = ..()
+
+ if(a_intent == I_GRAB && isliving(A) && !has_hands)
+ animal_nom(A)*/
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4b53435b86..7deed01390 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -11,7 +11,6 @@
var/mob/dead/observe = M
observe.reset_perspective(null)
qdel(hud_used)
- QDEL_LIST(viruses)
for(var/cc in client_colours)
qdel(cc)
client_colours = null
@@ -287,16 +286,6 @@
client.eye = loc
return 1
-/mob/living/reset_perspective(atom/A)
- if(..())
- update_sight()
- if(client.eye && client.eye != src)
- var/atom/AT = client.eye
- AT.get_remote_view_fullscreens(src)
- else
- clear_fullscreen("remote_view", 0)
- update_pipe_vision()
-
/mob/proc/show_inv(mob/user)
return
@@ -333,60 +322,6 @@
return 1
-//this and stop_pulling really ought to be /mob/living procs
-/mob/start_pulling(atom/movable/AM, supress_message = 0)
- if(!AM || !src)
- return FALSE
- if(!(AM.can_be_pulled(src)))
- return FALSE
- if(throwing || incapacitated())
- return FALSE
-
- AM.add_fingerprint(src)
-
- // If we're pulling something then drop what we're currently pulling and pull this instead.
- if(pulling)
- // Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
- if(AM == pulling)
- return
- stop_pulling()
-
- changeNext_move(CLICK_CD_GRABBING)
-
- if(AM.pulledby)
- if(!supress_message)
- visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.")
- add_logs(AM, AM.pulledby, "pulled from", src)
- AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
-
- pulling = AM
- AM.pulledby = src
- if(!supress_message)
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- update_pull_hud_icon()
-
- if(ismob(AM))
- var/mob/M = AM
-
- //Share diseases that are spread by touch
- for(var/thing in viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- M.ContactContractDisease(D)
-
- for(var/thing in M.viruses)
- var/datum/disease/D = thing
- if(D.spread_flags & VIRUS_SPREAD_CONTACT_SKIN)
- ContactContractDisease(D)
-
- add_logs(src, M, "grabbed", addition="passive grab")
- if(!supress_message)
- visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!")
- if(!iscarbon(src))
- M.LAssailant = null
- else
- M.LAssailant = usr
-
/mob/proc/can_resist()
return FALSE //overridden in living.dm
@@ -409,15 +344,6 @@
setDir(D)
spintime -= speed
-/mob/stop_pulling()
- ..()
- update_pull_hud_icon()
-
-/mob/verb/stop_pulling1()
- set name = "Stop Pulling"
- set category = "IC"
- stop_pulling()
-
/mob/proc/update_pull_hud_icon()
if(hud_used)
if(hud_used.pull_icon)
@@ -927,39 +853,6 @@
if (L)
L.alpha = lighting_alpha
-/mob/living/vv_edit_var(var_name, var_value)
- switch(var_name)
- if("stat")
- if((stat == DEAD) && (var_value < DEAD))//Bringing the dead back to life
- GLOB.dead_mob_list -= src
- GLOB.alive_mob_list += src
- if((stat < DEAD) && (var_value == DEAD))//Kill he
- GLOB.alive_mob_list -= src
- GLOB.dead_mob_list += src
- . = ..()
- switch(var_name)
- if("knockdown")
- SetKnockdown(var_value)
- if("stun")
- SetStun(var_value)
- if("unconscious")
- SetUnconscious(var_value)
- if("sleeping")
- SetSleeping(var_value)
- if("eye_blind")
- set_blindness(var_value)
- if("eye_damage")
- set_eye_damage(var_value)
- if("eye_blurry")
- set_blurriness(var_value)
- if("maxHealth")
- updatehealth()
- if("resize")
- update_transform()
- if("lighting_alpha")
- sync_lighting_plane_alpha()
-
-
/mob/proc/is_literate()
return 0
@@ -969,15 +862,6 @@
/mob/proc/get_idcard()
return
-/mob/proc/get_static_viruses() //used when creating blood and other infective objects
- if(!LAZYLEN(viruses))
- return
- var/list/datum/disease/diseases = list()
- for(var/datum/disease/D in viruses)
- var/static_virus = D.Copy()
- diseases += static_virus
- return diseases
-
/mob/vv_get_dropdown()
. = ..()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index d4bebd6303..0088e09515 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -82,10 +82,6 @@
var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap.
-//List of active diseases
-
- var/list/viruses = list() // list of all diseases in a mob
- var/list/resistances = list()
var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 989c8278a5..3b9930faa9 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -363,8 +363,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
if(M.mind in SSticker.mode.apprentices)
return 2
if("monkey")
- if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses))
- return 2
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases))
+ return 2
return TRUE
if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum!
return TRUE
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index a4d234ded7..39a0bba701 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -98,7 +98,7 @@ proc/get_top_level_mob(var/mob/S)
return FALSE
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
- message = "[user] " + message
+ message = "[user] " + "[message]"
for(var/mob/M in GLOB.dead_mob_list)
if(!M.client || isnewplayer(M))
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 64454b130e..240c4edd9f 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -62,9 +62,9 @@
//keep viruses?
if (tr_flags & TR_KEEPVIRUS)
- O.viruses = viruses
- viruses = list()
- for(var/thing in O.viruses)
+ O.diseases = diseases
+ diseases = list()
+ for(var/thing in O.diseases)
var/datum/disease/D = thing
D.affected_mob = O
@@ -218,9 +218,9 @@
//keep viruses?
if (tr_flags & TR_KEEPVIRUS)
- O.viruses = viruses
- viruses = list()
- for(var/thing in O.viruses)
+ O.diseases = diseases
+ diseases = list()
+ for(var/thing in O.diseases)
var/datum/disease/D = thing
D.affected_mob = O
O.med_hud_set_status()
diff --git a/code/modules/ninja/__ninjaDefines.dm b/code/modules/ninja/__ninjaDefines.dm
index 352087f4e8..1a3e9dce63 100644
--- a/code/modules/ninja/__ninjaDefines.dm
+++ b/code/modules/ninja/__ninjaDefines.dm
@@ -18,7 +18,6 @@ Contents:
#define INVALID_DRAIN "INVALID" //This one is if the drain proc needs to cancel, eg missing variables, etc, it's important.
-#define DRAIN_RD_HACKED "RDHACK"
#define DRAIN_RD_HACK_FAILED "RDHACKFAIL"
#define DRAIN_MOB_SHOCK "MOBSHOCK"
#define DRAIN_MOB_SHOCK_FAILED "MOBSHOCKFAIL"
\ No newline at end of file
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 45149d1346..d160209e0c 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -18,6 +18,11 @@ field_generator power level display
#define FG_CHARGING 1
#define FG_ONLINE 2
+//field generator construction defines
+#define FG_UNSECURED 0
+#define FG_SECURED 1
+#define FG_WELDED 2
+
/obj/machinery/field/generator
name = "field generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 85fc5b234b..49eb7535d8 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -25,7 +25,7 @@
/obj/machinery/power/tesla_coil/Initialize()
. = ..()
- wires = new /datum/wires/tesla_coil(src)
+// wires = new /datum/wires/tesla_coil(src) //CITADEL EDIT, Kevinz you cheaty fuccboi.
linked_techweb = SSresearch.science_tech
/obj/machinery/power/tesla_coil/RefreshParts()
@@ -79,8 +79,6 @@
/obj/machinery/power/tesla_coil/tesla_act(var/power)
if(anchored && !panel_open)
obj_flags |= BEING_SHOCKED
- //don't lose arc power when it's not connected to anything
- //please place tesla coils all around the station to maximize effectiveness
var/power_produced = powernet ? power / power_loss : power
add_avail(power_produced*input_power_multiplier)
flick("coilhit", src)
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 5c463b4ee9..d01a331364 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -81,14 +81,8 @@
#define COMPFRICTION 5e5
-#define COMPSTARTERLOAD 2800
-// Crucial to make things work!!!!
-// OLD FIX - explanation given down below.
-// /obj/machinery/power/compressor/CanPass(atom/movable/mover, turf/target)
-// return !density
-
/obj/machinery/power/compressor/locate_machinery()
if(turbine)
return
@@ -169,7 +163,6 @@
// These are crucial to working of a turbine - the stats modify the power output. TurbGenQ modifies how much raw energy can you get from
// rpms, TurbGenG modifies the shape of the curve - the lower the value the less straight the curve is.
-#define TURBPRES 9000000
#define TURBGENQ 100000
#define TURBGENG 0.5
@@ -370,3 +363,7 @@
if("reconnect")
locate_machinery()
. = TRUE
+
+#undef COMPFRICTION
+#undef TURBGENQ
+#undef TURBGENG
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
similarity index 100%
rename from code/modules/projectiles/ammunition.dm
rename to code/modules/projectiles/ammunition/_ammunition.dm
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/ammunition/_firing.dm
similarity index 100%
rename from code/modules/projectiles/firing.dm
rename to code/modules/projectiles/ammunition/_firing.dm
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
deleted file mode 100644
index df0fd7278e..0000000000
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ /dev/null
@@ -1,314 +0,0 @@
-// .357 (Syndie Revolver)
-
-/obj/item/ammo_casing/a357
- name = ".357 bullet casing"
- desc = "A .357 bullet casing."
- caliber = "357"
- projectile_type = /obj/item/projectile/bullet/a357
-
-// 7.62 (Nagant Rifle)
-
-/obj/item/ammo_casing/a762
- name = "7.62 bullet casing"
- desc = "A 7.62 bullet casing."
- icon_state = "762-casing"
- caliber = "a762"
- projectile_type = /obj/item/projectile/bullet/a762
-
-/obj/item/ammo_casing/a762/enchanted
- projectile_type = /obj/item/projectile/bullet/a762_enchanted
-
-// 7.62x38mmR (Nagant Revolver)
-
-/obj/item/ammo_casing/n762
- name = "7.62x38mmR bullet casing"
- desc = "A 7.62x38mmR bullet casing."
- caliber = "n762"
- projectile_type = /obj/item/projectile/bullet/n762
-
-// .50AE (Desert Eagle)
-
-/obj/item/ammo_casing/a50AE
- name = ".50AE bullet casing"
- desc = "A .50AE bullet casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/a50AE
-
-// .38 (Detective's Gun)
-
-/obj/item/ammo_casing/c38
- name = ".38 bullet casing"
- desc = "A .38 bullet casing."
- caliber = "38"
- projectile_type = /obj/item/projectile/bullet/c38
-
-// 10mm (Stechkin)
-
-/obj/item/ammo_casing/c10mm
- name = ".10mm bullet casing"
- desc = "A 10mm bullet casing."
- caliber = "10mm"
- projectile_type = /obj/item/projectile/bullet/c10mm
-
-/obj/item/ammo_casing/c10mm/ap
- name = ".10mm armor-piercing bullet casing"
- desc = "A 10mm armor-piercing bullet casing."
- projectile_type = /obj/item/projectile/bullet/c10mm_ap
-
-/obj/item/ammo_casing/c10mm/hp
- name = ".10mm hollow-point bullet casing"
- desc = "A 10mm hollow-point bullet casing."
- projectile_type = /obj/item/projectile/bullet/c10mm_hp
-
-/obj/item/ammo_casing/c10mm/fire
- name = ".10mm incendiary bullet casing"
- desc = "A 10mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
-
-// 9mm (Stechkin APS)
-
-/obj/item/ammo_casing/c9mm
- name = "9mm bullet casing"
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type = /obj/item/projectile/bullet/c9mm
-
-/obj/item/ammo_casing/c9mm/ap
- name = "9mm armor-piercing bullet casing"
- desc = "A 9mm armor-piercing bullet casing."
- projectile_type =/obj/item/projectile/bullet/c9mm_ap
-
-/obj/item/ammo_casing/c9mm/inc
- name = "9mm incendiary bullet casing"
- desc = "A 9mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c9mm
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/ammo_casing/c46x30mm
- name = "4.6x30mm bullet casing"
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type = /obj/item/projectile/bullet/c46x30mm
-
-/obj/item/ammo_casing/c46x30mm/ap
- name = "4.6x30mm armor-piercing bullet casing"
- desc = "A 4.6x30mm armor-piercing bullet casing."
- projectile_type = /obj/item/projectile/bullet/c46x30mm_ap
-
-/obj/item/ammo_casing/c46x30mm/inc
- name = "4.6x30mm incendiary bullet casing"
- desc = "A 4.6x30mm incendiary bullet casing."
- projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm
-
-// .45 (M1911 + C20r)
-
-/obj/item/ammo_casing/c45
- name = ".45 bullet casing"
- desc = "A .45 bullet casing."
- caliber = ".45"
- projectile_type = /obj/item/projectile/bullet/c45
-
-/obj/item/ammo_casing/c45/nostamina
- projectile_type = /obj/item/projectile/bullet/c45_nostamina
-
-// 5.56mm (M-90gl Carbine)
-
-/obj/item/ammo_casing/a556
- name = "5.56mm bullet casing"
- desc = "A 5.56mm bullet casing."
- caliber = "a556"
- projectile_type = /obj/item/projectile/bullet/a556
-
-// 40mm (Grenade Launcher)
-
-/obj/item/ammo_casing/a40mm
- name = "40mm HE shell"
- desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
- caliber = "40mm"
- icon_state = "40mmHE"
- projectile_type = /obj/item/projectile/bullet/a40mm
-
-// .50 (Sniper)
-
-/obj/item/ammo_casing/p50
- name = ".50 bullet casing"
- desc = "A .50 bullet casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/p50
- icon_state = ".50"
-
-/obj/item/ammo_casing/p50/soporific
- name = ".50 soporific bullet casing"
- desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
- projectile_type = /obj/item/projectile/bullet/p50/soporific
- icon_state = "sleeper"
-
-/obj/item/ammo_casing/p50/penetrator
- name = ".50 penetrator round bullet casing"
- desc = "A .50 caliber penetrator round casing."
- projectile_type = /obj/item/projectile/bullet/p50/penetrator
-
-// 1.95x129mm (SAW)
-
-/obj/item/ammo_casing/mm195x129
- name = "1.95x129mm bullet casing"
- desc = "A 1.95x129mm bullet casing."
- icon_state = "762-casing"
- caliber = "mm195129"
- projectile_type = /obj/item/projectile/bullet/mm195x129
-
-/obj/item/ammo_casing/mm195x129/ap
- name = "1.95x129mm armor-piercing bullet casing"
- desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
- projectile_type = /obj/item/projectile/bullet/mm195x129_ap
-
-/obj/item/ammo_casing/mm195x129/hollow
- name = "1.95x129mm hollow-point bullet casing"
- desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
- projectile_type = /obj/item/projectile/bullet/mm195x129_hp
-
-/obj/item/ammo_casing/mm195x129/incen
- name = "1.95x129mm incendiary bullet casing"
- desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
- projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
-
-// Shotgun
-
-/obj/item/ammo_casing/shotgun
- name = "shotgun slug"
- desc = "A 12 gauge lead slug."
- icon_state = "blshell"
- caliber = "shotgun"
- projectile_type = /obj/item/projectile/bullet/shotgun_slug
- materials = list(MAT_METAL=4000)
-
-/obj/item/ammo_casing/shotgun/beanbag
- name = "beanbag slug"
- desc = "A weak beanbag slug for riot control."
- icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_beanbag
- materials = list(MAT_METAL=250)
-
-/obj/item/ammo_casing/shotgun/incendiary
- name = "incendiary slug"
- desc = "An incendiary-coated shotgun slug."
- icon_state = "ishell"
- projectile_type = /obj/item/projectile/bullet/incendiary/shotgun
-
-/obj/item/ammo_casing/shotgun/dragonsbreath
- name = "dragonsbreath shell"
- desc = "A shotgun shell which fires a spread of incendiary pellets."
- icon_state = "ishell2"
- projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
- pellets = 4
- variance = 35
-
-/obj/item/ammo_casing/shotgun/stunslug
- name = "taser slug"
- desc = "A stunning taser slug."
- icon_state = "stunshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_stunslug
- materials = list(MAT_METAL=250)
-
-/obj/item/ammo_casing/shotgun/meteorslug
- name = "meteorslug shell"
- desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
- icon_state = "mshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug
-
-/obj/item/ammo_casing/shotgun/pulseslug
- name = "pulse slug"
- desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \
- energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
- would have difficulty with."
- icon_state = "pshell"
- projectile_type = /obj/item/projectile/beam/pulse/shotgun
-
-/obj/item/ammo_casing/shotgun/frag12
- name = "FRAG-12 slug"
- desc = "A high explosive breaching round for a 12 gauge shotgun."
- icon_state = "heshell"
- projectile_type = /obj/item/projectile/bullet/shotgun_frag12
-
-/obj/item/ammo_casing/shotgun/buckshot
- name = "buckshot shell"
- desc = "A 12 gauge buckshot shell."
- icon_state = "gshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot
- pellets = 6
- variance = 25
-
-/obj/item/ammo_casing/shotgun/rubbershot
- name = "rubber shot"
- desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
- icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot
- pellets = 6
- variance = 25
- materials = list(MAT_METAL=4000)
-
-/obj/item/ammo_casing/shotgun/improvised
- name = "improvised shell"
- desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
- icon_state = "improvshell"
- projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised
- materials = list(MAT_METAL=250)
- pellets = 10
- variance = 25
-
-/obj/item/ammo_casing/shotgun/ion
- name = "ion shell"
- desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
- The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
- icon_state = "ionshell"
- projectile_type = /obj/item/projectile/ion/weak
- pellets = 4
- variance = 35
-
-/obj/item/ammo_casing/shotgun/laserslug
- name = "laser slug"
- desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
- icon_state = "lshell"
- projectile_type = /obj/item/projectile/beam/laser
-
-/obj/item/ammo_casing/shotgun/techshell
- name = "unloaded technological shell"
- desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
- icon_state = "cshell"
- projectile_type = null
-
-/obj/item/ammo_casing/shotgun/dart
- name = "shotgun dart"
- desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
- icon_state = "cshell"
- projectile_type = /obj/item/projectile/bullet/dart
- var/reagent_amount = 30
- var/reagent_react = TRUE
-
-/obj/item/ammo_casing/shotgun/dart/noreact
- name = "cryostasis shotgun dart"
- desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
- icon_state = "cnrshell"
- reagent_amount = 10
- reagent_react = FALSE
-
-/obj/item/ammo_casing/shotgun/dart/Initialize()
- . = ..()
- container_type |= OPENCONTAINER
- create_reagents(reagent_amount)
- reagents.set_reacting(reagent_react)
-
-/obj/item/ammo_casing/shotgun/dart/attackby()
- return
-
-/obj/item/ammo_casing/shotgun/dart/bioterror
- desc = "A shotgun dart filled with deadly toxins."
-
-/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize()
- . = ..()
- reagents.add_reagent("neurotoxin", 6)
- reagents.add_reagent("spore", 6)
- reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
- reagents.add_reagent("coniine", 6)
- reagents.add_reagent("sodium_thiopental", 6)
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
new file mode 100644
index 0000000000..1ce2e0065e
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -0,0 +1,23 @@
+// 1.95x129mm (SAW)
+
+/obj/item/ammo_casing/mm195x129
+ name = "1.95x129mm bullet casing"
+ desc = "A 1.95x129mm bullet casing."
+ icon_state = "762-casing"
+ caliber = "mm195129"
+ projectile_type = /obj/item/projectile/bullet/mm195x129
+
+/obj/item/ammo_casing/mm195x129/ap
+ name = "1.95x129mm armor-piercing bullet casing"
+ desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
+ projectile_type = /obj/item/projectile/bullet/mm195x129_ap
+
+/obj/item/ammo_casing/mm195x129/hollow
+ name = "1.95x129mm hollow-point bullet casing"
+ desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
+ projectile_type = /obj/item/projectile/bullet/mm195x129_hp
+
+/obj/item/ammo_casing/mm195x129/incen
+ name = "1.95x129mm incendiary bullet casing"
+ desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames."
+ projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
new file mode 100644
index 0000000000..02134e95e1
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -0,0 +1,50 @@
+// 10mm (Stechkin)
+
+/obj/item/ammo_casing/c10mm
+ name = ".10mm bullet casing"
+ desc = "A 10mm bullet casing."
+ caliber = "10mm"
+ projectile_type = /obj/item/projectile/bullet/c10mm
+
+/obj/item/ammo_casing/c10mm/ap
+ name = ".10mm armor-piercing bullet casing"
+ desc = "A 10mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_ap
+
+/obj/item/ammo_casing/c10mm/hp
+ name = ".10mm hollow-point bullet casing"
+ desc = "A 10mm hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_hp
+
+/obj/item/ammo_casing/c10mm/fire
+ name = ".10mm incendiary bullet casing"
+ desc = "A 10mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
+
+// 9mm (Stechkin APS)
+
+/obj/item/ammo_casing/c9mm
+ name = "9mm bullet casing"
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type = /obj/item/projectile/bullet/c9mm
+
+/obj/item/ammo_casing/c9mm/ap
+ name = "9mm armor-piercing bullet casing"
+ desc = "A 9mm armor-piercing bullet casing."
+ projectile_type =/obj/item/projectile/bullet/c9mm_ap
+
+/obj/item/ammo_casing/c9mm/inc
+ name = "9mm incendiary bullet casing"
+ desc = "A 9mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c9mm
+
+
+// .50AE (Desert Eagle)
+
+/obj/item/ammo_casing/a50AE
+ name = ".50AE bullet casing"
+ desc = "A .50AE bullet casing."
+ caliber = ".50"
+ projectile_type = /obj/item/projectile/bullet/a50AE
+
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
new file mode 100644
index 0000000000..52a72e0ff7
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -0,0 +1,23 @@
+// .357 (Syndie Revolver)
+
+/obj/item/ammo_casing/a357
+ name = ".357 bullet casing"
+ desc = "A .357 bullet casing."
+ caliber = "357"
+ projectile_type = /obj/item/projectile/bullet/a357
+
+// 7.62x38mmR (Nagant Revolver)
+
+/obj/item/ammo_casing/n762
+ name = "7.62x38mmR bullet casing"
+ desc = "A 7.62x38mmR bullet casing."
+ caliber = "n762"
+ projectile_type = /obj/item/projectile/bullet/n762
+
+// .38 (Detective's Gun)
+
+/obj/item/ammo_casing/c38
+ name = ".38 bullet casing"
+ desc = "A .38 bullet casing."
+ caliber = "38"
+ projectile_type = /obj/item/projectile/bullet/c38
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
new file mode 100644
index 0000000000..a35cfcba1c
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -0,0 +1,28 @@
+// 7.62 (Nagant Rifle)
+
+/obj/item/ammo_casing/a762
+ name = "7.62 bullet casing"
+ desc = "A 7.62 bullet casing."
+ icon_state = "762-casing"
+ caliber = "a762"
+ projectile_type = /obj/item/projectile/bullet/a762
+
+/obj/item/ammo_casing/a762/enchanted
+ projectile_type = /obj/item/projectile/bullet/a762_enchanted
+
+// 5.56mm (M-90gl Carbine)
+
+/obj/item/ammo_casing/a556
+ name = "5.56mm bullet casing"
+ desc = "A 5.56mm bullet casing."
+ caliber = "a556"
+ projectile_type = /obj/item/projectile/bullet/a556
+
+// 40mm (Grenade Launcher)
+
+/obj/item/ammo_casing/a40mm
+ name = "40mm HE shell"
+ desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
+ caliber = "40mm"
+ icon_state = "40mmHE"
+ projectile_type = /obj/item/projectile/bullet/a40mm
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
new file mode 100644
index 0000000000..b700d092d7
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -0,0 +1,139 @@
+// Shotgun
+
+/obj/item/ammo_casing/shotgun
+ name = "shotgun slug"
+ desc = "A 12 gauge lead slug."
+ icon_state = "blshell"
+ caliber = "shotgun"
+ projectile_type = /obj/item/projectile/bullet/shotgun_slug
+ materials = list(MAT_METAL=4000)
+
+/obj/item/ammo_casing/shotgun/beanbag
+ name = "beanbag slug"
+ desc = "A weak beanbag slug for riot control."
+ icon_state = "bshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_beanbag
+ materials = list(MAT_METAL=250)
+
+/obj/item/ammo_casing/shotgun/incendiary
+ name = "incendiary slug"
+ desc = "An incendiary-coated shotgun slug."
+ icon_state = "ishell"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun
+
+/obj/item/ammo_casing/shotgun/dragonsbreath
+ name = "dragonsbreath shell"
+ desc = "A shotgun shell which fires a spread of incendiary pellets."
+ icon_state = "ishell2"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
+ pellets = 4
+ variance = 35
+
+/obj/item/ammo_casing/shotgun/stunslug
+ name = "taser slug"
+ desc = "A stunning taser slug."
+ icon_state = "stunshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_stunslug
+ materials = list(MAT_METAL=250)
+
+/obj/item/ammo_casing/shotgun/meteorslug
+ name = "meteorslug shell"
+ desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
+ icon_state = "mshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug
+
+/obj/item/ammo_casing/shotgun/pulseslug
+ name = "pulse slug"
+ desc = "A delicate device which can be loaded into a shotgun. The primer acts as a button which triggers the gain medium and fires a powerful \
+ energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
+ would have difficulty with."
+ icon_state = "pshell"
+ projectile_type = /obj/item/projectile/beam/pulse/shotgun
+
+/obj/item/ammo_casing/shotgun/frag12
+ name = "FRAG-12 slug"
+ desc = "A high explosive breaching round for a 12 gauge shotgun."
+ icon_state = "heshell"
+ projectile_type = /obj/item/projectile/bullet/shotgun_frag12
+
+/obj/item/ammo_casing/shotgun/buckshot
+ name = "buckshot shell"
+ desc = "A 12 gauge buckshot shell."
+ icon_state = "gshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot
+ pellets = 6
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/rubbershot
+ name = "rubber shot"
+ desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
+ icon_state = "bshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ pellets = 6
+ variance = 25
+ materials = list(MAT_METAL=4000)
+
+/obj/item/ammo_casing/shotgun/improvised
+ name = "improvised shell"
+ desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
+ icon_state = "improvshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised
+ materials = list(MAT_METAL=250)
+ pellets = 10
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/ion
+ name = "ion shell"
+ desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
+ The unique properties of the crystal split the pulse into a spread of individually weaker bolts."
+ icon_state = "ionshell"
+ projectile_type = /obj/item/projectile/ion/weak
+ pellets = 4
+ variance = 35
+
+/obj/item/ammo_casing/shotgun/laserslug
+ name = "laser slug"
+ desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
+ icon_state = "lshell"
+ projectile_type = /obj/item/projectile/beam/laser
+
+/obj/item/ammo_casing/shotgun/techshell
+ name = "unloaded technological shell"
+ desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
+ icon_state = "cshell"
+ projectile_type = null
+
+/obj/item/ammo_casing/shotgun/dart
+ name = "shotgun dart"
+ desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical."
+ icon_state = "cshell"
+ projectile_type = /obj/item/projectile/bullet/dart
+ var/reagent_amount = 30
+ var/reagent_react = TRUE
+
+/obj/item/ammo_casing/shotgun/dart/noreact
+ name = "cryostasis shotgun dart"
+ desc = "A dart for use in shotguns, using similar technolgoy as cryostatis beakers to keep internal reagents from reacting. Can be injected with up to 10 units of any chemical."
+ icon_state = "cnrshell"
+ reagent_amount = 10
+ reagent_react = FALSE
+
+/obj/item/ammo_casing/shotgun/dart/Initialize()
+ . = ..()
+ container_type |= OPENCONTAINER
+ create_reagents(reagent_amount)
+ reagents.set_reacting(reagent_react)
+
+/obj/item/ammo_casing/shotgun/dart/attackby()
+ return
+
+/obj/item/ammo_casing/shotgun/dart/bioterror
+ desc = "A shotgun dart filled with deadly toxins."
+
+/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize()
+ . = ..()
+ reagents.add_reagent("neurotoxin", 6)
+ reagents.add_reagent("spore", 6)
+ reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
+ reagents.add_reagent("coniine", 6)
+ reagents.add_reagent("sodium_thiopental", 6)
diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm
new file mode 100644
index 0000000000..3be419c933
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/smg.dm
@@ -0,0 +1,28 @@
+// 4.6x30mm (Autorifles)
+
+/obj/item/ammo_casing/c46x30mm
+ name = "4.6x30mm bullet casing"
+ desc = "A 4.6x30mm bullet casing."
+ caliber = "4.6x30mm"
+ projectile_type = /obj/item/projectile/bullet/c46x30mm
+
+/obj/item/ammo_casing/c46x30mm/ap
+ name = "4.6x30mm armor-piercing bullet casing"
+ desc = "A 4.6x30mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c46x30mm_ap
+
+/obj/item/ammo_casing/c46x30mm/inc
+ name = "4.6x30mm incendiary bullet casing"
+ desc = "A 4.6x30mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm
+
+// .45 (M1911 + C20r)
+
+/obj/item/ammo_casing/c45
+ name = ".45 bullet casing"
+ desc = "A .45 bullet casing."
+ caliber = ".45"
+ projectile_type = /obj/item/projectile/bullet/c45
+
+/obj/item/ammo_casing/c45/nostamina
+ projectile_type = /obj/item/projectile/bullet/c45_nostamina
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
new file mode 100644
index 0000000000..5906fcfaba
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -0,0 +1,19 @@
+// .50 (Sniper)
+
+/obj/item/ammo_casing/p50
+ name = ".50 bullet casing"
+ desc = "A .50 bullet casing."
+ caliber = ".50"
+ projectile_type = /obj/item/projectile/bullet/p50
+ icon_state = ".50"
+
+/obj/item/ammo_casing/p50/soporific
+ name = ".50 soporific bullet casing"
+ desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
+ projectile_type = /obj/item/projectile/bullet/p50/soporific
+ icon_state = "sleeper"
+
+/obj/item/ammo_casing/p50/penetrator
+ name = ".50 penetrator round bullet casing"
+ desc = "A .50 caliber penetrator round casing."
+ projectile_type = /obj/item/projectile/bullet/p50/penetrator
diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm
new file mode 100644
index 0000000000..154d269cd9
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_casing/caseless
+ desc = "A caseless bullet casing."
+ firing_effect_type = null
+ heavy_metal = FALSE
+
+/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
+ if (..()) //successfully firing
+ moveToNullspace()
+ return 1
+ else
+ return 0
+
+/obj/item/ammo_casing/caseless/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]"
diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
similarity index 56%
rename from code/modules/projectiles/ammunition/caseless.dm
rename to code/modules/projectiles/ammunition/caseless/foam.dm
index b3439c86b2..fdf685e001 100644
--- a/code/modules/projectiles/ammunition/caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -1,117 +1,61 @@
-
-// Caseless Ammunition
-
-/obj/item/ammo_casing/caseless
- desc = "A caseless bullet casing."
- firing_effect_type = null
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
- if (..()) //successfully firing
- moveToNullspace()
- return 1
- else
- return 0
-
-/obj/item/ammo_casing/caseless/update_icon()
- ..()
- icon_state = "[initial(icon_state)]"
-
-/obj/item/ammo_casing/caseless/a75
- desc = "A .75 bullet casing."
- caliber = "75"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/bullet/gyro
-
-/obj/item/ammo_casing/caseless/a84mm
- desc = "An 84mm anti-armour rocket."
- caliber = "84mm"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/bullet/a84mm
-
-/obj/item/ammo_casing/caseless/magspear
- name = "magnetic spear"
- desc = "A reusable spear that is typically loaded into kinetic spearguns."
- projectile_type = /obj/item/projectile/bullet/reusable/magspear
- caliber = "speargun"
- icon_state = "magspear"
- throwforce = 15 //still deadly when thrown
- throw_speed = 3
-
-
-/obj/item/ammo_casing/caseless/laser
- name = "laser casing"
- desc = "You shouldn't be seeing this."
- caliber = "laser"
- icon_state = "s-casing-live"
- projectile_type = /obj/item/projectile/beam
- fire_sound = 'sound/weapons/laser.ogg'
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
-
-/obj/item/ammo_casing/caseless/laser/gatling
- projectile_type = /obj/item/projectile/beam/weak
- variance = 0.8
- click_cooldown_override = 1
-
-
-/obj/item/ammo_casing/caseless/foam_dart
- name = "foam dart"
- desc = "It's nerf or nothing! Ages 8 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
- caliber = "foam_force"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart"
- var/modified = 0
-
-/obj/item/ammo_casing/caseless/foam_dart/update_icon()
- ..()
- if (modified)
- icon_state = "foamdart_empty"
- desc = "It's nerf or nothing! ... Although, this one doesn't look too safe."
- if(BB)
- BB.icon_state = "foamdart_empty"
- else
- icon_state = initial(icon_state)
- desc = "It's nerf or nothing! Ages 8 and up."
- if(BB)
- BB.icon_state = initial(BB.icon_state)
-
-
-/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
- var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
- if (istype(A, /obj/item/screwdriver) && !modified)
- modified = 1
- FD.modified = 1
- FD.damage_type = BRUTE
- to_chat(user, "You pop the safety cap off [src].")
- update_icon()
- else if (istype(A, /obj/item/pen))
- if(modified)
- if(!FD.pen)
- if(!user.transferItemToLoc(A, FD))
- return
- FD.pen = A
- FD.damage = 5
- FD.nodamage = 0
- to_chat(user, "You insert [A] into [src].")
- else
- to_chat(user, "There's already something in [src].")
- else
- to_chat(user, "The safety cap prevents you from inserting [A] into [src].")
- else
- return ..()
-
-/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
- var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
- if(FD.pen)
- FD.damage = initial(FD.damage)
- FD.nodamage = initial(FD.nodamage)
- user.put_in_hands(FD.pen)
- to_chat(user, "You remove [FD.pen] from [src].")
- FD.pen = null
-
-/obj/item/ammo_casing/caseless/foam_dart/riot
- name = "riot foam dart"
- desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
- icon_state = "foamdart_riot"
+/obj/item/ammo_casing/caseless/foam_dart
+ name = "foam dart"
+ desc = "It's nerf or nothing! Ages 8 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
+ caliber = "foam_force"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart"
+ var/modified = 0
+
+/obj/item/ammo_casing/caseless/foam_dart/update_icon()
+ ..()
+ if (modified)
+ icon_state = "foamdart_empty"
+ desc = "It's nerf or nothing! ... Although, this one doesn't look too safe."
+ if(BB)
+ BB.icon_state = "foamdart_empty"
+ else
+ icon_state = initial(icon_state)
+ desc = "It's nerf or nothing! Ages 8 and up."
+ if(BB)
+ BB.icon_state = initial(BB.icon_state)
+
+
+/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
+ var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
+ if (istype(A, /obj/item/screwdriver) && !modified)
+ modified = 1
+ FD.modified = 1
+ FD.damage_type = BRUTE
+ to_chat(user, "You pop the safety cap off [src].")
+ update_icon()
+ else if (istype(A, /obj/item/pen))
+ if(modified)
+ if(!FD.pen)
+ if(!user.transferItemToLoc(A, FD))
+ return
+ FD.pen = A
+ FD.damage = 5
+ FD.nodamage = 0
+ to_chat(user, "You insert [A] into [src].")
+ else
+ to_chat(user, "There's already something in [src].")
+ else
+ to_chat(user, "The safety cap prevents you from inserting [A] into [src].")
+ else
+ return ..()
+
+/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
+ var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
+ if(FD.pen)
+ FD.damage = initial(FD.damage)
+ FD.nodamage = initial(FD.nodamage)
+ user.put_in_hands(FD.pen)
+ to_chat(user, "You remove [FD.pen] from [src].")
+ FD.pen = null
+
+/obj/item/ammo_casing/caseless/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
+ icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/misc.dm
new file mode 100644
index 0000000000..fcb491f071
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/misc.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_casing/caseless/magspear
+ name = "magnetic spear"
+ desc = "A reusable spear that is typically loaded into kinetic spearguns."
+ projectile_type = /obj/item/projectile/bullet/reusable/magspear
+ caliber = "speargun"
+ icon_state = "magspear"
+ throwforce = 15 //still deadly when thrown
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/laser
+ name = "laser casing"
+ desc = "You shouldn't be seeing this."
+ caliber = "laser"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/beam
+ fire_sound = 'sound/weapons/laser.ogg'
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
+
+/obj/item/ammo_casing/caseless/laser/gatling
+ projectile_type = /obj/item/projectile/beam/weak
+ variance = 0.8
+ click_cooldown_override = 1
diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm
new file mode 100644
index 0000000000..0b74f6ff8c
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/rocket.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_casing/caseless/a84mm
+ desc = "An 84mm anti-armour rocket."
+ caliber = "84mm"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/bullet/a84mm
+
+/obj/item/ammo_casing/caseless/a75
+ desc = "A .75 bullet casing."
+ caliber = "75"
+ icon_state = "s-casing-live"
+ projectile_type = /obj/item/projectile/bullet/gyro
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
deleted file mode 100644
index 96d0fd2e29..0000000000
--- a/code/modules/projectiles/ammunition/energy.dm
+++ /dev/null
@@ -1,258 +0,0 @@
-/obj/item/ammo_casing/energy
- name = "energy weapon lens"
- desc = "The part of the gun that makes the laser go pew."
- caliber = "energy"
- projectile_type = /obj/item/projectile/energy
- var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
- var/select_name = "energy"
- fire_sound = 'sound/weapons/laser.ogg'
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/energy/chameleon
- projectile_type = /obj/item/projectile/energy/chameleon
- e_cost = 0
- var/hitscan_mode = FALSE
- var/list/projectile_vars = list()
-
-/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- . = ..()
- if(!BB)
- newshot()
- for(var/V in projectile_vars)
- if(BB.vars.Find(V))
- BB.vars[V] = projectile_vars[V]
- if(hitscan_mode)
- BB.hitscan = TRUE
-
-/obj/item/ammo_casing/energy/laser
- projectile_type = /obj/item/projectile/beam/laser
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun
- projectile_type = /obj/item/projectile/beam/laser
- e_cost = 83
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun/old
- projectile_type = /obj/item/projectile/beam/laser
- e_cost = 200
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/laser/hos
- e_cost = 100
-
-/obj/item/ammo_casing/energy/laser/practice
- projectile_type = /obj/item/projectile/beam/practice
- select_name = "practice"
-
-/obj/item/ammo_casing/energy/laser/scatter
- projectile_type = /obj/item/projectile/beam/scatter
- pellets = 5
- variance = 25
- select_name = "scatter"
-
-/obj/item/ammo_casing/energy/laser/scatter/disabler
- projectile_type = /obj/item/projectile/beam/disabler
- pellets = 3
- variance = 15
-
-/obj/item/ammo_casing/energy/laser/heavy
- projectile_type = /obj/item/projectile/beam/laser/heavylaser
- select_name = "anti-vehicle"
- fire_sound = 'sound/weapons/lasercannonfire.ogg'
-
-/obj/item/ammo_casing/energy/laser/pulse
- projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 200
- select_name = "DESTROY"
- fire_sound = 'sound/weapons/pulse.ogg'
-
-/obj/item/ammo_casing/energy/laser/bluetag
- projectile_type = /obj/item/projectile/beam/lasertag/bluetag
- select_name = "bluetag"
-
-/obj/item/ammo_casing/energy/laser/bluetag/hitscan
- projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan
-
-/obj/item/ammo_casing/energy/laser/redtag
- projectile_type = /obj/item/projectile/beam/lasertag/redtag
- select_name = "redtag"
-
-/obj/item/ammo_casing/energy/laser/redtag/hitscan
- projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan
-
-/obj/item/ammo_casing/energy/xray
- projectile_type = /obj/item/projectile/beam/xray
- e_cost = 50
- fire_sound = 'sound/weapons/laser3.ogg'
-
-/obj/item/ammo_casing/energy/electrode
- projectile_type = /obj/item/projectile/energy/electrode
- select_name = "stun"
- fire_sound = 'sound/weapons/taser.ogg'
- e_cost = 200
-
-/obj/item/ammo_casing/energy/electrode/spec
- e_cost = 100
-
-/obj/item/ammo_casing/energy/electrode/gun
- fire_sound = 'sound/weapons/gunshot.ogg'
- e_cost = 100
-
-/obj/item/ammo_casing/energy/electrode/hos
- e_cost = 200
-
-/obj/item/ammo_casing/energy/electrode/old
- e_cost = 1000
-
-/obj/item/ammo_casing/energy/ion
- projectile_type = /obj/item/projectile/ion
- select_name = "ion"
- fire_sound = 'sound/weapons/ionrifle.ogg'
-
-/obj/item/ammo_casing/energy/declone
- projectile_type = /obj/item/projectile/energy/declone
- select_name = "declone"
- fire_sound = 'sound/weapons/pulse3.ogg'
-
-/obj/item/ammo_casing/energy/mindflayer
- projectile_type = /obj/item/projectile/beam/mindflayer
- select_name = "MINDFUCK"
- fire_sound = 'sound/weapons/laser.ogg'
-
-/obj/item/ammo_casing/energy/flora
- fire_sound = 'sound/effects/stealthoff.ogg'
-
-/obj/item/ammo_casing/energy/flora/yield
- projectile_type = /obj/item/projectile/energy/florayield
- select_name = "yield"
-
-/obj/item/ammo_casing/energy/flora/mut
- projectile_type = /obj/item/projectile/energy/floramut
- select_name = "mutation"
-
-/obj/item/ammo_casing/energy/temp
- projectile_type = /obj/item/projectile/temp
- select_name = "freeze"
- e_cost = 250
- fire_sound = 'sound/weapons/pulse3.ogg'
-
-/obj/item/ammo_casing/energy/temp/hot
- projectile_type = /obj/item/projectile/temp/hot
- select_name = "bake"
-
-/obj/item/ammo_casing/energy/meteor
- projectile_type = /obj/item/projectile/meteor
- select_name = "goddamn meteor"
-
-/obj/item/ammo_casing/energy/disabler
- projectile_type = /obj/item/projectile/beam/disabler
- select_name = "disable"
- e_cost = 50
- fire_sound = 'sound/weapons/taser2.ogg'
-
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/plasma_cutter.ogg'
- delay = 15
- e_cost = 25
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
- delay = 10
- e_cost = 10
-
-/obj/item/ammo_casing/energy/wormhole
- projectile_type = /obj/item/projectile/beam/wormhole
- e_cost = 0
- fire_sound = 'sound/weapons/pulse3.ogg'
- var/obj/item/gun/energy/wormhole_projector/gun = null
- select_name = "blue"
-
-/obj/item/ammo_casing/energy/wormhole/orange
- projectile_type = /obj/item/projectile/beam/wormhole/orange
- select_name = "orange"
-
-/obj/item/ammo_casing/energy/bolt
- projectile_type = /obj/item/projectile/energy/bolt
- select_name = "bolt"
- e_cost = 500
- fire_sound = 'sound/weapons/genhit.ogg'
-
-/obj/item/ammo_casing/energy/bolt/halloween
- projectile_type = /obj/item/projectile/energy/bolt/halloween
-
-/obj/item/ammo_casing/energy/bolt/large
- projectile_type = /obj/item/projectile/energy/bolt/large
- select_name = "heavy bolt"
-
-/obj/item/ammo_casing/energy/net
- projectile_type = /obj/item/projectile/energy/net
- select_name = "netting"
- pellets = 6
- variance = 40
-
-/obj/item/ammo_casing/energy/trap
- projectile_type = /obj/item/projectile/energy/trap
- select_name = "snare"
-
-/obj/item/ammo_casing/energy/instakill
- projectile_type = /obj/item/projectile/beam/instakill
- e_cost = 0
- select_name = "DESTROY"
-
-/obj/item/ammo_casing/energy/instakill/blue
- projectile_type = /obj/item/projectile/beam/instakill/blue
-
-/obj/item/ammo_casing/energy/instakill/red
- projectile_type = /obj/item/projectile/beam/instakill/red
-
-/obj/item/ammo_casing/energy/tesla_revolver
- fire_sound = 'sound/magic/lightningbolt.ogg'
- e_cost = 200
- select_name = "stun"
- projectile_type = /obj/item/projectile/energy/tesla/revolver
-
-/obj/item/ammo_casing/energy/gravityrepulse
- projectile_type = /obj/item/projectile/gravityrepulse
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "repulse"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-/obj/item/ammo_casing/energy/gravityrepulse/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/gravityattract
- projectile_type = /obj/item/projectile/gravityattract
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "attract"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-
-/obj/item/ammo_casing/energy/gravityattract/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/gravitychaos
- projectile_type = /obj/item/projectile/gravitychaos
- e_cost = 0
- fire_sound = 'sound/weapons/wave.ogg'
- select_name = "chaos"
- delay = 50
- var/obj/item/gun/energy/gravity_gun/gun = null
-
-/obj/item/ammo_casing/energy/gravitychaos/New(var/obj/item/gun/energy/gravity_gun/G)
- gun = G
-
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/pulse.ogg'
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm
new file mode 100644
index 0000000000..3a4e457c3d
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/_energy.dm
@@ -0,0 +1,10 @@
+/obj/item/ammo_casing/energy
+ name = "energy weapon lens"
+ desc = "The part of the gun that makes the laser go pew."
+ caliber = "energy"
+ projectile_type = /obj/item/projectile/energy
+ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
+ var/select_name = "energy"
+ fire_sound = 'sound/weapons/laser.ogg'
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
+ heavy_metal = FALSE
diff --git a/code/modules/projectiles/ammunition/energy/chameleon.dm b/code/modules/projectiles/ammunition/energy/chameleon.dm
new file mode 100644
index 0000000000..b47b6c4e5e
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/chameleon.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_casing/energy/chameleon
+ projectile_type = /obj/item/projectile/energy/chameleon
+ e_cost = 0
+ var/hitscan_mode = FALSE
+ var/list/projectile_vars = list()
+
+/obj/item/ammo_casing/energy/chameleon/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ . = ..()
+ if(!BB)
+ newshot()
+ for(var/V in projectile_vars)
+ if(BB.vars.Find(V))
+ BB.vv_edit_var(V, projectile_vars[V])
+ if(hitscan_mode)
+ BB.hitscan = TRUE
diff --git a/code/modules/projectiles/ammunition/energy/ebow.dm b/code/modules/projectiles/ammunition/energy/ebow.dm
new file mode 100644
index 0000000000..8d9c72d1ba
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/ebow.dm
@@ -0,0 +1,12 @@
+/obj/item/ammo_casing/energy/bolt
+ projectile_type = /obj/item/projectile/energy/bolt
+ select_name = "bolt"
+ e_cost = 500
+ fire_sound = 'sound/weapons/genhit.ogg'
+
+/obj/item/ammo_casing/energy/bolt/halloween
+ projectile_type = /obj/item/projectile/energy/bolt/halloween
+
+/obj/item/ammo_casing/energy/bolt/large
+ projectile_type = /obj/item/projectile/energy/bolt/large
+ select_name = "heavy bolt"
diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm
new file mode 100644
index 0000000000..f549a5b5e4
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/gravity.dm
@@ -0,0 +1,36 @@
+/obj/item/ammo_casing/energy/gravityrepulse
+ projectile_type = /obj/item/projectile/gravityrepulse
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "repulse"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+/obj/item/ammo_casing/energy/gravityrepulse/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
+
+/obj/item/ammo_casing/energy/gravityattract
+ projectile_type = /obj/item/projectile/gravityattract
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "attract"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+
+/obj/item/ammo_casing/energy/gravityattract/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
+
+/obj/item/ammo_casing/energy/gravitychaos
+ projectile_type = /obj/item/projectile/gravitychaos
+ e_cost = 0
+ fire_sound = 'sound/weapons/wave.ogg'
+ select_name = "chaos"
+ delay = 50
+ var/obj/item/gun/energy/gravity_gun/gun
+
+/obj/item/ammo_casing/energy/gravitychaos/Initialize(mapload, obj/item/gun/energy/gravity_gun/G)
+ . = ..()
+ gun = G
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
new file mode 100644
index 0000000000..c87ea2ffbd
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -0,0 +1,66 @@
+/obj/item/ammo_casing/energy/laser
+ projectile_type = /obj/item/projectile/beam/laser
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/lasergun
+ projectile_type = /obj/item/projectile/beam/laser
+ e_cost = 83
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/lasergun/old
+ projectile_type = /obj/item/projectile/beam/laser
+ e_cost = 200
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/laser/hos
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/laser/practice
+ projectile_type = /obj/item/projectile/beam/practice
+ select_name = "practice"
+
+/obj/item/ammo_casing/energy/laser/scatter
+ projectile_type = /obj/item/projectile/beam/scatter
+ pellets = 5
+ variance = 25
+ select_name = "scatter"
+
+/obj/item/ammo_casing/energy/laser/scatter/disabler
+ projectile_type = /obj/item/projectile/beam/disabler
+ pellets = 3
+ variance = 15
+
+/obj/item/ammo_casing/energy/laser/heavy
+ projectile_type = /obj/item/projectile/beam/laser/heavylaser
+ select_name = "anti-vehicle"
+ fire_sound = 'sound/weapons/lasercannonfire.ogg'
+
+/obj/item/ammo_casing/energy/laser/pulse
+ projectile_type = /obj/item/projectile/beam/pulse
+ e_cost = 200
+ select_name = "DESTROY"
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/ammo_casing/energy/laser/bluetag
+ projectile_type = /obj/item/projectile/beam/lasertag/bluetag
+ select_name = "bluetag"
+
+/obj/item/ammo_casing/energy/laser/bluetag/hitscan
+ projectile_type = /obj/item/projectile/beam/lasertag/bluetag/hitscan
+
+/obj/item/ammo_casing/energy/laser/redtag
+ projectile_type = /obj/item/projectile/beam/lasertag/redtag
+ select_name = "redtag"
+
+/obj/item/ammo_casing/energy/laser/redtag/hitscan
+ projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan
+
+/obj/item/ammo_casing/energy/xray
+ projectile_type = /obj/item/projectile/beam/xray
+ e_cost = 50
+ fire_sound = 'sound/weapons/laser3.ogg'
+
+/obj/item/ammo_casing/energy/mindflayer
+ projectile_type = /obj/item/projectile/beam/mindflayer
+ select_name = "MINDFUCK"
+ fire_sound = 'sound/weapons/laser.ogg'
diff --git a/code/modules/projectiles/ammunition/energy/lmg.dm b/code/modules/projectiles/ammunition/energy/lmg.dm
new file mode 100644
index 0000000000..5ebe83f792
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/lmg.dm
@@ -0,0 +1,6 @@
+/obj/item/ammo_casing/energy/c3dbullet
+ projectile_type = /obj/item/projectile/bullet/c3d
+ select_name = "spraydown"
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ e_cost = 20
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm
new file mode 100644
index 0000000000..d02abf9c88
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/plasma.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_casing/energy/plasma
+ projectile_type = /obj/item/projectile/plasma
+ select_name = "plasma burst"
+ fire_sound = 'sound/weapons/plasma_cutter.ogg'
+ delay = 15
+ e_cost = 25
+
+/obj/item/ammo_casing/energy/plasma/adv
+ projectile_type = /obj/item/projectile/plasma/adv
+ delay = 10
+ e_cost = 10
diff --git a/code/modules/projectiles/ammunition/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma_cit.dm
similarity index 100%
rename from code/modules/projectiles/ammunition/plasma.dm
rename to code/modules/projectiles/ammunition/energy/plasma_cit.dm
diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm
new file mode 100644
index 0000000000..3a6300a2f5
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/portal.dm
@@ -0,0 +1,14 @@
+/obj/item/ammo_casing/energy/wormhole
+ projectile_type = /obj/item/projectile/beam/wormhole
+ e_cost = 0
+ fire_sound = 'sound/weapons/pulse3.ogg'
+ var/obj/item/gun/energy/wormhole_projector/gun = null
+ select_name = "blue"
+
+/obj/item/ammo_casing/energy/wormhole/orange
+ projectile_type = /obj/item/projectile/beam/wormhole/orange
+ select_name = "orange"
+
+/obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh)
+ . = ..()
+ gun = wh
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
new file mode 100644
index 0000000000..0438baf490
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -0,0 +1,61 @@
+/obj/item/ammo_casing/energy/ion
+ projectile_type = /obj/item/projectile/ion
+ select_name = "ion"
+ fire_sound = 'sound/weapons/ionrifle.ogg'
+
+/obj/item/ammo_casing/energy/declone
+ projectile_type = /obj/item/projectile/energy/declone
+ select_name = "declone"
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/flora
+ fire_sound = 'sound/effects/stealthoff.ogg'
+
+/obj/item/ammo_casing/energy/flora/yield
+ projectile_type = /obj/item/projectile/energy/florayield
+ select_name = "yield"
+
+/obj/item/ammo_casing/energy/flora/mut
+ projectile_type = /obj/item/projectile/energy/floramut
+ select_name = "mutation"
+
+/obj/item/ammo_casing/energy/temp
+ projectile_type = /obj/item/projectile/temp
+ select_name = "freeze"
+ e_cost = 250
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/temp/hot
+ projectile_type = /obj/item/projectile/temp/hot
+ select_name = "bake"
+
+/obj/item/ammo_casing/energy/meteor
+ projectile_type = /obj/item/projectile/meteor
+ select_name = "goddamn meteor"
+
+/obj/item/ammo_casing/energy/net
+ projectile_type = /obj/item/projectile/energy/net
+ select_name = "netting"
+ pellets = 6
+ variance = 40
+
+/obj/item/ammo_casing/energy/trap
+ projectile_type = /obj/item/projectile/energy/trap
+ select_name = "snare"
+
+/obj/item/ammo_casing/energy/instakill
+ projectile_type = /obj/item/projectile/beam/instakill
+ e_cost = 0
+ select_name = "DESTROY"
+
+/obj/item/ammo_casing/energy/instakill/blue
+ projectile_type = /obj/item/projectile/beam/instakill/blue
+
+/obj/item/ammo_casing/energy/instakill/red
+ projectile_type = /obj/item/projectile/beam/instakill/red
+
+/obj/item/ammo_casing/energy/tesla_revolver
+ fire_sound = 'sound/magic/lightningbolt.ogg'
+ e_cost = 200
+ select_name = "stun"
+ projectile_type = /obj/item/projectile/energy/tesla/revolver
diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm
new file mode 100644
index 0000000000..5a88a97b08
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy/stun.dm
@@ -0,0 +1,24 @@
+/obj/item/ammo_casing/energy/electrode
+ projectile_type = /obj/item/projectile/energy/electrode
+ select_name = "stun"
+ fire_sound = 'sound/weapons/taser.ogg'
+ e_cost = 200
+
+/obj/item/ammo_casing/energy/electrode/spec
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/electrode/gun
+ fire_sound = 'sound/weapons/gunshot.ogg'
+ e_cost = 100
+
+/obj/item/ammo_casing/energy/electrode/hos
+ e_cost = 200
+
+/obj/item/ammo_casing/energy/electrode/old
+ e_cost = 1000
+
+/obj/item/ammo_casing/energy/disabler
+ projectile_type = /obj/item/projectile/beam/disabler
+ select_name = "disable"
+ e_cost = 50
+ fire_sound = 'sound/weapons/taser2.ogg'
diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm
new file mode 100644
index 0000000000..6ebf5739a9
--- /dev/null
+++ b/code/modules/projectiles/ammunition/special/magic.dm
@@ -0,0 +1,42 @@
+/obj/item/ammo_casing/magic
+ name = "magic casing"
+ desc = "I didn't even know magic needed ammo..."
+ projectile_type = /obj/item/projectile/magic
+ firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
+ heavy_metal = FALSE
+
+/obj/item/ammo_casing/magic/change
+ projectile_type = /obj/item/projectile/magic/change
+
+/obj/item/ammo_casing/magic/animate
+ projectile_type = /obj/item/projectile/magic/animate
+
+/obj/item/ammo_casing/magic/heal
+ projectile_type = /obj/item/projectile/magic/resurrection
+
+/obj/item/ammo_casing/magic/death
+ projectile_type = /obj/item/projectile/magic/death
+
+/obj/item/ammo_casing/magic/teleport
+ projectile_type = /obj/item/projectile/magic/teleport
+
+/obj/item/ammo_casing/magic/door
+ projectile_type = /obj/item/projectile/magic/door
+
+/obj/item/ammo_casing/magic/fireball
+ projectile_type = /obj/item/projectile/magic/aoe/fireball
+
+/obj/item/ammo_casing/magic/chaos
+ projectile_type = /obj/item/projectile/magic
+
+/obj/item/ammo_casing/magic/spellblade
+ projectile_type = /obj/item/projectile/magic/spellblade
+
+/obj/item/ammo_casing/magic/arcane_barrage
+ projectile_type = /obj/item/projectile/magic/arcane_barrage
+
+/obj/item/ammo_casing/magic/chaos/newshot()
+ ..()
+
+/obj/item/ammo_casing/magic/honk
+ projectile_type = /obj/item/projectile/bullet/honker
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special/syringe.dm
similarity index 53%
rename from code/modules/projectiles/ammunition/special.dm
rename to code/modules/projectiles/ammunition/special/syringe.dm
index b378d7fa6c..4a2a354ca6 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special/syringe.dm
@@ -1,111 +1,61 @@
-/obj/item/ammo_casing/magic
- name = "magic casing"
- desc = "I didn't even know magic needed ammo..."
- projectile_type = /obj/item/projectile/magic
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
- heavy_metal = FALSE
-
-/obj/item/ammo_casing/magic/change
- projectile_type = /obj/item/projectile/magic/change
-
-/obj/item/ammo_casing/magic/animate
- projectile_type = /obj/item/projectile/magic/animate
-
-/obj/item/ammo_casing/magic/heal
- projectile_type = /obj/item/projectile/magic/resurrection
-
-/obj/item/ammo_casing/magic/death
- projectile_type = /obj/item/projectile/magic/death
-
-/obj/item/ammo_casing/magic/teleport
- projectile_type = /obj/item/projectile/magic/teleport
-
-/obj/item/ammo_casing/magic/door
- projectile_type = /obj/item/projectile/magic/door
-
-/obj/item/ammo_casing/magic/fireball
- projectile_type = /obj/item/projectile/magic/aoe/fireball
-
-/obj/item/ammo_casing/magic/chaos
- projectile_type = /obj/item/projectile/magic
-
-/obj/item/ammo_casing/magic/spellblade
- projectile_type = /obj/item/projectile/magic/spellblade
-
-/obj/item/ammo_casing/magic/arcane_barrage
- projectile_type = /obj/item/projectile/magic/arcane_barrage
-
-/obj/item/ammo_casing/magic/chaos/newshot()
- ..()
-
-/obj/item/ammo_casing/magic/honk
- projectile_type = /obj/item/projectile/bullet/honker
-
-/obj/item/ammo_casing/syringegun
- name = "syringe gun spring"
- desc = "A high-power spring that throws syringes."
- projectile_type = /obj/item/projectile/bullet/dart/syringe
- firing_effect_type = null
-
-/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/syringe))
- var/obj/item/gun/syringe/SG = loc
- if(!SG.syringes.len)
- return
-
- var/obj/item/reagent_containers/syringe/S = SG.syringes[1]
-
- S.reagents.trans_to(BB, S.reagents.total_volume)
- BB.name = S.name
- var/obj/item/projectile/bullet/dart/D = BB
- D.piercing = S.proj_piercing
- SG.syringes.Remove(S)
- qdel(S)
- ..()
-
-/obj/item/ammo_casing/chemgun
- name = "dart synthesiser"
- desc = "A high-power spring, linked to an energy-based dart synthesiser."
- projectile_type = /obj/item/projectile/bullet/dart
- firing_effect_type = null
-
-/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/chem))
- var/obj/item/gun/chem/CG = loc
- if(CG.syringes_left <= 0)
- return
- CG.reagents.trans_to(BB, 15)
- BB.name = "chemical dart"
- CG.syringes_left--
- ..()
-
-/obj/item/ammo_casing/dnainjector
- name = "rigged syringe gun spring"
- desc = "A high-power spring that throws DNA injectors."
- projectile_type = /obj/item/projectile/bullet/dnainjector
- firing_effect_type = null
-
-/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if(!BB)
- return
- if(istype(loc, /obj/item/gun/syringe/dna))
- var/obj/item/gun/syringe/dna/SG = loc
- if(!SG.syringes.len)
- return
-
- var/obj/item/dnainjector/S = popleft(SG.syringes)
- var/obj/item/projectile/bullet/dnainjector/D = BB
- S.forceMove(D)
- D.injector = S
- ..()
-
-/obj/item/ammo_casing/energy/c3dbullet
- projectile_type = /obj/item/projectile/bullet/c3d
- select_name = "spraydown"
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- e_cost = 20
- firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
+/obj/item/ammo_casing/syringegun
+ name = "syringe gun spring"
+ desc = "A high-power spring that throws syringes."
+ projectile_type = /obj/item/projectile/bullet/dart/syringe
+ firing_effect_type = null
+
+/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/syringe))
+ var/obj/item/gun/syringe/SG = loc
+ if(!SG.syringes.len)
+ return
+
+ var/obj/item/reagent_containers/syringe/S = SG.syringes[1]
+
+ S.reagents.trans_to(BB, S.reagents.total_volume)
+ BB.name = S.name
+ var/obj/item/projectile/bullet/dart/D = BB
+ D.piercing = S.proj_piercing
+ SG.syringes.Remove(S)
+ qdel(S)
+ ..()
+
+/obj/item/ammo_casing/chemgun
+ name = "dart synthesiser"
+ desc = "A high-power spring, linked to an energy-based dart synthesiser."
+ projectile_type = /obj/item/projectile/bullet/dart
+ firing_effect_type = null
+
+/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/chem))
+ var/obj/item/gun/chem/CG = loc
+ if(CG.syringes_left <= 0)
+ return
+ CG.reagents.trans_to(BB, 15)
+ BB.name = "chemical dart"
+ CG.syringes_left--
+ ..()
+
+/obj/item/ammo_casing/dnainjector
+ name = "rigged syringe gun spring"
+ desc = "A high-power spring that throws DNA injectors."
+ projectile_type = /obj/item/projectile/bullet/dnainjector
+ firing_effect_type = null
+
+/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ if(!BB)
+ return
+ if(istype(loc, /obj/item/gun/syringe/dna))
+ var/obj/item/gun/syringe/dna/SG = loc
+ if(!SG.syringes.len)
+ return
+
+ var/obj/item/dnainjector/S = popleft(SG.syringes)
+ var/obj/item/projectile/bullet/dnainjector/D = BB
+ S.forceMove(D)
+ D.injector = S
+ ..()
diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
similarity index 96%
rename from code/modules/projectiles/box_magazine.dm
rename to code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 57860e7910..1c5a2b1199 100644
--- a/code/modules/projectiles/box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -1,121 +1,121 @@
-//Boxes of ammo
-/obj/item/ammo_box
- name = "ammo box (null_reference_exception)"
- desc = "A box of ammo."
- icon_state = "357"
- icon = 'icons/obj/ammo.dmi'
- flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- item_state = "syringe_kit"
- lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
- materials = list(MAT_METAL=30000)
- throwforce = 2
- w_class = WEIGHT_CLASS_TINY
- throw_speed = 3
- throw_range = 7
- var/list/stored_ammo = list()
- var/ammo_type = /obj/item/ammo_casing
- var/max_ammo = 7
- var/multiple_sprites = 0
- var/caliber
- var/multiload = 1
- var/start_empty = 0
-
-/obj/item/ammo_box/Initialize()
- . = ..()
- if(!start_empty)
- for(var/i = 1, i <= max_ammo, i++)
- stored_ammo += new ammo_type(src)
- update_icon()
-
-/obj/item/ammo_box/proc/get_round(keep = 0)
- if (!stored_ammo.len)
- return null
- else
- var/b = stored_ammo[stored_ammo.len]
- stored_ammo -= b
- if (keep)
- stored_ammo.Insert(1,b)
- return b
-
-/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
- // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
- if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
- return 0
-
- if (stored_ammo.len < max_ammo)
- stored_ammo += R
- R.forceMove(src)
- return 1
-
- //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
- else if(replace_spent)
- for(var/obj/item/ammo_casing/AC in stored_ammo)
- if(!AC.BB)//found a spent ammo
- stored_ammo -= AC
- AC.forceMove(get_turf(src.loc))
-
- stored_ammo += R
- R.forceMove(src)
- return 1
-
- return 0
-
-/obj/item/ammo_box/proc/can_load(mob/user)
- return 1
-
-/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
- var/num_loaded = 0
- if(!can_load(user))
- return
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- var/did_load = give_round(AC, replace_spent)
- if(did_load)
- AM.stored_ammo -= AC
- num_loaded++
- if(!did_load || !multiload)
- break
- if(istype(A, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/AC = A
- if(give_round(AC, replace_spent))
- user.transferItemToLoc(AC, src, TRUE)
- num_loaded++
-
- if(num_loaded)
- if(!silent)
- to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
- playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
- A.update_icon()
- update_icon()
-
- return num_loaded
-
-/obj/item/ammo_box/attack_self(mob/user)
- var/obj/item/ammo_casing/A = get_round()
- if(A)
- if(!user.put_in_hands(A))
- A.bounce_away(FALSE, NONE)
- playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
- to_chat(user, "You remove a round from \the [src]!")
- update_icon()
-
-/obj/item/ammo_box/update_icon()
- switch(multiple_sprites)
- if(1)
- icon_state = "[initial(icon_state)]-[stored_ammo.len]"
- if(2)
- icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
- desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
-
-//Behavior for magazines
-/obj/item/ammo_box/magazine/proc/ammo_count()
- return stored_ammo.len
-
-/obj/item/ammo_box/magazine/proc/empty_magazine()
- var/turf_mag = get_turf(src)
- for(var/obj/item/ammo in stored_ammo)
- ammo.forceMove(turf_mag)
+//Boxes of ammo
+/obj/item/ammo_box
+ name = "ammo box (null_reference_exception)"
+ desc = "A box of ammo."
+ icon_state = "357"
+ icon = 'icons/obj/ammo.dmi'
+ flags_1 = CONDUCT_1
+ slot_flags = SLOT_BELT
+ item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ materials = list(MAT_METAL=30000)
+ throwforce = 2
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 3
+ throw_range = 7
+ var/list/stored_ammo = list()
+ var/ammo_type = /obj/item/ammo_casing
+ var/max_ammo = 7
+ var/multiple_sprites = 0
+ var/caliber
+ var/multiload = 1
+ var/start_empty = 0
+
+/obj/item/ammo_box/Initialize()
+ . = ..()
+ if(!start_empty)
+ for(var/i = 1, i <= max_ammo, i++)
+ stored_ammo += new ammo_type(src)
+ update_icon()
+
+/obj/item/ammo_box/proc/get_round(keep = 0)
+ if (!stored_ammo.len)
+ return null
+ else
+ var/b = stored_ammo[stored_ammo.len]
+ stored_ammo -= b
+ if (keep)
+ stored_ammo.Insert(1,b)
+ return b
+
+/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
+ // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
+ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
+ return 0
+
+ if (stored_ammo.len < max_ammo)
+ stored_ammo += R
+ R.forceMove(src)
+ return 1
+
+ //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
+ else if(replace_spent)
+ for(var/obj/item/ammo_casing/AC in stored_ammo)
+ if(!AC.BB)//found a spent ammo
+ stored_ammo -= AC
+ AC.forceMove(get_turf(src.loc))
+
+ stored_ammo += R
+ R.forceMove(src)
+ return 1
+
+ return 0
+
+/obj/item/ammo_box/proc/can_load(mob/user)
+ return 1
+
+/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
+ var/num_loaded = 0
+ if(!can_load(user))
+ return
+ if(istype(A, /obj/item/ammo_box))
+ var/obj/item/ammo_box/AM = A
+ for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
+ var/did_load = give_round(AC, replace_spent)
+ if(did_load)
+ AM.stored_ammo -= AC
+ num_loaded++
+ if(!did_load || !multiload)
+ break
+ if(istype(A, /obj/item/ammo_casing))
+ var/obj/item/ammo_casing/AC = A
+ if(give_round(AC, replace_spent))
+ user.transferItemToLoc(AC, src, TRUE)
+ num_loaded++
+
+ if(num_loaded)
+ if(!silent)
+ to_chat(user, "You load [num_loaded] shell\s into \the [src]!")
+ playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
+ A.update_icon()
+ update_icon()
+
+ return num_loaded
+
+/obj/item/ammo_box/attack_self(mob/user)
+ var/obj/item/ammo_casing/A = get_round()
+ if(A)
+ if(!user.put_in_hands(A))
+ A.bounce_away(FALSE, NONE)
+ playsound(src, 'sound/weapons/bulletinsert.ogg', 60, 1)
+ to_chat(user, "You remove a round from \the [src]!")
+ update_icon()
+
+/obj/item/ammo_box/update_icon()
+ switch(multiple_sprites)
+ if(1)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len]"
+ if(2)
+ icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
+ desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
+
+//Behavior for magazines
+/obj/item/ammo_box/magazine/proc/ammo_count()
+ return stored_ammo.len
+
+/obj/item/ammo_box/magazine/proc/empty_magazine()
+ var/turf_mag = get_turf(src)
+ for(var/obj/item/ammo in stored_ammo)
+ ammo.forceMove(turf_mag)
stored_ammo -= ammo
\ No newline at end of file
diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm
new file mode 100644
index 0000000000..2b3c31f81c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm
@@ -0,0 +1,8 @@
+/obj/item/ammo_box/magazine/m75
+ name = "specialized magazine (.75)"
+ icon_state = "75"
+ ammo_type = /obj/item/ammo_casing/caseless/a75
+ caliber = "75"
+ multiple_sprites = 2
+ max_ammo = 8
+
diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm
new file mode 100644
index 0000000000..cb42989022
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_box/magazine/mm195x129
+ name = "box magazine (1.95x129mm)"
+ icon_state = "a762-50"
+ ammo_type = /obj/item/ammo_casing/mm195x129
+ caliber = "mm195129"
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/mm195x129/hollow
+ name = "box magazine (Hollow-Point 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/hollow
+
+/obj/item/ammo_box/magazine/mm195x129/ap
+ name = "box magazine (Armor Penetrating 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/ap
+
+/obj/item/ammo_box/magazine/mm195x129/incen
+ name = "box magazine (Incendiary 1.95x129mm)"
+ ammo_type = /obj/item/ammo_casing/mm195x129/incen
+
+/obj/item/ammo_box/magazine/mm195x129/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
new file mode 100644
index 0000000000..d70b20c65c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -0,0 +1,56 @@
+/obj/item/ammo_box/magazine/m10mm
+ name = "pistol magazine (10mm)"
+ desc = "A gun magazine."
+ icon_state = "9x19p"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/m10mm/fire
+ name = "pistol magazine (10mm incendiary)"
+ icon_state = "9x19pI"
+ desc = "A gun magazine. Loaded with rounds which ignite the target."
+ ammo_type = /obj/item/ammo_casing/c10mm/fire
+
+/obj/item/ammo_box/magazine/m10mm/hp
+ name = "pistol magazine (10mm HP)"
+ icon_state = "9x19pH"
+ desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
+ ammo_type = /obj/item/ammo_casing/c10mm/hp
+
+/obj/item/ammo_box/magazine/m10mm/ap
+ name = "pistol magazine (10mm AP)"
+ icon_state = "9x19pA"
+ desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
+ ammo_type = /obj/item/ammo_casing/c10mm/ap
+
+/obj/item/ammo_box/magazine/m45
+ name = "handgun magazine (.45)"
+ icon_state = "45-8"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 8
+
+/obj/item/ammo_box/magazine/m45/update_icon()
+ ..()
+ icon_state = "45-[ammo_count() ? "8" : "0"]"
+
+/obj/item/ammo_box/magazine/pistolm9mm
+ name = "pistol magazine (9mm)"
+ icon_state = "9x19p-8"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 15
+
+/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
+ ..()
+ icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
+
+/obj/item/ammo_box/magazine/m50
+ name = "handgun magazine (.50ae)"
+ icon_state = "50ae"
+ ammo_type = /obj/item/ammo_casing/a50AE
+ caliber = ".50"
+ max_ammo = 7
+ multiple_sprites = 1
diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm
new file mode 100644
index 0000000000..c4fb00aa22
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm
@@ -0,0 +1,14 @@
+/obj/item/ammo_box/magazine/recharge
+ name = "power pack"
+ desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles."
+ icon_state = "oldrifle-20"
+ ammo_type = /obj/item/ammo_casing/caseless/laser
+ caliber = "laser"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/recharge/update_icon()
+ desc = "[initial(desc)] It has [stored_ammo.len] shot\s left."
+ icon_state = "oldrifle-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
+ return
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
new file mode 100644
index 0000000000..96e7d377ea
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -0,0 +1,21 @@
+/obj/item/ammo_box/magazine/m10mm/rifle
+ name = "rifle magazine (10mm)"
+ desc = "A well-worn magazine fitted for the surplus rifle."
+ icon_state = "75-8"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
+ if(ammo_count())
+ icon_state = "75-8"
+ else
+ icon_state = "75-0"
+
+/obj/item/ammo_box/magazine/m556
+ name = "toploader magazine (5.56mm)"
+ icon_state = "5.56m"
+ ammo_type = /obj/item/ammo_casing/a556
+ caliber = "a556"
+ max_ammo = 30
+ multiple_sprites = 2
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
new file mode 100644
index 0000000000..dc8d0175ba
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -0,0 +1,36 @@
+/obj/item/ammo_box/magazine/m12g
+ name = "shotgun magazine (12g taser slugs)"
+ desc = "A drum magazine."
+ icon_state = "m12gs"
+ ammo_type = /obj/item/ammo_casing/shotgun/stunslug
+ caliber = "shotgun"
+ max_ammo = 8
+
+/obj/item/ammo_box/magazine/m12g/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]"
+
+/obj/item/ammo_box/magazine/m12g/buckshot
+ name = "shotgun magazine (12g buckshot slugs)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/magazine/m12g/slug
+ name = "shotgun magazine (12g slugs)"
+ icon_state = "m12gb"
+ ammo_type = /obj/item/ammo_casing/shotgun
+
+/obj/item/ammo_box/magazine/m12g/dragon
+ name = "shotgun magazine (12g dragon's breath)"
+ icon_state = "m12gf"
+ ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
+
+/obj/item/ammo_box/magazine/m12g/bioterror
+ name = "shotgun magazine (12g bioterror)"
+ icon_state = "m12gt"
+ ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
+
+/obj/item/ammo_box/magazine/m12g/meteor
+ name = "shotgun magazine (12g meteor slugs)"
+ icon_state = "m12gbc"
+ ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
new file mode 100644
index 0000000000..c6dc004879
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -0,0 +1,76 @@
+/obj/item/ammo_box/magazine/wt550m9
+ name = "wt550 magazine (4.6x30mm)"
+ icon_state = "46x30mmt-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm
+ caliber = "4.6x30mm"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/wt550m9/update_icon()
+ ..()
+ icon_state = "46x30mmt-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/wt550m9/wtap
+ name = "wt550 magazine (Armour Piercing 4.6x30mm)"
+ icon_state = "46x30mmtA-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm/ap
+
+/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
+ ..()
+ icon_state = "46x30mmtA-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/wt550m9/wtic
+ name = "wt550 magazine (Incindiary 4.6x30mm)"
+ icon_state = "46x30mmtI-20"
+ ammo_type = /obj/item/ammo_casing/c46x30mm/inc
+
+/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
+ ..()
+ icon_state = "46x30mmtI-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/uzim9mm
+ name = "uzi magazine (9mm)"
+ icon_state = "uzi9mm-32"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 32
+
+/obj/item/ammo_box/magazine/uzim9mm/update_icon()
+ ..()
+ icon_state = "uzi9mm-[round(ammo_count(),4)]"
+
+/obj/item/ammo_box/magazine/smgm9mm
+ name = "SMG magazine (9mm)"
+ icon_state = "smg9mm-42"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 21
+
+/obj/item/ammo_box/magazine/smgm9mm/update_icon()
+ ..()
+ icon_state = "smg9mm-[ammo_count() ? "42" : "0"]"
+
+/obj/item/ammo_box/magazine/smgm9mm/ap
+ name = "SMG magazine (Armour Piercing 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm/ap
+
+/obj/item/ammo_box/magazine/smgm9mm/fire
+ name = "SMG Magazine (Incindiary 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm/inc
+
+/obj/item/ammo_box/magazine/smgm45
+ name = "SMG magazine (.45)"
+ icon_state = "c20r45-24"
+ ammo_type = /obj/item/ammo_casing/c45/nostamina
+ caliber = ".45"
+ max_ammo = 24
+
+/obj/item/ammo_box/magazine/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/tommygunm45
+ name = "drum magazine (.45)"
+ icon_state = "drum45"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 50
diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm
new file mode 100644
index 0000000000..67c6257bac
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm
@@ -0,0 +1,26 @@
+/obj/item/ammo_box/magazine/sniper_rounds
+ name = "sniper rounds (.50)"
+ icon_state = ".50mag"
+ ammo_type = /obj/item/ammo_casing/p50
+ max_ammo = 6
+ caliber = ".50"
+
+/obj/item/ammo_box/magazine/sniper_rounds/update_icon()
+ if(ammo_count())
+ icon_state = "[initial(icon_state)]-ammo"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/item/ammo_box/magazine/sniper_rounds/soporific
+ name = "sniper rounds (Zzzzz)"
+ desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
+ icon_state = "soporific"
+ ammo_type = /obj/item/ammo_casing/p50/soporific
+ max_ammo = 3
+ caliber = ".50"
+
+/obj/item/ammo_box/magazine/sniper_rounds/penetrator
+ name = "sniper rounds (penetrator)"
+ desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
+ ammo_type = /obj/item/ammo_casing/p50/penetrator
+ max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
new file mode 100644
index 0000000000..cb66391c02
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -0,0 +1,55 @@
+/obj/item/ammo_box/magazine/toy
+ name = "foam force META magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+
+/obj/item/ammo_box/magazine/toy/smg
+ name = "foam force SMG magazine"
+ icon_state = "smg9mm-42"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smg/update_icon()
+ ..()
+ if(ammo_count())
+ icon_state = "smg9mm-42"
+ else
+ icon_state = "smg9mm-0"
+
+/obj/item/ammo_box/magazine/toy/smg/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/pistol
+ name = "foam force pistol magazine"
+ icon_state = "9x19p"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/smgm45
+ name = "donksoft SMG magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/toy/smgm45/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/ammo_box/magazine/toy/m762
+ name = "donksoft box magazine"
+ caliber = "foam_force"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/toy/m762/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
+
+/obj/item/ammo_box/magazine/toy/m762/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
deleted file mode 100644
index b7b3a3e286..0000000000
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ /dev/null
@@ -1,340 +0,0 @@
-
-///////////EXTERNAL MAGAZINES////////////////
-
-/obj/item/ammo_box/magazine/m10mm
- name = "pistol magazine (10mm)"
- desc = "A gun magazine."
- icon_state = "9x19p"
- ammo_type = /obj/item/ammo_casing/c10mm
- caliber = "10mm"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m10mm/rifle
- name = "rifle magazine (10mm)"
- desc = "A well-worn magazine fitted for the surplus rifle."
- icon_state = "75-8"
- ammo_type = /obj/item/ammo_casing/c10mm
- caliber = "10mm"
- max_ammo = 10
-
-/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
- if(ammo_count())
- icon_state = "75-8"
- else
- icon_state = "75-0"
-
-
-/obj/item/ammo_box/magazine/m10mm/fire
- name = "pistol magazine (10mm incendiary)"
- icon_state = "9x19pI"
- desc = "A gun magazine. Loaded with rounds which ignite the target."
- ammo_type = /obj/item/ammo_casing/c10mm/fire
-
-/obj/item/ammo_box/magazine/m10mm/hp
- name = "pistol magazine (10mm HP)"
- icon_state = "9x19pH"
- desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
- ammo_type = /obj/item/ammo_casing/c10mm/hp
-
-/obj/item/ammo_box/magazine/m10mm/ap
- name = "pistol magazine (10mm AP)"
- icon_state = "9x19pA"
- desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
- ammo_type = /obj/item/ammo_casing/c10mm/ap
-
-/obj/item/ammo_box/magazine/m45
- name = "handgun magazine (.45)"
- icon_state = "45-8"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m45/update_icon()
- ..()
- icon_state = "45-[ammo_count() ? "8" : "0"]"
-
-/obj/item/ammo_box/magazine/wt550m9
- name = "wt550 magazine (4.6x30mm)"
- icon_state = "46x30mmt-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm
- caliber = "4.6x30mm"
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/wt550m9/update_icon()
- ..()
- icon_state = "46x30mmt-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/wt550m9/wtap
- name = "wt550 magazine (Armour Piercing 4.6x30mm)"
- icon_state = "46x30mmtA-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm/ap
-
-/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
- ..()
- icon_state = "46x30mmtA-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/wt550m9/wtic
- name = "wt550 magazine (Incindiary 4.6x30mm)"
- icon_state = "46x30mmtI-20"
- ammo_type = /obj/item/ammo_casing/c46x30mm/inc
-
-/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
- ..()
- icon_state = "46x30mmtI-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/uzim9mm
- name = "uzi magazine (9mm)"
- icon_state = "uzi9mm-32"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 32
-
-/obj/item/ammo_box/magazine/uzim9mm/update_icon()
- ..()
- icon_state = "uzi9mm-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/smgm9mm
- name = "SMG magazine (9mm)"
- icon_state = "smg9mm-42"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 21
-
-/obj/item/ammo_box/magazine/smgm9mm/update_icon()
- ..()
- icon_state = "smg9mm-[ammo_count() ? "42" : "0"]"
-
-/obj/item/ammo_box/magazine/smgm9mm/ap
- name = "SMG magazine (Armour Piercing 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mm/ap
-
-/obj/item/ammo_box/magazine/smgm9mm/fire
- name = "SMG Magazine (Incindiary 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mm/inc
-
-/obj/item/ammo_box/magazine/pistolm9mm
- name = "pistol magazine (9mm)"
- icon_state = "9x19p-8"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 15
-
-/obj/item/ammo_box/magazine/pistolm9mm/update_icon()
- ..()
- icon_state = "9x19p-[ammo_count() ? "8" : "0"]"
-
-/obj/item/ammo_box/magazine/smgm45
- name = "SMG magazine (.45)"
- icon_state = "c20r45-24"
- ammo_type = /obj/item/ammo_casing/c45/nostamina
- caliber = ".45"
- max_ammo = 24
-
-/obj/item/ammo_box/magazine/smgm45/update_icon()
- ..()
- icon_state = "c20r45-[round(ammo_count(),2)]"
-
-/obj/item/ammo_box/magazine/tommygunm45
- name = "drum magazine (.45)"
- icon_state = "drum45"
- ammo_type = /obj/item/ammo_casing/c45
- caliber = ".45"
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/m50
- name = "handgun magazine (.50ae)"
- icon_state = "50ae"
- ammo_type = /obj/item/ammo_casing/a50AE
- caliber = ".50"
- max_ammo = 7
- multiple_sprites = 1
-
-/obj/item/ammo_box/magazine/m75
- name = "specialized magazine (.75)"
- icon_state = "75"
- ammo_type = /obj/item/ammo_casing/caseless/a75
- caliber = "75"
- multiple_sprites = 2
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m556
- name = "toploader magazine (5.56mm)"
- icon_state = "5.56m"
- ammo_type = /obj/item/ammo_casing/a556
- caliber = "a556"
- max_ammo = 30
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m12g
- name = "shotgun magazine (12g taser slugs)"
- desc = "A drum magazine."
- icon_state = "m12gs"
- ammo_type = /obj/item/ammo_casing/shotgun/stunslug
- caliber = "shotgun"
- max_ammo = 8
-
-/obj/item/ammo_box/magazine/m12g/update_icon()
- ..()
- icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]"
-
-/obj/item/ammo_box/magazine/m12g/buckshot
- name = "shotgun magazine (12g buckshot slugs)"
- icon_state = "m12gb"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
-
-/obj/item/ammo_box/magazine/m12g/slug
- name = "shotgun magazine (12g slugs)"
- icon_state = "m12gb"
- ammo_type = /obj/item/ammo_casing/shotgun
-
-/obj/item/ammo_box/magazine/m12g/dragon
- name = "shotgun magazine (12g dragon's breath)"
- icon_state = "m12gf"
- ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
-
-/obj/item/ammo_box/magazine/m12g/bioterror
- name = "shotgun magazine (12g bioterror)"
- icon_state = "m12gt"
- ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
-
-/obj/item/ammo_box/magazine/m12g/meteor
- name = "shotgun magazine (12g meteor slugs)"
- icon_state = "m12gbc"
- ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
-
-
-//// SNIPER MAGAZINES
-
-/obj/item/ammo_box/magazine/sniper_rounds
- name = "sniper rounds (.50)"
- icon_state = ".50mag"
- ammo_type = /obj/item/ammo_casing/p50
- max_ammo = 6
- caliber = ".50"
-
-/obj/item/ammo_box/magazine/sniper_rounds/update_icon()
- if(ammo_count())
- icon_state = "[initial(icon_state)]-ammo"
- else
- icon_state = "[initial(icon_state)]"
-
-/obj/item/ammo_box/magazine/sniper_rounds/soporific
- name = "sniper rounds (Zzzzz)"
- desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
- icon_state = "soporific"
- ammo_type = /obj/item/ammo_casing/p50/soporific
- max_ammo = 3
- caliber = ".50"
-
-/obj/item/ammo_box/magazine/sniper_rounds/penetrator
- name = "sniper rounds (penetrator)"
- desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
- ammo_type = /obj/item/ammo_casing/p50/penetrator
- max_ammo = 5
-
-//// SAW MAGAZINES
-
-/obj/item/ammo_box/magazine/mm195x129
- name = "box magazine (1.95x129mm)"
- icon_state = "a762-50"
- ammo_type = /obj/item/ammo_casing/mm195x129
- caliber = "mm195129"
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/mm195x129/hollow
- name = "box magazine (Hollow-Point 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/hollow
-
-/obj/item/ammo_box/magazine/mm195x129/ap
- name = "box magazine (Armor Penetrating 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/ap
-
-/obj/item/ammo_box/magazine/mm195x129/incen
- name = "box magazine (Incendiary 1.95x129mm)"
- ammo_type = /obj/item/ammo_casing/mm195x129/incen
-
-/obj/item/ammo_box/magazine/mm195x129/update_icon()
- ..()
- icon_state = "a762-[round(ammo_count(),10)]"
-
-
-
-
-////TOY GUN MAGAZINES
-
-/obj/item/ammo_box/magazine/toy
- name = "foam force META magazine"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
-
-/obj/item/ammo_box/magazine/toy/smg
- name = "foam force SMG magazine"
- icon_state = "smg9mm-42"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smg/update_icon()
- ..()
- if(ammo_count())
- icon_state = "smg9mm-42"
- else
- icon_state = "smg9mm-0"
-
-/obj/item/ammo_box/magazine/toy/smg/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/pistol
- name = "foam force pistol magazine"
- icon_state = "9x19p"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/toy/pistol/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/smgm45
- name = "donksoft SMG magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
- ..()
- icon_state = "c20r45-[round(ammo_count(),2)]"
-
-/obj/item/ammo_box/magazine/toy/smgm45/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/m762
- name = "donksoft box magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/toy/m762/update_icon()
- ..()
- icon_state = "a762-[round(ammo_count(),10)]"
-
-/obj/item/ammo_box/magazine/toy/m762/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-
-
-
-//// RECHARGEABLE MAGAZINES
-
-/obj/item/ammo_box/magazine/recharge
- name = "power pack"
- desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles."
- icon_state = "oldrifle-20"
- ammo_type = /obj/item/ammo_casing/caseless/laser
- caliber = "laser"
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/recharge/update_icon()
- desc = "[initial(desc)] It has [stored_ammo.len] shot\s left."
- icon_state = "oldrifle-[round(ammo_count(),4)]"
-
-/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
- return
diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
new file mode 100644
index 0000000000..bbfc79471c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm
@@ -0,0 +1,47 @@
+/obj/item/ammo_box/magazine/internal/cylinder
+ name = "revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = "357"
+ max_ammo = 7
+
+/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1)
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in stored_ammo)
+ if(bullet && (bullet.BB || countempties))
+ boolets++
+
+ return boolets
+
+/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0)
+ rotate()
+
+ var/b = stored_ammo[1]
+ if(!keep)
+ stored_ammo[1] = null
+
+ return b
+
+/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
+ var/b = stored_ammo[1]
+ stored_ammo.Cut(1,2)
+ stored_ammo.Insert(0, b)
+
+/obj/item/ammo_box/magazine/internal/cylinder/proc/spin()
+ for(var/i in 1 to rand(0, max_ammo*2))
+ rotate()
+
+/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0)
+ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
+ return FALSE
+
+ for(var/i in 1 to stored_ammo.len)
+ var/obj/item/ammo_casing/bullet = stored_ammo[i]
+ if(!bullet || !bullet.BB) // found a spent ammo
+ stored_ammo[i] = R
+ R.forceMove(src)
+
+ if(bullet)
+ bullet.forceMove(drop_location())
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/code/modules/projectiles/boxes_magazines/internal/_internal.dm
new file mode 100644
index 0000000000..e21cb5ce61
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/_internal.dm
@@ -0,0 +1,7 @@
+/obj/item/ammo_box/magazine/internal
+ desc = "Oh god, this shouldn't be here"
+ flags_1 = CONDUCT_1|ABSTRACT_1
+
+//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in
+/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R)
+ return ..(R,1)
diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
new file mode 100644
index 0000000000..12325a0299
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
@@ -0,0 +1,17 @@
+/obj/item/ammo_box/magazine/internal/cylinder/grenademulti
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ caliber = "40mm"
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/grenadelauncher
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ caliber = "40mm"
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/rocketlauncher
+ name = "grenade launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/a84mm
+ caliber = "84mm"
+ max_ammo = 1
diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm
new file mode 100644
index 0000000000..aab0643cbc
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm
@@ -0,0 +1,11 @@
+/obj/item/ammo_box/magazine/internal/speargun
+ name = "speargun internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/magspear
+ caliber = "speargun"
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/minigun
+ name = "gatling gun fusion core"
+ ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
+ caliber = "gatling"
+ max_ammo = 5000
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
new file mode 100644
index 0000000000..976f80f437
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -0,0 +1,22 @@
+/obj/item/ammo_box/magazine/internal/cylinder/rev38
+ name = "detective revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/c38
+ caliber = "38"
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/cylinder/rev762
+ name = "nagant revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/n762
+ caliber = "n762"
+ max_ammo = 7
+
+/obj/item/ammo_box/magazine/internal/cylinder/rus357
+ name = "russian revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = "357"
+ max_ammo = 6
+ multiload = 0
+
+/obj/item/ammo_box/magazine/internal/rus357/Initialize()
+ stored_ammo += new ammo_type(src)
+ . = ..()
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
new file mode 100644
index 0000000000..ef83e96b1c
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -0,0 +1,15 @@
+/obj/item/ammo_box/magazine/internal/boltaction
+ name = "bolt action rifle internal magazine"
+ desc = "Oh god, this shouldn't be here"
+ ammo_type = /obj/item/ammo_casing/a762
+ caliber = "a762"
+ max_ammo = 5
+ multiload = 1
+
+/obj/item/ammo_box/magazine/internal/boltaction/enchanted
+ max_ammo = 1
+ ammo_type = /obj/item/ammo_casing/a762/enchanted
+
+/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
+ ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
+
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
new file mode 100644
index 0000000000..3bd277da31
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -0,0 +1,48 @@
+/obj/item/ammo_box/magazine/internal/shot
+ name = "shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/beanbag
+ caliber = "shotgun"
+ max_ammo = 4
+ multiload = 0
+
+/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
+ if (!countempties)
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in stored_ammo)
+ if(bullet.BB)
+ boolets++
+ return boolets
+ else
+ return ..()
+
+/obj/item/ammo_box/magazine/internal/shot/tube
+ name = "dual feed shotgun internal tube"
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/lethal
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/ammo_box/magazine/internal/shot/com
+ name = "combat shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ max_ammo = 6
+
+/obj/item/ammo_box/magazine/internal/shot/com/compact
+ name = "compact combat shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/dual
+ name = "double-barrel shotgun internal magazine"
+ max_ammo = 2
+
+/obj/item/ammo_box/magazine/internal/shot/improvised
+ name = "improvised shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/improvised
+ max_ammo = 1
+
+/obj/item/ammo_box/magazine/internal/shot/riot
+ name = "riot shotgun internal magazine"
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+ max_ammo = 6
diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm
new file mode 100644
index 0000000000..f2bb0dbf08
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm
@@ -0,0 +1,7 @@
+/obj/item/ammo_box/magazine/internal/shot/toy
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ caliber = "foam_force"
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm
deleted file mode 100644
index b26d30c389..0000000000
--- a/code/modules/projectiles/boxes_magazines/internal_mag.dm
+++ /dev/null
@@ -1,191 +0,0 @@
-////////////////INTERNAL MAGAZINES//////////////////////
-
-/obj/item/ammo_box/magazine/internal
- desc = "Oh god, this shouldn't be here"
- flags_1 = CONDUCT_1|ABSTRACT_1
-
-//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in
-/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R)
- return ..(R,1)
-
-
-
-// Revolver internal mags
-/obj/item/ammo_box/magazine/internal/cylinder
- name = "revolver cylinder"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = "357"
- max_ammo = 7
-
-/obj/item/ammo_box/magazine/internal/cylinder/ammo_count(countempties = 1)
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in stored_ammo)
- if(bullet && (bullet.BB || countempties))
- boolets++
-
- return boolets
-
-/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0)
- rotate()
-
- var/b = stored_ammo[1]
- if(!keep)
- stored_ammo[1] = null
-
- return b
-
-/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate()
- var/b = stored_ammo[1]
- stored_ammo.Cut(1,2)
- stored_ammo.Insert(0, b)
-
-/obj/item/ammo_box/magazine/internal/cylinder/proc/spin()
- for(var/i in 1 to rand(0, max_ammo*2))
- rotate()
-
-
-/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0)
- if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
- return 0
-
- for(var/i in 1 to stored_ammo.len)
- var/obj/item/ammo_casing/bullet = stored_ammo[i]
- if(!bullet || !bullet.BB) // found a spent ammo
- stored_ammo[i] = R
- R.forceMove(src)
-
- if(bullet)
- bullet.forceMove(drop_location())
- return 1
-
- return 0
-
-/obj/item/ammo_box/magazine/internal/cylinder/rev38
- name = "detective revolver cylinder"
- ammo_type = /obj/item/ammo_casing/c38
- caliber = "38"
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/cylinder/grenademulti
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/a40mm
- caliber = "40mm"
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/cylinder/rev762
- name = "nagant revolver cylinder"
- ammo_type = /obj/item/ammo_casing/n762
- caliber = "n762"
- max_ammo = 7
-
-// Shotgun internal mags
-/obj/item/ammo_box/magazine/internal/shot
- name = "shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
- caliber = "shotgun"
- max_ammo = 4
- multiload = 0
-
-/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
- if (!countempties)
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in stored_ammo)
- if(bullet.BB)
- boolets++
- return boolets
- else
- return ..()
-
-
-/obj/item/ammo_box/magazine/internal/shot/tube
- name = "dual feed shotgun internal tube"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/lethal
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
-
-/obj/item/ammo_box/magazine/internal/shot/com
- name = "combat shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 6
-
-/obj/item/ammo_box/magazine/internal/shot/com/compact
- name = "compact combat shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/dual
- name = "double-barrel shotgun internal magazine"
- max_ammo = 2
-
-/obj/item/ammo_box/magazine/internal/shot/improvised
- name = "improvised shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/improvised
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/shot/riot
- name = "riot shotgun internal magazine"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
- max_ammo = 6
-
-
-
-
-/obj/item/ammo_box/magazine/internal/grenadelauncher
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/a40mm
- caliber = "40mm"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/rocketlauncher
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/a84mm
- caliber = "84mm"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/speargun
- name = "speargun internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/magspear
- caliber = "speargun"
- max_ammo = 1
-
-/obj/item/ammo_box/magazine/internal/cylinder/rus357
- name = "russian revolver cylinder"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = "357"
- max_ammo = 6
- multiload = 0
-
-/obj/item/ammo_box/magazine/internal/rus357/Initialize()
- stored_ammo += new ammo_type(src)
- . = ..()
-
-/obj/item/ammo_box/magazine/internal/boltaction
- name = "bolt action rifle internal magazine"
- desc = "Oh god, this shouldn't be here"
- ammo_type = /obj/item/ammo_casing/a762
- caliber = "a762"
- max_ammo = 5
- multiload = 1
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted
- max_ammo = 1
- ammo_type = /obj/item/ammo_casing/a762/enchanted
-
-/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
- ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
-
-/obj/item/ammo_box/magazine/internal/shot/toy
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
- max_ammo = 5
-
-/obj/item/ammo_box/magazine/internal/minigun
- name = "gatling gun fusion core"
- ammo_type = /obj/item/ammo_casing/caseless/laser/gatling
- caliber = "gatling"
- max_ammo = 5000
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index a1de4db477..0a2503fd5d 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -27,7 +27,7 @@
var/obj/item/ammo_casing/chambered = null
trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
var/sawn_desc = null //description change if weapon is sawn-off
- var/sawn_state = SAWN_INTACT
+ var/sawn_off = FALSE
var/burst_size = 1 //how large a burst is
var/fire_delay = 0 //rate of fire for burst firing and semi auto
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index c16c5f0fc0..f7cb05486f 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -21,9 +21,9 @@
/obj/item/gun/ballistic/update_icon()
..()
if(current_skin)
- icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]"
else
- icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]"
/obj/item/gun/ballistic/process_chamber(empty_chamber = 1)
@@ -185,7 +185,7 @@
/obj/item/gun/ballistic/proc/sawoff(mob/user)
- if(sawn_state == SAWN_OFF)
+ if(sawn_off)
to_chat(user, "\The [src] is already shortened!")
return
user.changeNext_move(CLICK_CD_MELEE)
@@ -197,7 +197,7 @@
return
if(do_after(user, 30, target = src))
- if(sawn_state == SAWN_OFF)
+ if(sawn_off)
return
user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].")
name = "sawn-off [src.name]"
@@ -206,7 +206,7 @@
item_state = "gun"
slot_flags &= ~SLOT_BACK //you can't sling it on your back
slot_flags |= SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
- sawn_state = SAWN_OFF
+ sawn_off = TRUE
update_icon()
return 1
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 14e529ba23..489f88ffad 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -311,7 +311,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
- if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
+ if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
var/obj/item/stack/cable_coil/C = A
if(C.use(10))
slot_flags = SLOT_BACK
@@ -339,7 +339,7 @@
icon_state = "ishotgun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
- sawn_state = SAWN_OFF
+ sawn_off = TRUE
slot_flags = SLOT_BELT
diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm
similarity index 96%
rename from code/modules/projectiles/guns/mounted.dm
rename to code/modules/projectiles/guns/energy/mounted.dm
index 5893c2a107..79226689de 100644
--- a/code/modules/projectiles/guns/mounted.dm
+++ b/code/modules/projectiles/guns/energy/mounted.dm
@@ -1,26 +1,26 @@
-/obj/item/gun/energy/e_gun/advtaser/mounted
- name = "mounted taser"
- desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
- icon = 'icons/obj/items_cyborg.dmi'
- icon_state = "taser"
- item_state = "armcannonstun4"
- force = 5
- selfcharge = 1
- can_flashlight = 0
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
-
-/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
- ..()
-
-/obj/item/gun/energy/laser/mounted
- name = "mounted laser"
- desc = "An arm mounted cannon that fires lethal lasers."
- icon = 'icons/obj/items_cyborg.dmi'
- icon_state = "laser"
- item_state = "armcannonlase"
- force = 5
- selfcharge = 1
- trigger_guard = TRIGGER_GUARD_ALLOW_ALL
-
-/obj/item/gun/energy/laser/mounted/dropped()
- ..()
+/obj/item/gun/energy/e_gun/advtaser/mounted
+ name = "mounted taser"
+ desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "taser"
+ item_state = "armcannonstun4"
+ force = 5
+ selfcharge = 1
+ can_flashlight = 0
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
+
+/obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
+ ..()
+
+/obj/item/gun/energy/laser/mounted
+ name = "mounted laser"
+ desc = "An arm mounted cannon that fires lethal lasers."
+ icon = 'icons/obj/items_cyborg.dmi'
+ icon_state = "laser"
+ item_state = "armcannonlase"
+ force = 5
+ selfcharge = 1
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/gun/energy/laser/mounted/dropped()
+ ..()
diff --git a/code/modules/projectiles/guns/energy/plasma.dm b/code/modules/projectiles/guns/energy/plasma_cit.dm
similarity index 100%
rename from code/modules/projectiles/guns/energy/plasma.dm
rename to code/modules/projectiles/guns/energy/plasma_cit.dm
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
similarity index 97%
rename from code/modules/projectiles/guns/beam_rifle.dm
rename to code/modules/projectiles/guns/misc/beam_rifle.dm
index a2365dfc13..59465eb989 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -1,590 +1,590 @@
-
-#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0
-#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1
-#define ZOOM_LOCK_CENTER_VIEW 2
-#define ZOOM_LOCK_OFF 3
-
-#define AUTOZOOM_PIXEL_STEP_FACTOR 48
-
-#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1
-
-/obj/item/gun/energy/beam_rifle
- name = "particle acceleration rifle"
- desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \
- Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \
- changing where you're pointing at while aiming will delay the aiming process depending on how much you changed."
- icon = 'icons/obj/guns/energy.dmi'
- icon_state = "esniper"
- item_state = "esniper"
- fire_sound = 'sound/weapons/beam_sniper.ogg'
- slot_flags = SLOT_BACK
- force = 15
- materials = list()
- recoil = 4
- ammo_x_offset = 3
- ammo_y_offset = 3
- modifystate = FALSE
- weapon_weight = WEAPON_HEAVY
- w_class = WEIGHT_CLASS_BULKY
- ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
- cell_type = /obj/item/stock_parts/cell/beam_rifle
- canMouseDown = TRUE
- pin = null
- var/aiming = FALSE
- var/aiming_time = 12
- var/aiming_time_fire_threshold = 5
- var/aiming_time_left = 12
- var/aiming_time_increase_user_movement = 3
- var/scoped_slow = 1
- var/aiming_time_increase_angle_multiplier = 0.3
- var/last_process = 0
-
- var/lastangle = 0
- var/aiming_lastangle = 0
- var/mob/current_user = null
- var/list/obj/effect/projectile/tracer/current_tracers
-
- var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later.
- var/structure_bleed_coeff = 0.7
- var/wall_pierce_amount = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 1
- var/aoe_structure_damage = 50
- var/aoe_fire_range = 2
- var/aoe_fire_chance = 40
- var/aoe_mob_range = 1
- var/aoe_mob_damage = 30
- var/impact_structure_damage = 60
- var/projectile_damage = 30
- var/projectile_stun = 0
- var/projectile_setting_pierce = TRUE
- var/delay = 65
- var/lastfire = 0
-
- //ZOOMING
- var/zoom_current_view_increase = 0
- var/zoom_target_view_increase = 10
- var/zooming = FALSE
- var/zoom_lock = ZOOM_LOCK_OFF
- var/zooming_angle
- var/current_zoom_x = 0
- var/current_zoom_y = 0
- var/zoom_animating = 0
-
- var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged")
- var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
-
- var/datum/action/item_action/zoom_lock_action/zoom_lock_action
- var/datum/component/mobhook
-
-/obj/item/gun/energy/beam_rifle/debug
- delay = 0
- cell_type = /obj/item/stock_parts/cell/infinite
- aiming_time = 0
- recoil = 0
- pin = /obj/item/device/firing_pin
-
-/obj/item/gun/energy/beam_rifle/equipped(mob/user)
- set_user(user)
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/pickup(mob/user)
- set_user(user)
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/dropped(mob/user)
- set_user()
- . = ..()
-
-/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action)
- if(istype(action, /datum/action/item_action/zoom_lock_action))
- zoom_lock++
- if(zoom_lock > 3)
- zoom_lock = 0
- switch(zoom_lock)
- if(ZOOM_LOCK_AUTOZOOM_FREEMOVE)
- to_chat(owner, "You switch [src]'s zooming processor to free directional.")
- if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK)
- to_chat(owner, "You switch [src]'s zooming processor to locked directional.")
- if(ZOOM_LOCK_CENTER_VIEW)
- to_chat(owner, "You switch [src]'s zooming processor to center mode.")
- if(ZOOM_LOCK_OFF)
- to_chat(owner, "You disable [src]'s zooming system.")
- reset_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null)
- if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW)
- return
- if(zoom_animating && delay_override != 0)
- return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions.
- var/total_time = SSfastprocess.wait
- if(delay_override)
- total_time = delay_override
- zoom_animating = total_time
- animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL)
- zoom_animating = 0
-
-/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
- if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
- return
- current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
- current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
-
-/obj/item/gun/energy/beam_rifle/proc/handle_zooming()
- if(!zooming || !check_user())
- return
- current_user.client.change_view(world.view + zoom_target_view_increase)
- zoom_current_view_increase = zoom_target_view_increase
- set_autozoom_pixel_offsets_immediate(zooming_angle)
- smooth_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/start_zooming()
- if(zoom_lock == ZOOM_LOCK_OFF)
- return
- zooming = TRUE
-
-/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user)
- if(zooming)
- zooming = FALSE
- reset_zooming(user)
-
-/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user)
- if(!user)
- user = current_user
- if(!user || !user.client)
- return FALSE
- zoom_animating = 0
- animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
- zoom_current_view_increase = 0
- user.client.change_view(CONFIG_GET(string/default_view))
- zooming_angle = 0
- current_zoom_x = 0
- current_zoom_y = 0
-
-/obj/item/gun/energy/beam_rifle/update_icon()
- cut_overlays()
- var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1]
- if(cell.charge > primary_ammo.e_cost)
- add_overlay(charged_overlay)
- else
- add_overlay(drained_overlay)
-
-/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
- projectile_setting_pierce = !projectile_setting_pierce
- to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.")
- aiming_beam()
-
-/obj/item/gun/energy/beam_rifle/proc/update_slowdown()
- if(aiming)
- slowdown = scoped_slow
- else
- slowdown = initial(slowdown)
-
-/obj/item/gun/energy/beam_rifle/Initialize()
- . = ..()
- current_tracers = list()
- START_PROCESSING(SSprojectiles, src)
- zoom_lock_action = new(src)
-
-/obj/item/gun/energy/beam_rifle/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
- set_user(null)
- QDEL_LIST(current_tracers)
- QDEL_NULL(mobhook)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/emp_act(severity)
- chambered = null
- recharge_newshot()
-
-/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
- var/diff = abs(aiming_lastangle - lastangle)
- check_user()
- if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update)
- return
- aiming_lastangle = lastangle
- var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
- P.gun = src
- P.wall_pierce_amount = wall_pierce_amount
- P.structure_pierce_amount = structure_piercing
- P.do_pierce = projectile_setting_pierce
- if(aiming_time)
- var/percent = ((100/aiming_time)*aiming_time_left)
- P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0)
- else
- P.color = rgb(0, 255, 0)
- var/turf/curloc = get_turf(src)
- var/turf/targloc = get_turf(current_user.client.mouseObject)
- if(!istype(targloc))
- if(!istype(curloc))
- return
- targloc = get_turf_in_angle(lastangle, curloc, 10)
- P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0)
- P.fire(lastangle)
-
-/obj/item/gun/energy/beam_rifle/process()
- if(!aiming)
- last_process = world.time
- return
- check_user()
- handle_zooming()
- aiming_time_left = max(0, aiming_time_left - (world.time - last_process))
- aiming_beam(TRUE)
- last_process = world.time
-
-/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE)
- if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
- if(automatic_cleanup)
- stop_aiming()
- set_user(null)
- return FALSE
- return TRUE
-
-/obj/item/gun/energy/beam_rifle/proc/process_aim()
- if(istype(current_user) && current_user.client && current_user.client.mouseParams)
- var/angle = mouse_angle_from_client(current_user.client)
- switch(angle)
- if(316 to 360)
- current_user.setDir(NORTH)
- if(0 to 45)
- current_user.setDir(NORTH)
- if(46 to 135)
- current_user.setDir(EAST)
- if(136 to 225)
- current_user.setDir(SOUTH)
- if(226 to 315)
- current_user.setDir(WEST)
- var/difference = abs(lastangle - angle)
- if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes.
- difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle))
- delay_penalty(difference * aiming_time_increase_angle_multiplier)
- lastangle = angle
-
-/obj/item/gun/energy/beam_rifle/proc/on_mob_move()
- check_user()
- if(aiming)
- delay_penalty(aiming_time_increase_user_movement)
- process_aim()
- aiming_beam(TRUE)
-
-/obj/item/gun/energy/beam_rifle/proc/start_aiming()
- aiming_time_left = aiming_time
- aiming = TRUE
- process_aim()
- aiming_beam(TRUE)
- zooming_angle = lastangle
- start_zooming()
-
-/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user)
- set waitfor = FALSE
- aiming_time_left = aiming_time
- aiming = FALSE
- QDEL_LIST(current_tracers)
- stop_zooming(user)
-
-/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user)
- if(user == current_user)
- return
- stop_aiming(current_user)
- QDEL_NULL(mobhook)
- if(istype(current_user))
- LAZYREMOVE(current_user.mousemove_intercept_objects, src)
- current_user = null
- if(istype(user))
- current_user = user
- LAZYADD(current_user.mousemove_intercept_objects, src)
- mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move))
-
-/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
- if(aiming)
- process_aim()
- aiming_beam()
- if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE)
- zooming_angle = lastangle
- set_autozoom_pixel_offsets_immediate(zooming_angle)
- smooth_zooming(2)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob)
- if(istype(mob))
- set_user(mob)
- if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
- return
- if((object in mob.contents) || (object == mob))
- return
- start_aiming()
- return ..()
-
-/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
- if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
- return
- process_aim()
- if(aiming_time_left <= aiming_time_fire_threshold && check_user())
- sync_ammo()
- afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
- stop_aiming()
- QDEL_LIST(current_tracers)
- return ..()
-
-/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
- if(flag) //It's adjacent, is the user, or is on the user's person
- if(target in user.contents) //can't shoot stuff inside us.
- return
- if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
- return
- if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
- return
- if(!passthrough && (aiming_time > aiming_time_fire_threshold))
- return
- if(lastfire > world.time + delay)
- return
- lastfire = world.time
- . = ..()
- stop_aiming()
-
-/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
- for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
- AC.sync_stats()
-
-/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount)
- aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time)
-
-/obj/item/ammo_casing/energy/beam_rifle
- name = "particle acceleration lens"
- desc = "Don't look into barrel!"
- var/wall_pierce_amount = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 1
- var/aoe_structure_damage = 30
- var/aoe_fire_range = 2
- var/aoe_fire_chance = 66
- var/aoe_mob_range = 1
- var/aoe_mob_damage = 20
- var/impact_structure_damage = 50
- var/projectile_damage = 40
- var/projectile_stun = 0
- var/structure_piercing = 2
- var/structure_bleed_coeff = 0.7
- var/do_pierce = TRUE
- var/obj/item/gun/energy/beam_rifle/host
-
-/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats()
- var/obj/item/gun/energy/beam_rifle/BR = loc
- if(!istype(BR))
- stack_trace("Beam rifle syncing error")
- host = BR
- do_pierce = BR.projectile_setting_pierce
- wall_pierce_amount = BR.wall_pierce_amount
- wall_devastate = BR.wall_devastate
- aoe_structure_range = BR.aoe_structure_range
- aoe_structure_damage = BR.aoe_structure_damage
- aoe_fire_range = BR.aoe_fire_range
- aoe_fire_chance = BR.aoe_fire_chance
- aoe_mob_range = BR.aoe_mob_range
- aoe_mob_damage = BR.aoe_mob_damage
- impact_structure_damage = BR.impact_structure_damage
- projectile_damage = BR.projectile_damage
- projectile_stun = BR.projectile_stun
- delay = BR.delay
- structure_piercing = BR.structure_piercing
- structure_bleed_coeff = BR.structure_bleed_coeff
-
-/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- . = ..()
- var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB
- if(!istype(HS_BB))
- return
- HS_BB.impact_direct_damage = projectile_damage
- HS_BB.stun = projectile_stun
- HS_BB.impact_structure_damage = impact_structure_damage
- HS_BB.aoe_mob_damage = aoe_mob_damage
- HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock
- HS_BB.aoe_fire_chance = aoe_fire_chance
- HS_BB.aoe_fire_range = aoe_fire_range
- HS_BB.aoe_structure_damage = aoe_structure_damage
- HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock
- HS_BB.wall_devastate = wall_devastate
- HS_BB.wall_pierce_amount = wall_pierce_amount
- HS_BB.structure_pierce_amount = structure_piercing
- HS_BB.structure_bleed_coeff = structure_bleed_coeff
- HS_BB.do_pierce = do_pierce
- HS_BB.gun = host
-
-/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
- var/turf/curloc = get_turf(user)
- if(!istype(curloc) || !BB)
- return FALSE
- var/obj/item/gun/energy/beam_rifle/gun = loc
- if(!targloc && gun)
- targloc = get_turf_in_angle(gun.lastangle, curloc, 10)
- else if(!targloc)
- return FALSE
- var/firing_dir
- if(BB.firer)
- firing_dir = BB.firer.dir
- if(!BB.suppressed && firing_effect_type)
- new firing_effect_type(get_turf(src), firing_dir)
- BB.preparePixelProjectile(target, user, params, spread)
- BB.fire(gun? gun.lastangle : null, null)
- BB = null
- return TRUE
-
-/obj/item/ammo_casing/energy/beam_rifle/hitscan
- projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
- select_name = "beam"
- e_cost = 5000
- fire_sound = 'sound/weapons/beam_sniper.ogg'
-
-/obj/item/projectile/beam/beam_rifle
- name = "particle beam"
- icon = ""
- hitsound = 'sound/effects/explosion3.ogg'
- damage = 0 //Handled manually.
- damage_type = BURN
- flag = "energy"
- range = 150
- jitter = 10
- var/obj/item/gun/energy/beam_rifle/gun
- var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing.
- var/structure_bleed_coeff = 0
- var/structure_pierce = 0
- var/do_pierce = TRUE
- var/wall_pierce_amount = 0
- var/wall_pierce = 0
- var/wall_devastate = 0
- var/aoe_structure_range = 0
- var/aoe_structure_damage = 0
- var/aoe_fire_range = 0
- var/aoe_fire_chance = 0
- var/aoe_mob_range = 0
- var/aoe_mob_damage = 0
- var/impact_structure_damage = 0
- var/impact_direct_damage = 0
- var/turf/cached
- var/list/pierced = list()
-
-/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter)
- set waitfor = FALSE
- if(!epicenter)
- return
- new /obj/effect/temp_visual/explosion/fast(epicenter)
- for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage
- L.adjustFireLoss(aoe_mob_damage)
- to_chat(L, "\The [src] sears you!")
- for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire
- if(prob(aoe_fire_chance))
- new /obj/effect/hotspot(T)
- for(var/obj/O in range(aoe_structure_range, epicenter))
- if(!isitem(O))
- if(O.level == 1) //Please don't break underfloor items!
- continue
- O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE)
-
-/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target)
- if(!do_pierce)
- return FALSE
- if(pierced[target]) //we already pierced them go away
- return TRUE
- if(isclosedturf(target))
- if(wall_pierce++ < wall_pierce_amount)
- if(prob(wall_devastate))
- if(iswallturf(target))
- var/turf/closed/wall/W = target
- W.dismantle_wall(TRUE, TRUE)
- else
- target.ex_act(EXPLODE_HEAVY)
- return TRUE
- if(ismovableatom(target))
- var/atom/movable/AM = target
- if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
- if(structure_pierce < structure_pierce_amount)
- if(isobj(AM))
- var/obj/O = AM
- O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE)
- pierced[AM] = TRUE
- structure_pierce++
- return TRUE
- return FALSE
-
-/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target)
- if(istype(target, /obj/machinery/door))
- return 0.4
- if(istype(target, /obj/structure/window))
- return 0.5
- return 1
-
-/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target)
- if(isobj(target))
- var/obj/O = target
- O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE)
- if(isliving(target))
- var/mob/living/L = target
- L.adjustFireLoss(impact_direct_damage)
- L.emote("scream")
-
-/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target)
- set waitfor = FALSE
- if(!cached && !QDELETED(target))
- cached = get_turf(target)
- if(nodamage)
- return FALSE
- playsound(cached, 'sound/effects/explosion3.ogg', 100, 1)
- AOE(cached)
- if(!QDELETED(target))
- handle_impact(target)
-
-/obj/item/projectile/beam/beam_rifle/Collide(atom/target)
- if(check_pierce(target))
- permutated += target
- trajectory_ignore_forcemove = TRUE
- forceMove(target)
- trajectory_ignore_forcemove = FALSE
- return FALSE
- if(!QDELETED(target))
- cached = get_turf(target)
- . = ..()
-
-/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE)
- if(!QDELETED(target))
- cached = get_turf(target)
- handle_hit(target)
- . = ..()
-
-/obj/item/projectile/beam/beam_rifle/hitscan
- icon_state = ""
- hitscan = TRUE
- tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle
- var/constant_tracer = FALSE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander)
- set waitfor = FALSE
- if(isnull(highlander))
- highlander = constant_tracer
- if(highlander && istype(gun))
- QDEL_LIST(gun.current_tracers)
- for(var/datum/point/p in beam_segments)
- gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0)
- else
- for(var/datum/point/p in beam_segments)
- generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration)
- if(cleanup)
- QDEL_LIST(beam_segments)
- beam_segments = null
- QDEL_NULL(beam_index)
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
- tracer_type = /obj/effect/projectile/tracer/tracer/aiming
- name = "aiming beam"
- hitsound = null
- hitsound_wall = null
- nodamage = TRUE
- damage = 0
- constant_tracer = TRUE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
- qdel(src)
- return FALSE
-
-/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
- qdel(src)
- return FALSE
+
+#define ZOOM_LOCK_AUTOZOOM_FREEMOVE 0
+#define ZOOM_LOCK_AUTOZOOM_ANGLELOCK 1
+#define ZOOM_LOCK_CENTER_VIEW 2
+#define ZOOM_LOCK_OFF 3
+
+#define AUTOZOOM_PIXEL_STEP_FACTOR 48
+
+#define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1
+
+/obj/item/gun/energy/beam_rifle
+ name = "particle acceleration rifle"
+ desc = "An energy-based anti material marksman rifle that uses highly charged particle beams moving at extreme velocities to decimate whatever is unfortunate enough to be targetted by one. \
+ Hold down left click while scoped to aim, when weapon is fully aimed (Tracer goes from red to green as it charges), release to fire. Moving while aiming or \
+ changing where you're pointing at while aiming will delay the aiming process depending on how much you changed."
+ icon = 'icons/obj/guns/energy.dmi'
+ icon_state = "esniper"
+ item_state = "esniper"
+ fire_sound = 'sound/weapons/beam_sniper.ogg'
+ slot_flags = SLOT_BACK
+ force = 15
+ materials = list()
+ recoil = 4
+ ammo_x_offset = 3
+ ammo_y_offset = 3
+ modifystate = FALSE
+ weapon_weight = WEAPON_HEAVY
+ w_class = WEIGHT_CLASS_BULKY
+ ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan)
+ cell_type = /obj/item/stock_parts/cell/beam_rifle
+ canMouseDown = TRUE
+ pin = null
+ var/aiming = FALSE
+ var/aiming_time = 12
+ var/aiming_time_fire_threshold = 5
+ var/aiming_time_left = 12
+ var/aiming_time_increase_user_movement = 3
+ var/scoped_slow = 1
+ var/aiming_time_increase_angle_multiplier = 0.3
+ var/last_process = 0
+
+ var/lastangle = 0
+ var/aiming_lastangle = 0
+ var/mob/current_user = null
+ var/list/obj/effect/projectile/tracer/current_tracers
+
+ var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later.
+ var/structure_bleed_coeff = 0.7
+ var/wall_pierce_amount = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 1
+ var/aoe_structure_damage = 50
+ var/aoe_fire_range = 2
+ var/aoe_fire_chance = 40
+ var/aoe_mob_range = 1
+ var/aoe_mob_damage = 30
+ var/impact_structure_damage = 60
+ var/projectile_damage = 30
+ var/projectile_stun = 0
+ var/projectile_setting_pierce = TRUE
+ var/delay = 65
+ var/lastfire = 0
+
+ //ZOOMING
+ var/zoom_current_view_increase = 0
+ var/zoom_target_view_increase = 10
+ var/zooming = FALSE
+ var/zoom_lock = ZOOM_LOCK_OFF
+ var/zooming_angle
+ var/current_zoom_x = 0
+ var/current_zoom_y = 0
+ var/zoom_animating = 0
+
+ var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged")
+ var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
+
+ var/datum/action/item_action/zoom_lock_action/zoom_lock_action
+ var/datum/component/mobhook
+
+/obj/item/gun/energy/beam_rifle/debug
+ delay = 0
+ cell_type = /obj/item/stock_parts/cell/infinite
+ aiming_time = 0
+ recoil = 0
+ pin = /obj/item/device/firing_pin
+
+/obj/item/gun/energy/beam_rifle/equipped(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/pickup(mob/user)
+ set_user(user)
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/dropped(mob/user)
+ set_user()
+ . = ..()
+
+/obj/item/gun/energy/beam_rifle/ui_action_click(owner, action)
+ if(istype(action, /datum/action/item_action/zoom_lock_action))
+ zoom_lock++
+ if(zoom_lock > 3)
+ zoom_lock = 0
+ switch(zoom_lock)
+ if(ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ to_chat(owner, "You switch [src]'s zooming processor to free directional.")
+ if(ZOOM_LOCK_AUTOZOOM_ANGLELOCK)
+ to_chat(owner, "You switch [src]'s zooming processor to locked directional.")
+ if(ZOOM_LOCK_CENTER_VIEW)
+ to_chat(owner, "You switch [src]'s zooming processor to center mode.")
+ if(ZOOM_LOCK_OFF)
+ to_chat(owner, "You disable [src]'s zooming system.")
+ reset_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/smooth_zooming(delay_override = null)
+ if(!check_user() || !zooming || zoom_lock == ZOOM_LOCK_OFF || zoom_lock == ZOOM_LOCK_CENTER_VIEW)
+ return
+ if(zoom_animating && delay_override != 0)
+ return smooth_zooming(zoom_animating + delay_override) //Automatically compensate for ongoing zooming actions.
+ var/total_time = SSfastprocess.wait
+ if(delay_override)
+ total_time = delay_override
+ zoom_animating = total_time
+ animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL)
+ zoom_animating = 0
+
+/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
+ if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
+ return
+ current_zoom_x = sin(current_angle) + sin(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+ current_zoom_y = cos(current_angle) + cos(current_angle) * AUTOZOOM_PIXEL_STEP_FACTOR * zoom_current_view_increase
+
+/obj/item/gun/energy/beam_rifle/proc/handle_zooming()
+ if(!zooming || !check_user())
+ return
+ current_user.client.change_view(world.view + zoom_target_view_increase)
+ zoom_current_view_increase = zoom_target_view_increase
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/start_zooming()
+ if(zoom_lock == ZOOM_LOCK_OFF)
+ return
+ zooming = TRUE
+
+/obj/item/gun/energy/beam_rifle/proc/stop_zooming(mob/user)
+ if(zooming)
+ zooming = FALSE
+ reset_zooming(user)
+
+/obj/item/gun/energy/beam_rifle/proc/reset_zooming(mob/user)
+ if(!user)
+ user = current_user
+ if(!user || !user.client)
+ return FALSE
+ zoom_animating = 0
+ animate(user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
+ zoom_current_view_increase = 0
+ user.client.change_view(CONFIG_GET(string/default_view))
+ zooming_angle = 0
+ current_zoom_x = 0
+ current_zoom_y = 0
+
+/obj/item/gun/energy/beam_rifle/update_icon()
+ cut_overlays()
+ var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1]
+ if(cell.charge > primary_ammo.e_cost)
+ add_overlay(charged_overlay)
+ else
+ add_overlay(drained_overlay)
+
+/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
+ projectile_setting_pierce = !projectile_setting_pierce
+ to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.")
+ aiming_beam()
+
+/obj/item/gun/energy/beam_rifle/proc/update_slowdown()
+ if(aiming)
+ slowdown = scoped_slow
+ else
+ slowdown = initial(slowdown)
+
+/obj/item/gun/energy/beam_rifle/Initialize()
+ . = ..()
+ current_tracers = list()
+ START_PROCESSING(SSprojectiles, src)
+ zoom_lock_action = new(src)
+
+/obj/item/gun/energy/beam_rifle/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ set_user(null)
+ QDEL_LIST(current_tracers)
+ QDEL_NULL(mobhook)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/emp_act(severity)
+ chambered = null
+ recharge_newshot()
+
+/obj/item/gun/energy/beam_rifle/proc/aiming_beam(force_update = FALSE)
+ var/diff = abs(aiming_lastangle - lastangle)
+ check_user()
+ if(diff < AIMING_BEAM_ANGLE_CHANGE_THRESHOLD && !force_update)
+ return
+ aiming_lastangle = lastangle
+ var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
+ P.gun = src
+ P.wall_pierce_amount = wall_pierce_amount
+ P.structure_pierce_amount = structure_piercing
+ P.do_pierce = projectile_setting_pierce
+ if(aiming_time)
+ var/percent = ((100/aiming_time)*aiming_time_left)
+ P.color = rgb(255 * percent,255 * ((100 - percent) / 100),0)
+ else
+ P.color = rgb(0, 255, 0)
+ var/turf/curloc = get_turf(src)
+ var/turf/targloc = get_turf(current_user.client.mouseObject)
+ if(!istype(targloc))
+ if(!istype(curloc))
+ return
+ targloc = get_turf_in_angle(lastangle, curloc, 10)
+ P.preparePixelProjectile(targloc, current_user, current_user.client.mouseParams, 0)
+ P.fire(lastangle)
+
+/obj/item/gun/energy/beam_rifle/process()
+ if(!aiming)
+ last_process = world.time
+ return
+ check_user()
+ handle_zooming()
+ aiming_time_left = max(0, aiming_time_left - (world.time - last_process))
+ aiming_beam(TRUE)
+ last_process = world.time
+
+/obj/item/gun/energy/beam_rifle/proc/check_user(automatic_cleanup = TRUE)
+ if(!istype(current_user) || !isturf(current_user.loc) || !(src in current_user.held_items) || current_user.incapacitated()) //Doesn't work if you're not holding it!
+ if(automatic_cleanup)
+ stop_aiming()
+ set_user(null)
+ return FALSE
+ return TRUE
+
+/obj/item/gun/energy/beam_rifle/proc/process_aim()
+ if(istype(current_user) && current_user.client && current_user.client.mouseParams)
+ var/angle = mouse_angle_from_client(current_user.client)
+ switch(angle)
+ if(316 to 360)
+ current_user.setDir(NORTH)
+ if(0 to 45)
+ current_user.setDir(NORTH)
+ if(46 to 135)
+ current_user.setDir(EAST)
+ if(136 to 225)
+ current_user.setDir(SOUTH)
+ if(226 to 315)
+ current_user.setDir(WEST)
+ var/difference = abs(lastangle - angle)
+ if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes.
+ difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle))
+ delay_penalty(difference * aiming_time_increase_angle_multiplier)
+ lastangle = angle
+
+/obj/item/gun/energy/beam_rifle/proc/on_mob_move()
+ check_user()
+ if(aiming)
+ delay_penalty(aiming_time_increase_user_movement)
+ process_aim()
+ aiming_beam(TRUE)
+
+/obj/item/gun/energy/beam_rifle/proc/start_aiming()
+ aiming_time_left = aiming_time
+ aiming = TRUE
+ process_aim()
+ aiming_beam(TRUE)
+ zooming_angle = lastangle
+ start_zooming()
+
+/obj/item/gun/energy/beam_rifle/proc/stop_aiming(mob/user)
+ set waitfor = FALSE
+ aiming_time_left = aiming_time
+ aiming = FALSE
+ QDEL_LIST(current_tracers)
+ stop_zooming(user)
+
+/obj/item/gun/energy/beam_rifle/proc/set_user(mob/user)
+ if(user == current_user)
+ return
+ stop_aiming(current_user)
+ QDEL_NULL(mobhook)
+ if(istype(current_user))
+ LAZYREMOVE(current_user.mousemove_intercept_objects, src)
+ current_user = null
+ if(istype(user))
+ current_user = user
+ LAZYADD(current_user.mousemove_intercept_objects, src)
+ mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move))
+
+/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
+ if(aiming)
+ process_aim()
+ aiming_beam()
+ if(zoom_lock == ZOOM_LOCK_AUTOZOOM_FREEMOVE)
+ zooming_angle = lastangle
+ set_autozoom_pixel_offsets_immediate(zooming_angle)
+ smooth_zooming(2)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob)
+ if(istype(mob))
+ set_user(mob)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
+ if((object in mob.contents) || (object == mob))
+ return
+ start_aiming()
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
+ if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher))
+ return
+ process_aim()
+ if(aiming_time_left <= aiming_time_fire_threshold && check_user())
+ sync_ammo()
+ afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
+ stop_aiming()
+ QDEL_LIST(current_tracers)
+ return ..()
+
+/obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
+ if(flag) //It's adjacent, is the user, or is on the user's person
+ if(target in user.contents) //can't shoot stuff inside us.
+ return
+ if(!ismob(target) || user.a_intent == INTENT_HARM) //melee attack
+ return
+ if(target == user && user.zone_selected != "mouth") //so we can't shoot ourselves (unless mouth selected)
+ return
+ if(!passthrough && (aiming_time > aiming_time_fire_threshold))
+ return
+ if(lastfire > world.time + delay)
+ return
+ lastfire = world.time
+ . = ..()
+ stop_aiming()
+
+/obj/item/gun/energy/beam_rifle/proc/sync_ammo()
+ for(var/obj/item/ammo_casing/energy/beam_rifle/AC in contents)
+ AC.sync_stats()
+
+/obj/item/gun/energy/beam_rifle/proc/delay_penalty(amount)
+ aiming_time_left = CLAMP(aiming_time_left + amount, 0, aiming_time)
+
+/obj/item/ammo_casing/energy/beam_rifle
+ name = "particle acceleration lens"
+ desc = "Don't look into barrel!"
+ var/wall_pierce_amount = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 1
+ var/aoe_structure_damage = 30
+ var/aoe_fire_range = 2
+ var/aoe_fire_chance = 66
+ var/aoe_mob_range = 1
+ var/aoe_mob_damage = 20
+ var/impact_structure_damage = 50
+ var/projectile_damage = 40
+ var/projectile_stun = 0
+ var/structure_piercing = 2
+ var/structure_bleed_coeff = 0.7
+ var/do_pierce = TRUE
+ var/obj/item/gun/energy/beam_rifle/host
+
+/obj/item/ammo_casing/energy/beam_rifle/proc/sync_stats()
+ var/obj/item/gun/energy/beam_rifle/BR = loc
+ if(!istype(BR))
+ stack_trace("Beam rifle syncing error")
+ host = BR
+ do_pierce = BR.projectile_setting_pierce
+ wall_pierce_amount = BR.wall_pierce_amount
+ wall_devastate = BR.wall_devastate
+ aoe_structure_range = BR.aoe_structure_range
+ aoe_structure_damage = BR.aoe_structure_damage
+ aoe_fire_range = BR.aoe_fire_range
+ aoe_fire_chance = BR.aoe_fire_chance
+ aoe_mob_range = BR.aoe_mob_range
+ aoe_mob_damage = BR.aoe_mob_damage
+ impact_structure_damage = BR.impact_structure_damage
+ projectile_damage = BR.projectile_damage
+ projectile_stun = BR.projectile_stun
+ delay = BR.delay
+ structure_piercing = BR.structure_piercing
+ structure_bleed_coeff = BR.structure_bleed_coeff
+
+/obj/item/ammo_casing/energy/beam_rifle/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ . = ..()
+ var/obj/item/projectile/beam/beam_rifle/hitscan/HS_BB = BB
+ if(!istype(HS_BB))
+ return
+ HS_BB.impact_direct_damage = projectile_damage
+ HS_BB.stun = projectile_stun
+ HS_BB.impact_structure_damage = impact_structure_damage
+ HS_BB.aoe_mob_damage = aoe_mob_damage
+ HS_BB.aoe_mob_range = CLAMP(aoe_mob_range, 0, 15) //Badmin safety lock
+ HS_BB.aoe_fire_chance = aoe_fire_chance
+ HS_BB.aoe_fire_range = aoe_fire_range
+ HS_BB.aoe_structure_damage = aoe_structure_damage
+ HS_BB.aoe_structure_range = CLAMP(aoe_structure_range, 0, 15) //Badmin safety lock
+ HS_BB.wall_devastate = wall_devastate
+ HS_BB.wall_pierce_amount = wall_pierce_amount
+ HS_BB.structure_pierce_amount = structure_piercing
+ HS_BB.structure_bleed_coeff = structure_bleed_coeff
+ HS_BB.do_pierce = do_pierce
+ HS_BB.gun = host
+
+/obj/item/ammo_casing/energy/beam_rifle/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
+ var/turf/curloc = get_turf(user)
+ if(!istype(curloc) || !BB)
+ return FALSE
+ var/obj/item/gun/energy/beam_rifle/gun = loc
+ if(!targloc && gun)
+ targloc = get_turf_in_angle(gun.lastangle, curloc, 10)
+ else if(!targloc)
+ return FALSE
+ var/firing_dir
+ if(BB.firer)
+ firing_dir = BB.firer.dir
+ if(!BB.suppressed && firing_effect_type)
+ new firing_effect_type(get_turf(src), firing_dir)
+ BB.preparePixelProjectile(target, user, params, spread)
+ BB.fire(gun? gun.lastangle : null, null)
+ BB = null
+ return TRUE
+
+/obj/item/ammo_casing/energy/beam_rifle/hitscan
+ projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
+ select_name = "beam"
+ e_cost = 5000
+ fire_sound = 'sound/weapons/beam_sniper.ogg'
+
+/obj/item/projectile/beam/beam_rifle
+ name = "particle beam"
+ icon = ""
+ hitsound = 'sound/effects/explosion3.ogg'
+ damage = 0 //Handled manually.
+ damage_type = BURN
+ flag = "energy"
+ range = 150
+ jitter = 10
+ var/obj/item/gun/energy/beam_rifle/gun
+ var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing.
+ var/structure_bleed_coeff = 0
+ var/structure_pierce = 0
+ var/do_pierce = TRUE
+ var/wall_pierce_amount = 0
+ var/wall_pierce = 0
+ var/wall_devastate = 0
+ var/aoe_structure_range = 0
+ var/aoe_structure_damage = 0
+ var/aoe_fire_range = 0
+ var/aoe_fire_chance = 0
+ var/aoe_mob_range = 0
+ var/aoe_mob_damage = 0
+ var/impact_structure_damage = 0
+ var/impact_direct_damage = 0
+ var/turf/cached
+ var/list/pierced = list()
+
+/obj/item/projectile/beam/beam_rifle/proc/AOE(turf/epicenter)
+ set waitfor = FALSE
+ if(!epicenter)
+ return
+ new /obj/effect/temp_visual/explosion/fast(epicenter)
+ for(var/mob/living/L in range(aoe_mob_range, epicenter)) //handle aoe mob damage
+ L.adjustFireLoss(aoe_mob_damage)
+ to_chat(L, "\The [src] sears you!")
+ for(var/turf/T in range(aoe_fire_range, epicenter)) //handle aoe fire
+ if(prob(aoe_fire_chance))
+ new /obj/effect/hotspot(T)
+ for(var/obj/O in range(aoe_structure_range, epicenter))
+ if(!isitem(O))
+ if(O.level == 1) //Please don't break underfloor items!
+ continue
+ O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, "laser", FALSE)
+
+/obj/item/projectile/beam/beam_rifle/proc/check_pierce(atom/target)
+ if(!do_pierce)
+ return FALSE
+ if(pierced[target]) //we already pierced them go away
+ return TRUE
+ if(isclosedturf(target))
+ if(wall_pierce++ < wall_pierce_amount)
+ if(prob(wall_devastate))
+ if(iswallturf(target))
+ var/turf/closed/wall/W = target
+ W.dismantle_wall(TRUE, TRUE)
+ else
+ target.ex_act(EXPLODE_HEAVY)
+ return TRUE
+ if(ismovableatom(target))
+ var/atom/movable/AM = target
+ if(AM.density && !AM.CanPass(src, get_turf(target)) && !ismob(AM))
+ if(structure_pierce < structure_pierce_amount)
+ if(isobj(AM))
+ var/obj/O = AM
+ O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE)
+ pierced[AM] = TRUE
+ structure_pierce++
+ return TRUE
+ return FALSE
+
+/obj/item/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target)
+ if(istype(target, /obj/machinery/door))
+ return 0.4
+ if(istype(target, /obj/structure/window))
+ return 0.5
+ return 1
+
+/obj/item/projectile/beam/beam_rifle/proc/handle_impact(atom/target)
+ if(isobj(target))
+ var/obj/O = target
+ O.take_damage(impact_structure_damage * get_damage_coeff(target), BURN, "laser", FALSE)
+ if(isliving(target))
+ var/mob/living/L = target
+ L.adjustFireLoss(impact_direct_damage)
+ L.emote("scream")
+
+/obj/item/projectile/beam/beam_rifle/proc/handle_hit(atom/target)
+ set waitfor = FALSE
+ if(!cached && !QDELETED(target))
+ cached = get_turf(target)
+ if(nodamage)
+ return FALSE
+ playsound(cached, 'sound/effects/explosion3.ogg', 100, 1)
+ AOE(cached)
+ if(!QDELETED(target))
+ handle_impact(target)
+
+/obj/item/projectile/beam/beam_rifle/Collide(atom/target)
+ if(check_pierce(target))
+ permutated += target
+ trajectory_ignore_forcemove = TRUE
+ forceMove(target)
+ trajectory_ignore_forcemove = FALSE
+ return FALSE
+ if(!QDELETED(target))
+ cached = get_turf(target)
+ . = ..()
+
+/obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE)
+ if(!QDELETED(target))
+ cached = get_turf(target)
+ handle_hit(target)
+ . = ..()
+
+/obj/item/projectile/beam/beam_rifle/hitscan
+ icon_state = ""
+ hitscan = TRUE
+ tracer_type = /obj/effect/projectile/tracer/tracer/beam_rifle
+ var/constant_tracer = FALSE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE, highlander)
+ set waitfor = FALSE
+ if(isnull(highlander))
+ highlander = constant_tracer
+ if(highlander && istype(gun))
+ QDEL_LIST(gun.current_tracers)
+ for(var/datum/point/p in beam_segments)
+ gun.current_tracers += generate_tracer_between_points(p, beam_segments[p], tracer_type, color, 0)
+ else
+ for(var/datum/point/p in beam_segments)
+ generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration)
+ if(cleanup)
+ QDEL_LIST(beam_segments)
+ beam_segments = null
+ QDEL_NULL(beam_index)
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
+ tracer_type = /obj/effect/projectile/tracer/tracer/aiming
+ name = "aiming beam"
+ hitsound = null
+ hitsound_wall = null
+ nodamage = TRUE
+ damage = 0
+ constant_tracer = TRUE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit(atom/target)
+ qdel(src)
+ return FALSE
+
+/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
+ qdel(src)
+ return FALSE
diff --git a/code/modules/projectiles/guns/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm
similarity index 95%
rename from code/modules/projectiles/guns/chem_gun.dm
rename to code/modules/projectiles/guns/misc/chem_gun.dm
index b928abafef..17e3bd1876 100644
--- a/code/modules/projectiles/guns/chem_gun.dm
+++ b/code/modules/projectiles/guns/misc/chem_gun.dm
@@ -1,47 +1,47 @@
-//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes
-//this is meant to hold reagents/obj/item/gun/syringe
-/obj/item/gun/chem
- name = "reagent gun"
- desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents."
- icon_state = "chemgun"
- item_state = "chemgun"
- w_class = WEIGHT_CLASS_NORMAL
- throw_speed = 3
- throw_range = 7
- force = 4
- materials = list(MAT_METAL=2000)
- clumsy_check = FALSE
- fire_sound = 'sound/items/syringeproj.ogg'
- container_type = OPENCONTAINER
- var/time_per_syringe = 250
- var/syringes_left = 4
- var/max_syringes = 4
- var/last_synth = 0
-
-/obj/item/gun/chem/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/chemgun(src)
- START_PROCESSING(SSobj, src)
- create_reagents(100)
-
-/obj/item/gun/chem/Destroy()
- . = ..()
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/gun/chem/can_shoot()
- return syringes_left
-
-/obj/item/gun/chem/process_chamber()
- if(chambered && !chambered.BB && syringes_left)
- chambered.newshot()
-
-/obj/item/gun/chem/process()
- if(syringes_left >= max_syringes)
- return
- if(world.time < last_synth+time_per_syringe)
- return
- to_chat(loc, "You hear a click as [src] synthesizes a new dart.")
- syringes_left++
- if(chambered && !chambered.BB)
- chambered.newshot()
+//his isn't a subtype of the syringe gun because the syringegun subtype is made to hold syringes
+//this is meant to hold reagents/obj/item/gun/syringe
+/obj/item/gun/chem
+ name = "reagent gun"
+ desc = "A Nanotrasen syringe gun, modified to automatically synthesise chemical darts, and instead hold reagents."
+ icon_state = "chemgun"
+ item_state = "chemgun"
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 3
+ throw_range = 7
+ force = 4
+ materials = list(MAT_METAL=2000)
+ clumsy_check = FALSE
+ fire_sound = 'sound/items/syringeproj.ogg'
+ container_type = OPENCONTAINER
+ var/time_per_syringe = 250
+ var/syringes_left = 4
+ var/max_syringes = 4
+ var/last_synth = 0
+
+/obj/item/gun/chem/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/chemgun(src)
+ START_PROCESSING(SSobj, src)
+ create_reagents(100)
+
+/obj/item/gun/chem/Destroy()
+ . = ..()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/gun/chem/can_shoot()
+ return syringes_left
+
+/obj/item/gun/chem/process_chamber()
+ if(chambered && !chambered.BB && syringes_left)
+ chambered.newshot()
+
+/obj/item/gun/chem/process()
+ if(syringes_left >= max_syringes)
+ return
+ if(world.time < last_synth+time_per_syringe)
+ return
+ to_chat(loc, "You hear a click as [src] synthesizes a new dart.")
+ syringes_left++
+ if(chambered && !chambered.BB)
+ chambered.newshot()
last_synth = world.time
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm
similarity index 97%
rename from code/modules/projectiles/guns/grenade_launcher.dm
rename to code/modules/projectiles/guns/misc/grenade_launcher.dm
index 771c0091e3..e57d77bdf9 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm
@@ -1,52 +1,52 @@
-/obj/item/gun/grenadelauncher
- name = "grenade launcher"
- desc = "A terrible, terrible thing. It's really awful!"
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "riotgun"
- item_state = "riotgun"
- w_class = WEIGHT_CLASS_BULKY
- throw_speed = 2
- throw_range = 7
- force = 5
- var/list/grenades = new/list()
- var/max_grenades = 3
- materials = list(MAT_METAL=2000)
-
-/obj/item/gun/grenadelauncher/examine(mob/user)
- ..()
- to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.")
-
-/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params)
-
- if((istype(I, /obj/item/grenade)))
- if(grenades.len < max_grenades)
- if(!user.transferItemToLoc(I, src))
- return
- grenades += I
- to_chat(user, "You put the grenade in the grenade launcher.")
- to_chat(user, "[grenades.len] / [max_grenades] Grenades.")
- else
- to_chat(usr, "The grenade launcher cannot hold more grenades.")
-
-/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
- if(target == user)
- return
-
- if(grenades.len)
- fire_grenade(target,user)
- else
- to_chat(user, "The grenade launcher is empty.")
-
-/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
- user.visible_message("[user] fired a grenade!", \
- "You fire the grenade launcher!")
- var/obj/item/grenade/F = grenades[1] //Now with less copypasta!
- grenades -= F
- F.forceMove(user.loc)
- F.throw_at(target, 30, 2, user)
- message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
- log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
- F.active = 1
- F.icon_state = initial(F.icon_state) + "_active"
- playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15)
+/obj/item/gun/grenadelauncher
+ name = "grenade launcher"
+ desc = "A terrible, terrible thing. It's really awful!"
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "riotgun"
+ item_state = "riotgun"
+ w_class = WEIGHT_CLASS_BULKY
+ throw_speed = 2
+ throw_range = 7
+ force = 5
+ var/list/grenades = new/list()
+ var/max_grenades = 3
+ materials = list(MAT_METAL=2000)
+
+/obj/item/gun/grenadelauncher/examine(mob/user)
+ ..()
+ to_chat(user, "[grenades.len] / [max_grenades] grenades loaded.")
+
+/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params)
+
+ if((istype(I, /obj/item/grenade)))
+ if(grenades.len < max_grenades)
+ if(!user.transferItemToLoc(I, src))
+ return
+ grenades += I
+ to_chat(user, "You put the grenade in the grenade launcher.")
+ to_chat(user, "[grenades.len] / [max_grenades] Grenades.")
+ else
+ to_chat(usr, "The grenade launcher cannot hold more grenades.")
+
+/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
+ if(target == user)
+ return
+
+ if(grenades.len)
+ fire_grenade(target,user)
+ else
+ to_chat(user, "The grenade launcher is empty.")
+
+/obj/item/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
+ user.visible_message("[user] fired a grenade!", \
+ "You fire the grenade launcher!")
+ var/obj/item/grenade/F = grenades[1] //Now with less copypasta!
+ grenades -= F
+ F.forceMove(user.loc)
+ F.throw_at(target, 30, 2, user)
+ message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
+ log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
+ F.active = 1
+ F.icon_state = initial(F.icon_state) + "_active"
+ playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
+ addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15)
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm
similarity index 96%
rename from code/modules/projectiles/guns/medbeam.dm
rename to code/modules/projectiles/guns/misc/medbeam.dm
index 79cafe0dd6..8fb07c32e3 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/misc/medbeam.dm
@@ -1,133 +1,133 @@
-/obj/item/gun/medbeam
- name = "Medical Beamgun"
- desc = "Don't cross the streams!"
- icon = 'icons/obj/chronos.dmi'
- icon_state = "chronogun"
- item_state = "chronogun"
- w_class = WEIGHT_CLASS_NORMAL
-
- var/mob/living/current_target
- var/last_check = 0
- var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
- var/max_range = 8
- var/active = 0
- var/datum/beam/current_beam = null
- var/mounted = 0 //Denotes if this is a handheld or mounted version
-
- weapon_weight = WEAPON_MEDIUM
-
-/obj/item/gun/medbeam/Initialize()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/gun/medbeam/Destroy(mob/user)
- STOP_PROCESSING(SSobj, src)
- LoseTarget()
- return ..()
-
-/obj/item/gun/medbeam/dropped(mob/user)
- ..()
- LoseTarget()
-
-/obj/item/gun/medbeam/equipped(mob/user)
- ..()
- LoseTarget()
-
-/obj/item/gun/medbeam/proc/LoseTarget()
- if(active)
- qdel(current_beam)
- current_beam = null
- active = 0
- on_beam_release(current_target)
- current_target = null
-
-/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
- if(isliving(user))
- add_fingerprint(user)
-
- if(current_target)
- LoseTarget()
- if(!isliving(target))
- return
-
- current_target = target
- active = TRUE
- current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical)
- INVOKE_ASYNC(current_beam, /datum/beam.proc/Start)
-
- SSblackbox.record_feedback("tally", "gun_fired", 1, type)
-
-/obj/item/gun/medbeam/process()
-
- var/source = loc
- if(!mounted && !isliving(source))
- LoseTarget()
- return
-
- if(!current_target)
- LoseTarget()
- return
-
- if(world.time <= last_check+check_delay)
- return
-
- last_check = world.time
-
- if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
- LoseTarget()
- if(isliving(source))
- to_chat(source, "You lose control of the beam!")
- return
-
- if(current_target)
- on_beam_tick(current_target)
-
-/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target)
- var/turf/user_turf = user.loc
- if(mounted)
- user_turf = get_turf(user)
- else if(!istype(user_turf))
- return 0
- var/obj/dummy = new(user_turf)
- dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
- for(var/turf/turf in getline(user_turf,target))
- if(mounted && turf == user_turf)
- continue //Mechs are dense and thus fail the check
- if(turf.density)
- qdel(dummy)
- return 0
- for(var/atom/movable/AM in turf)
- if(!AM.CanPass(dummy,turf,1))
- qdel(dummy)
- return 0
- for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
- if(B.owner.origin != current_beam.origin)
- explosion(B.loc,0,3,5,8)
- qdel(dummy)
- return 0
- qdel(dummy)
- return 1
-
-/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target)
- return
-
-/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
- if(target.health != target.maxHealth)
- new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
- target.adjustBruteLoss(-4)
- target.adjustFireLoss(-4)
- return
-
-/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target)
- return
-
-/obj/effect/ebeam/medical
- name = "medical beam"
-
-//////////////////////////////Mech Version///////////////////////////////
-/obj/item/gun/medbeam/mech
- mounted = 1
-
-/obj/item/gun/medbeam/mech/Initialize()
- . = ..()
- STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
+/obj/item/gun/medbeam
+ name = "Medical Beamgun"
+ desc = "Don't cross the streams!"
+ icon = 'icons/obj/chronos.dmi'
+ icon_state = "chronogun"
+ item_state = "chronogun"
+ w_class = WEIGHT_CLASS_NORMAL
+
+ var/mob/living/current_target
+ var/last_check = 0
+ var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
+ var/max_range = 8
+ var/active = 0
+ var/datum/beam/current_beam = null
+ var/mounted = 0 //Denotes if this is a handheld or mounted version
+
+ weapon_weight = WEAPON_MEDIUM
+
+/obj/item/gun/medbeam/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/gun/medbeam/Destroy(mob/user)
+ STOP_PROCESSING(SSobj, src)
+ LoseTarget()
+ return ..()
+
+/obj/item/gun/medbeam/dropped(mob/user)
+ ..()
+ LoseTarget()
+
+/obj/item/gun/medbeam/equipped(mob/user)
+ ..()
+ LoseTarget()
+
+/obj/item/gun/medbeam/proc/LoseTarget()
+ if(active)
+ qdel(current_beam)
+ current_beam = null
+ active = 0
+ on_beam_release(current_target)
+ current_target = null
+
+/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ if(isliving(user))
+ add_fingerprint(user)
+
+ if(current_target)
+ LoseTarget()
+ if(!isliving(target))
+ return
+
+ current_target = target
+ active = TRUE
+ current_beam = new(user,current_target,time=6000,beam_icon_state="medbeam",btype=/obj/effect/ebeam/medical)
+ INVOKE_ASYNC(current_beam, /datum/beam.proc/Start)
+
+ SSblackbox.record_feedback("tally", "gun_fired", 1, type)
+
+/obj/item/gun/medbeam/process()
+
+ var/source = loc
+ if(!mounted && !isliving(source))
+ LoseTarget()
+ return
+
+ if(!current_target)
+ LoseTarget()
+ return
+
+ if(world.time <= last_check+check_delay)
+ return
+
+ last_check = world.time
+
+ if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
+ LoseTarget()
+ if(isliving(source))
+ to_chat(source, "You lose control of the beam!")
+ return
+
+ if(current_target)
+ on_beam_tick(current_target)
+
+/obj/item/gun/medbeam/proc/los_check(atom/movable/user, mob/target)
+ var/turf/user_turf = user.loc
+ if(mounted)
+ user_turf = get_turf(user)
+ else if(!istype(user_turf))
+ return 0
+ var/obj/dummy = new(user_turf)
+ dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
+ for(var/turf/turf in getline(user_turf,target))
+ if(mounted && turf == user_turf)
+ continue //Mechs are dense and thus fail the check
+ if(turf.density)
+ qdel(dummy)
+ return 0
+ for(var/atom/movable/AM in turf)
+ if(!AM.CanPass(dummy,turf,1))
+ qdel(dummy)
+ return 0
+ for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
+ if(B.owner.origin != current_beam.origin)
+ explosion(B.loc,0,3,5,8)
+ qdel(dummy)
+ return 0
+ qdel(dummy)
+ return 1
+
+/obj/item/gun/medbeam/proc/on_beam_hit(var/mob/living/target)
+ return
+
+/obj/item/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
+ if(target.health != target.maxHealth)
+ new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
+ target.adjustBruteLoss(-4)
+ target.adjustFireLoss(-4)
+ return
+
+/obj/item/gun/medbeam/proc/on_beam_release(var/mob/living/target)
+ return
+
+/obj/effect/ebeam/medical
+ name = "medical beam"
+
+//////////////////////////////Mech Version///////////////////////////////
+/obj/item/gun/medbeam/mech
+ mounted = 1
+
+/obj/item/gun/medbeam/mech/Initialize()
+ . = ..()
+ STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
similarity index 96%
rename from code/modules/projectiles/guns/syringe_gun.dm
rename to code/modules/projectiles/guns/misc/syringe_gun.dm
index ac9f7daedf..cc1b321e3a 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -1,104 +1,104 @@
-/obj/item/gun/syringe
- name = "syringe gun"
- desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
- icon_state = "syringegun"
- item_state = "syringegun"
- w_class = WEIGHT_CLASS_NORMAL
- throw_speed = 3
- throw_range = 7
- force = 4
- materials = list(MAT_METAL=2000)
- clumsy_check = 0
- fire_sound = 'sound/items/syringeproj.ogg'
- var/list/syringes = list()
- var/max_syringes = 1
-
-/obj/item/gun/syringe/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/syringegun(src)
-
-/obj/item/gun/syringe/recharge_newshot()
- if(!syringes.len)
- return
- chambered.newshot()
-
-/obj/item/gun/syringe/can_shoot()
- return syringes.len
-
-/obj/item/gun/syringe/process_chamber()
- if(chambered && !chambered.BB) //we just fired
- recharge_newshot()
-
-/obj/item/gun/syringe/examine(mob/user)
- ..()
- to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.")
-
-/obj/item/gun/syringe/attack_self(mob/living/user)
- if(!syringes.len)
- to_chat(user, "[src] is empty!")
- return 0
-
- var/obj/item/reagent_containers/syringe/S = syringes[syringes.len]
-
- if(!S)
- return 0
- S.forceMove(user.loc)
-
- syringes.Remove(S)
- to_chat(user, "You unload [S] from \the [src].")
-
- return 1
-
-/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
- if(istype(A, /obj/item/reagent_containers/syringe))
- if(syringes.len < max_syringes)
- if(!user.transferItemToLoc(A, src))
- return FALSE
- to_chat(user, "You load [A] into \the [src].")
- syringes += A
- recharge_newshot()
- return TRUE
- else
- to_chat(user, "[src] cannot hold more syringes!")
- return FALSE
-
-/obj/item/gun/syringe/rapidsyringe
- name = "rapid syringe gun"
- desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
- icon_state = "rapidsyringegun"
- max_syringes = 6
-
-/obj/item/gun/syringe/syndicate
- name = "dart pistol"
- desc = "A small spring-loaded sidearm that functions identically to a syringe gun."
- icon_state = "syringe_pistol"
- item_state = "gun" //Smaller inhand
- w_class = WEIGHT_CLASS_SMALL
- force = 2 //Also very weak because it's smaller
- suppressed = TRUE //Softer fire sound
- can_unsuppress = FALSE //Permanently silenced
-
-/obj/item/gun/syringe/dna
- name = "modified syringe gun"
- desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes."
-
-/obj/item/gun/syringe/dna/Initialize()
- . = ..()
- chambered = new /obj/item/ammo_casing/dnainjector(src)
-
-/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
- if(istype(A, /obj/item/dnainjector))
- var/obj/item/dnainjector/D = A
- if(D.used)
- to_chat(user, "This injector is used up!")
- return
- if(syringes.len < max_syringes)
- if(!user.transferItemToLoc(D, src))
- return FALSE
- to_chat(user, "You load \the [D] into \the [src].")
- syringes += D
- recharge_newshot()
- return TRUE
- else
- to_chat(user, "[src] cannot hold more syringes!")
- return FALSE
+/obj/item/gun/syringe
+ name = "syringe gun"
+ desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
+ icon_state = "syringegun"
+ item_state = "syringegun"
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 3
+ throw_range = 7
+ force = 4
+ materials = list(MAT_METAL=2000)
+ clumsy_check = 0
+ fire_sound = 'sound/items/syringeproj.ogg'
+ var/list/syringes = list()
+ var/max_syringes = 1
+
+/obj/item/gun/syringe/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/syringegun(src)
+
+/obj/item/gun/syringe/recharge_newshot()
+ if(!syringes.len)
+ return
+ chambered.newshot()
+
+/obj/item/gun/syringe/can_shoot()
+ return syringes.len
+
+/obj/item/gun/syringe/process_chamber()
+ if(chambered && !chambered.BB) //we just fired
+ recharge_newshot()
+
+/obj/item/gun/syringe/examine(mob/user)
+ ..()
+ to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.")
+
+/obj/item/gun/syringe/attack_self(mob/living/user)
+ if(!syringes.len)
+ to_chat(user, "[src] is empty!")
+ return 0
+
+ var/obj/item/reagent_containers/syringe/S = syringes[syringes.len]
+
+ if(!S)
+ return 0
+ S.forceMove(user.loc)
+
+ syringes.Remove(S)
+ to_chat(user, "You unload [S] from \the [src].")
+
+ return 1
+
+/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
+ if(istype(A, /obj/item/reagent_containers/syringe))
+ if(syringes.len < max_syringes)
+ if(!user.transferItemToLoc(A, src))
+ return FALSE
+ to_chat(user, "You load [A] into \the [src].")
+ syringes += A
+ recharge_newshot()
+ return TRUE
+ else
+ to_chat(user, "[src] cannot hold more syringes!")
+ return FALSE
+
+/obj/item/gun/syringe/rapidsyringe
+ name = "rapid syringe gun"
+ desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
+ icon_state = "rapidsyringegun"
+ max_syringes = 6
+
+/obj/item/gun/syringe/syndicate
+ name = "dart pistol"
+ desc = "A small spring-loaded sidearm that functions identically to a syringe gun."
+ icon_state = "syringe_pistol"
+ item_state = "gun" //Smaller inhand
+ w_class = WEIGHT_CLASS_SMALL
+ force = 2 //Also very weak because it's smaller
+ suppressed = TRUE //Softer fire sound
+ can_unsuppress = FALSE //Permanently silenced
+
+/obj/item/gun/syringe/dna
+ name = "modified syringe gun"
+ desc = "A syringe gun that has been modified to fit DNA injectors instead of normal syringes."
+
+/obj/item/gun/syringe/dna/Initialize()
+ . = ..()
+ chambered = new /obj/item/ammo_casing/dnainjector(src)
+
+/obj/item/gun/syringe/dna/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
+ if(istype(A, /obj/item/dnainjector))
+ var/obj/item/dnainjector/D = A
+ if(D.used)
+ to_chat(user, "This injector is used up!")
+ return
+ if(syringes.len < max_syringes)
+ if(!user.transferItemToLoc(D, src))
+ return FALSE
+ to_chat(user, "You load \the [D] into \the [src].")
+ syringes += D
+ recharge_newshot()
+ return TRUE
+ else
+ to_chat(user, "[src] cannot hold more syringes!")
+ return FALSE
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 235f27e9e5..725ef9baa6 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -7,422 +7,3 @@
flag = "bullet"
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
-
-/obj/item/projectile/bullet/incendiary
- damage = 20
- var/fire_stacks = 4
-
-/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.adjust_fire_stacks(fire_stacks)
- M.IgniteMob()
-
-/obj/item/projectile/bullet/incendiary/Move()
- . = ..()
- var/turf/location = get_turf(src)
- if(location)
- new /obj/effect/hotspot(location)
- location.hotspot_expose(700, 50, 1)
-
-// .357 (Syndie Revolver)
-
-/obj/item/projectile/bullet/a357
- name = ".357 bullet"
- damage = 60
-
-// 7.62 (Nagant Rifle)
-
-/obj/item/projectile/bullet/a762
- name = "7.62 bullet"
- damage = 60
-
-/obj/item/projectile/bullet/a762_enchanted
- name = "enchanted 7.62 bullet"
- damage = 5
- stamina = 80
-
-// 7.62x38mmR (Nagant Revolver)
-
-/obj/item/projectile/bullet/n762
- name = "7.62x38mmR bullet"
- damage = 60
-
-// .50AE (Desert Eagle)
-
-/obj/item/projectile/bullet/a50AE
- name = ".50AE bullet"
- damage = 60
-
-// .38 (Detective's Gun)
-
-/obj/item/projectile/bullet/c38
- name = ".38 bullet"
- damage = 15
- knockdown = 60
- stamina = 50
-
-// 10mm (Stechkin)
-
-/obj/item/projectile/bullet/c10mm
- name = "10mm bullet"
- damage = 30
-
-/obj/item/projectile/bullet/c10mm_ap
- name = "10mm armor-piercing bullet"
- damage = 27
- armour_penetration = 40
-
-/obj/item/projectile/bullet/c10mm_hp
- name = "10mm hollow-point bullet"
- damage = 40
- armour_penetration = -50
-
-/obj/item/projectile/bullet/incendiary/c10mm
- name = "10mm incendiary bullet"
- damage = 15
- fire_stacks = 2
-
-// 9mm (Stechkin APS)
-
-/obj/item/projectile/bullet/c9mm
- name = "9mm bullet"
- damage = 20
-
-/obj/item/projectile/bullet/c9mm_ap
- name = "9mm armor-piercing bullet"
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c9mm
- name = "9mm incendiary bullet"
- damage = 10
- fire_stacks = 1
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/projectile/bullet/c46x30mm
- name = "4.6x30mm bullet"
- damage = 20
-
-/obj/item/projectile/bullet/c46x30mm_ap
- name = "4.6x30mm armor-piercing bullet"
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c46x30mm
- name = "4.6x30mm incendiary bullet"
- damage = 10
- fire_stacks = 1
-
-// .45 (M1911 & C20r)
-
-/obj/item/projectile/bullet/c45
- name = ".45 bullet"
- damage = 20
- stamina = 65
-
-/obj/item/projectile/bullet/c45_nostamina
- name = ".45 bullet"
- damage = 30
-
-// 5.56mm (M-90gl Carbine)
-
-/obj/item/projectile/bullet/a556
- name = "5.56mm bullet"
- damage = 35
-
-// 40mm (Grenade Launcher
-
-/obj/item/projectile/bullet/a40mm
- name ="40mm grenade"
- desc = "USE A WEEL GUN"
- icon_state= "bolter"
- damage = 60
-
-/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
- return TRUE
-
-// .50 (Sniper)
-
-/obj/item/projectile/bullet/p50
- name =".50 bullet"
- speed = 0.4
- damage = 70
- knockdown = 100
- dismemberment = 50
- armour_penetration = 50
- var/breakthings = TRUE
-
-/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
- if((blocked != 100) && (!ismob(target) && breakthings))
- target.ex_act(rand(1,2))
- return ..()
-
-/obj/item/projectile/bullet/p50/soporific
- name =".50 soporific bullet"
- armour_penetration = 0
- nodamage = TRUE
- dismemberment = 0
- knockdown = 0
- breakthings = FALSE
-
-/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && isliving(target))
- var/mob/living/L = target
- L.Sleeping(400)
- return ..()
-
-/obj/item/projectile/bullet/p50/penetrator
- name =".50 penetrator bullet"
- icon_state = "gauss"
- name = "penetrator round"
- damage = 60
- forcedodge = TRUE
- dismemberment = 0 //It goes through you cleanly.
- knockdown = 0
- breakthings = FALSE
-
-// 1.95x129mm (SAW)
-
-/obj/item/projectile/bullet/mm195x129
- name = "1.95x129mm bullet"
- damage = 45
- armour_penetration = 5
-
-/obj/item/projectile/bullet/mm195x129_ap
- name = "1.95x129mm armor-piercing bullet"
- damage = 40
- armour_penetration = 75
-
-/obj/item/projectile/bullet/mm195x129_hp
- name = "1.95x129mm hollow-point bullet"
- damage = 60
- armour_penetration = -60
-
-/obj/item/projectile/bullet/incendiary/mm195x129
- name = "1.95x129mm incendiary bullet"
- damage = 15
- fire_stacks = 3
-
-// Shotgun
-
-/obj/item/projectile/bullet/shotgun_slug
- name = "12g shotgun slug"
- damage = 60
-
-/obj/item/projectile/bullet/shotgun_beanbag
- name = "beanbag slug"
- damage = 5
- stamina = 80
-
-/obj/item/projectile/bullet/incendiary/shotgun
- name = "incendiary slug"
- damage = 20
-
-/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
- name = "dragonsbreath pellet"
- damage = 5
-
-/obj/item/projectile/bullet/shotgun_stunslug
- name = "stunslug"
- damage = 5
- knockdown = 100
- stutter = 5
- jitter = 20
- range = 7
- icon_state = "spark"
- color = "#FFFF00"
-
-/obj/item/projectile/bullet/shotgun_meteorslug
- name = "meteorslug"
- icon = 'icons/obj/meteor.dmi'
- icon_state = "dust"
- damage = 20
- knockdown = 80
- hitsound = 'sound/effects/meteorimpact.ogg'
-
-/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(ismovableatom(target))
- var/atom/movable/M = target
- var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
- M.throw_at(throw_target, 3, 2)
-
-/obj/item/projectile/bullet/shotgun_meteorslug/Initialize()
- . = ..()
- SpinAnimation()
-
-/obj/item/projectile/bullet/shotgun_frag12
- name ="frag12 slug"
- damage = 25
- knockdown = 50
-
-/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 1)
- return TRUE
-
-/obj/item/projectile/bullet/pellet
- var/tile_dropoff = 0.75
- var/tile_dropoff_s = 1.25
-
-/obj/item/projectile/bullet/pellet/shotgun_buckshot
- name = "buckshot pellet"
- damage = 12.5
-
-/obj/item/projectile/bullet/pellet/shotgun_rubbershot
- name = "rubbershot pellet"
- damage = 3
- stamina = 25
-
-/obj/item/projectile/bullet/pellet/Range()
- ..()
- if(damage > 0)
- damage -= tile_dropoff
- if(stamina > 0)
- stamina -= tile_dropoff_s
- if(damage < 0 && stamina < 0)
- qdel(src)
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised
- tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
- damage = 6
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
- . = ..()
- range = rand(1, 8)
-
-/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range()
- do_sparks(1, TRUE, src)
- ..()
-
-// Scattershot
-
-/obj/item/projectile/bullet/scattershot
- damage = 20
- stamina = 65
-
-// LMD (exosuits)
-
-/obj/item/projectile/bullet/lmg
- damage = 20
-
-// Turrets
-
-/obj/item/projectile/bullet/manned_turret
- damage = 20
-
-/obj/item/projectile/bullet/syndicate_turret
- damage = 20
-
-// FNX-99 (Mechs)
-
-/obj/item/projectile/bullet/incendiary/fnx99
- damage = 20
-
-// C3D (Borgs)
-
-/obj/item/projectile/bullet/c3d
- damage = 20
-
-// Honker
-
-/obj/item/projectile/bullet/honker
- damage = 0
- knockdown = 60
- forcedodge = TRUE
- nodamage = TRUE
- hitsound = 'sound/items/bikehorn.ogg'
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "banana"
- range = 200
-
-/obj/item/projectile/bullet/honker/Initialize()
- . = ..()
- SpinAnimation()
-
-// Mime
-
-/obj/item/projectile/bullet/mime
- damage = 20
-
-/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.silent = max(M.silent, 10)
-
-// Darts
-
-/obj/item/projectile/bullet/dart
- name = "dart"
- icon_state = "cbbolt"
- damage = 6
- var/piercing = FALSE
-
-/obj/item/projectile/bullet/dart/Initialize()
- . = ..()
- create_reagents(50)
- reagents.set_reacting(FALSE)
-
-/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE)
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(blocked != 100) // not completely blocked
- if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
- ..()
- reagents.reaction(M, INJECT)
- reagents.trans_to(M, reagents.total_volume)
- return TRUE
- else
- blocked = 100
- target.visible_message("\The [src] was deflected!", \
- "You were protected against \the [src]!")
-
- ..(target, blocked)
- reagents.set_reacting(TRUE)
- reagents.handle_reactions()
- return TRUE
-
-/obj/item/projectile/bullet/dart/metalfoam/Initialize()
- . = ..()
- reagents.add_reagent("aluminium", 15)
- reagents.add_reagent("foaming_agent", 5)
- reagents.add_reagent("facid", 5)
-
-//This one is for future syringe guns update
-/obj/item/projectile/bullet/dart/syringe
- name = "syringe"
- icon_state = "syringeproj"
-
-// DNA injector
-
-/obj/item/projectile/bullet/dnainjector
- name = "\improper DNA injector"
- icon_state = "syringeproj"
- var/obj/item/dnainjector/injector
- damage = 5
- hitsound_wall = "shatter"
-
-/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(blocked != 100)
- if(M.can_inject(null, FALSE, def_zone, FALSE))
- if(injector.inject(M, firer))
- QDEL_NULL(injector)
- return TRUE
- else
- blocked = 100
- target.visible_message("\The [src] was deflected!", \
- "You were protected against \the [src]!")
- return ..()
-
-/obj/item/projectile/bullet/dnainjector/Destroy()
- QDEL_NULL(injector)
- return ..()
-
diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm
new file mode 100644
index 0000000000..d0cf74421c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm
@@ -0,0 +1,17 @@
+/obj/item/projectile/bullet/incendiary
+ damage = 20
+ var/fire_stacks = 4
+
+/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.adjust_fire_stacks(fire_stacks)
+ M.IgniteMob()
+
+/obj/item/projectile/bullet/incendiary/Move()
+ . = ..()
+ var/turf/location = get_turf(src)
+ if(location)
+ new /obj/effect/hotspot(location)
+ location.hotspot_expose(700, 50, 1)
diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
new file mode 100644
index 0000000000..023c3b9090
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
@@ -0,0 +1,39 @@
+/obj/item/projectile/bullet/dart
+ name = "dart"
+ icon_state = "cbbolt"
+ damage = 6
+ var/piercing = FALSE
+
+/obj/item/projectile/bullet/dart/Initialize()
+ . = ..()
+ create_reagents(50)
+ reagents.set_reacting(FALSE)
+
+/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE)
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(blocked != 100) // not completely blocked
+ if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ ..()
+ reagents.reaction(M, INJECT)
+ reagents.trans_to(M, reagents.total_volume)
+ return TRUE
+ else
+ blocked = 100
+ target.visible_message("\The [src] was deflected!", \
+ "You were protected against \the [src]!")
+
+ ..(target, blocked)
+ reagents.set_reacting(TRUE)
+ reagents.handle_reactions()
+ return TRUE
+
+/obj/item/projectile/bullet/dart/metalfoam/Initialize()
+ . = ..()
+ reagents.add_reagent("aluminium", 15)
+ reagents.add_reagent("foaming_agent", 5)
+ reagents.add_reagent("facid", 5)
+
+/obj/item/projectile/bullet/dart/syringe
+ name = "syringe"
+ icon_state = "syringeproj"
diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm
new file mode 100644
index 0000000000..861ead5393
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm
@@ -0,0 +1,24 @@
+/obj/item/projectile/bullet/dnainjector
+ name = "\improper DNA injector"
+ icon_state = "syringeproj"
+ var/obj/item/dnainjector/injector
+ damage = 5
+ hitsound_wall = "shatter"
+
+/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(blocked != 100)
+ if(M.can_inject(null, FALSE, def_zone, FALSE))
+ if(injector.inject(M, firer))
+ QDEL_NULL(injector)
+ return TRUE
+ else
+ blocked = 100
+ target.visible_message("\The [src] was deflected!", \
+ "You were protected against \the [src]!")
+ return ..()
+
+/obj/item/projectile/bullet/dnainjector/Destroy()
+ QDEL_NULL(injector)
+ return ..()
diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm
new file mode 100644
index 0000000000..965001b55f
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/grenade.dm
@@ -0,0 +1,12 @@
+// 40mm (Grenade Launcher
+
+/obj/item/projectile/bullet/a40mm
+ name ="40mm grenade"
+ desc = "USE A WEEL GUN"
+ icon_state= "bolter"
+ damage = 60
+
+/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm
new file mode 100644
index 0000000000..03e64976d9
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/lmg.dm
@@ -0,0 +1,44 @@
+// C3D (Borgs)
+
+/obj/item/projectile/bullet/c3d
+ damage = 20
+
+// Mech LMG
+
+/obj/item/projectile/bullet/lmg
+ damage = 20
+
+// Mech FNX-99
+
+/obj/item/projectile/bullet/incendiary/fnx99
+ damage = 20
+
+// Turrets
+
+/obj/item/projectile/bullet/manned_turret
+ damage = 20
+
+/obj/item/projectile/bullet/syndicate_turret
+ damage = 20
+
+// 1.95x129mm (SAW)
+
+/obj/item/projectile/bullet/mm195x129
+ name = "1.95x129mm bullet"
+ damage = 45
+ armour_penetration = 5
+
+/obj/item/projectile/bullet/mm195x129_ap
+ name = "1.95x129mm armor-piercing bullet"
+ damage = 40
+ armour_penetration = 75
+
+/obj/item/projectile/bullet/mm195x129_hp
+ name = "1.95x129mm hollow-point bullet"
+ damage = 60
+ armour_penetration = -60
+
+/obj/item/projectile/bullet/incendiary/mm195x129
+ name = "1.95x129mm incendiary bullet"
+ damage = 15
+ fire_stacks = 3
diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm
new file mode 100644
index 0000000000..ac14fa563c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/pistol.dm
@@ -0,0 +1,36 @@
+// 9mm (Stechkin APS)
+
+/obj/item/projectile/bullet/c9mm
+ name = "9mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c9mm_ap
+ name = "9mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c9mm
+ name = "9mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
+
+// 10mm (Stechkin)
+
+/obj/item/projectile/bullet/c10mm
+ name = "10mm bullet"
+ damage = 30
+
+/obj/item/projectile/bullet/c10mm_ap
+ name = "10mm armor-piercing bullet"
+ damage = 27
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/c10mm_hp
+ name = "10mm hollow-point bullet"
+ damage = 40
+ armour_penetration = -50
+
+/obj/item/projectile/bullet/incendiary/c10mm
+ name = "10mm incendiary bullet"
+ damage = 15
+ fire_stacks = 2
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
new file mode 100644
index 0000000000..fc4ed0fa50
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -0,0 +1,25 @@
+// 7.62x38mmR (Nagant Revolver)
+
+/obj/item/projectile/bullet/n762
+ name = "7.62x38mmR bullet"
+ damage = 60
+
+// .50AE (Desert Eagle)
+
+/obj/item/projectile/bullet/a50AE
+ name = ".50AE bullet"
+ damage = 60
+
+// .38 (Detective's Gun)
+
+/obj/item/projectile/bullet/c38
+ name = ".38 bullet"
+ damage = 15
+ knockdown = 60
+ stamina = 50
+
+// .357 (Syndie Revolver)
+
+/obj/item/projectile/bullet/a357
+ name = ".357 bullet"
+ damage = 60
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
new file mode 100644
index 0000000000..a019c05ef1
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -0,0 +1,16 @@
+// 5.56mm (M-90gl Carbine)
+
+/obj/item/projectile/bullet/a556
+ name = "5.56mm bullet"
+ damage = 35
+
+// 7.62 (Nagant Rifle)
+
+/obj/item/projectile/bullet/a762
+ name = "7.62 bullet"
+ damage = 60
+
+/obj/item/projectile/bullet/a762_enchanted
+ name = "enchanted 7.62 bullet"
+ damage = 5
+ stamina = 80
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
new file mode 100644
index 0000000000..ecbe2e96e4
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -0,0 +1,95 @@
+/obj/item/projectile/bullet/shotgun_slug
+ name = "12g shotgun slug"
+ damage = 60
+
+/obj/item/projectile/bullet/shotgun_beanbag
+ name = "beanbag slug"
+ damage = 5
+ stamina = 80
+
+/obj/item/projectile/bullet/incendiary/shotgun
+ name = "incendiary slug"
+ damage = 20
+
+/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
+ name = "dragonsbreath pellet"
+ damage = 5
+
+/obj/item/projectile/bullet/shotgun_stunslug
+ name = "stunslug"
+ damage = 5
+ knockdown = 100
+ stutter = 5
+ jitter = 20
+ range = 7
+ icon_state = "spark"
+ color = "#FFFF00"
+
+/obj/item/projectile/bullet/shotgun_meteorslug
+ name = "meteorslug"
+ icon = 'icons/obj/meteor.dmi'
+ icon_state = "dust"
+ damage = 20
+ knockdown = 80
+ hitsound = 'sound/effects/meteorimpact.ogg'
+
+/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(ismovableatom(target))
+ var/atom/movable/M = target
+ var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
+ M.throw_at(throw_target, 3, 2)
+
+/obj/item/projectile/bullet/shotgun_meteorslug/Initialize()
+ . = ..()
+ SpinAnimation()
+
+/obj/item/projectile/bullet/shotgun_frag12
+ name ="frag12 slug"
+ damage = 25
+ knockdown = 50
+
+/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 1)
+ return TRUE
+
+/obj/item/projectile/bullet/pellet
+ var/tile_dropoff = 0.75
+ var/tile_dropoff_s = 1.25
+
+/obj/item/projectile/bullet/pellet/shotgun_buckshot
+ name = "buckshot pellet"
+ damage = 12.5
+
+/obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ name = "rubbershot pellet"
+ damage = 3
+ stamina = 25
+
+/obj/item/projectile/bullet/pellet/Range()
+ ..()
+ if(damage > 0)
+ damage -= tile_dropoff
+ if(stamina > 0)
+ stamina -= tile_dropoff_s
+ if(damage < 0 && stamina < 0)
+ qdel(src)
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised
+ tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
+ damage = 6
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
+ . = ..()
+ range = rand(1, 8)
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range()
+ do_sparks(1, TRUE, src)
+ ..()
+
+// Mech Scattershot
+
+/obj/item/projectile/bullet/scattershot
+ damage = 20
+ stamina = 65
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
new file mode 100644
index 0000000000..50532a5977
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -0,0 +1,26 @@
+// .45 (M1911 & C20r)
+
+/obj/item/projectile/bullet/c45
+ name = ".45 bullet"
+ damage = 20
+ stamina = 65
+
+/obj/item/projectile/bullet/c45_nostamina
+ name = ".45 bullet"
+ damage = 30
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/projectile/bullet/c46x30mm
+ name = "4.6x30mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c46x30mm_ap
+ name = "4.6x30mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c46x30mm
+ name = "4.6x30mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm
new file mode 100644
index 0000000000..d29cb70440
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/sniper.dm
@@ -0,0 +1,39 @@
+// .50 (Sniper)
+
+/obj/item/projectile/bullet/p50
+ name =".50 bullet"
+ speed = 0.4
+ damage = 70
+ knockdown = 100
+ dismemberment = 50
+ armour_penetration = 50
+ var/breakthings = TRUE
+
+/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
+ if((blocked != 100) && (!ismob(target) && breakthings))
+ target.ex_act(rand(1,2))
+ return ..()
+
+/obj/item/projectile/bullet/p50/soporific
+ name =".50 soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+ breakthings = FALSE
+
+/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.Sleeping(400)
+ return ..()
+
+/obj/item/projectile/bullet/p50/penetrator
+ name =".50 penetrator bullet"
+ icon_state = "gauss"
+ name = "penetrator round"
+ damage = 60
+ forcedodge = TRUE
+ dismemberment = 0 //It goes through you cleanly.
+ knockdown = 0
+ breakthings = FALSE
diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm
new file mode 100644
index 0000000000..091dff454c
--- /dev/null
+++ b/code/modules/projectiles/projectile/bullets/special.dm
@@ -0,0 +1,26 @@
+// Honker
+
+/obj/item/projectile/bullet/honker
+ damage = 0
+ knockdown = 60
+ forcedodge = TRUE
+ nodamage = TRUE
+ hitsound = 'sound/items/bikehorn.ogg'
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "banana"
+ range = 200
+
+/obj/item/projectile/bullet/honker/Initialize()
+ . = ..()
+ SpinAnimation()
+
+// Mime
+
+/obj/item/projectile/bullet/mime
+ damage = 20
+
+/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.silent = max(M.silent, 10)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
deleted file mode 100644
index 2d7f8f5cce..0000000000
--- a/code/modules/projectiles/projectile/energy.dm
+++ /dev/null
@@ -1,203 +0,0 @@
-/obj/item/projectile/energy
- name = "energy"
- icon_state = "spark"
- damage = 0
- damage_type = BURN
- flag = "energy"
- is_reflectable = TRUE
-
-/obj/item/projectile/energy/chameleon
- nodamage = TRUE
-
-/obj/item/projectile/energy/electrode
- name = "electrode"
- icon_state = "spark"
- color = "#FFFF00"
- nodamage = 1
- knockdown = 100
- stutter = 5
- jitter = 20
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 7
- tracer_type = /obj/effect/projectile/tracer/stun
- muzzle_type = /obj/effect/projectile/muzzle/stun
- impact_type = /obj/effect/projectile/impact/stun
-
-/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
- do_sparks(1, TRUE, src)
- else if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(C.dna && C.dna.check_mutation(HULK))
- C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
- addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
-
-/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
- do_sparks(1, TRUE, src)
- ..()
-
-/obj/item/projectile/energy/net
- name = "energy netting"
- icon_state = "e_netting"
- damage = 10
- damage_type = STAMINA
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 10
-
-/obj/item/projectile/energy/net/Initialize()
- . = ..()
- SpinAnimation()
-
-/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE)
- if(isliving(target))
- var/turf/Tloc = get_turf(target)
- if(!locate(/obj/effect/nettingportal) in Tloc)
- new /obj/effect/nettingportal(Tloc)
- ..()
-
-/obj/item/projectile/energy/net/on_range()
- do_sparks(1, TRUE, src)
- ..()
-
-/obj/effect/nettingportal
- name = "DRAGnet teleportation field"
- desc = "A field of bluespace energy, locking on to teleport a target."
- icon = 'icons/effects/effects.dmi'
- icon_state = "dragnetfield"
- light_range = 3
- anchored = TRUE
-
-/obj/effect/nettingportal/Initialize()
- . = ..()
- var/obj/item/device/radio/beacon/teletarget = null
- for(var/obj/machinery/computer/teleporter/com in GLOB.machines)
- if(com.target)
- if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
- teletarget = com.target
-
- addtimer(CALLBACK(src, .proc/pop, teletarget), 30)
-
-/obj/effect/nettingportal/proc/pop(teletarget)
- if(teletarget)
- for(var/mob/living/L in get_turf(src))
- do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
- else
- for(var/mob/living/L in get_turf(src))
- do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
-
- qdel(src)
-
-/obj/effect/nettingportal/singularity_act()
- return
-
-/obj/effect/nettingportal/singularity_pull()
- return
-
-
-/obj/item/projectile/energy/trap
- name = "energy snare"
- icon_state = "e_snare"
- nodamage = 1
- knockdown = 20
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 4
-
-/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE)
- if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap
- new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
- else if(iscarbon(target))
- var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
- B.Crossed(target)
- ..()
-
-/obj/item/projectile/energy/trap/on_range()
- new /obj/item/restraints/legcuffs/beartrap/energy(loc)
- ..()
-
-/obj/item/projectile/energy/trap/cyborg
- name = "Energy Bola"
- icon_state = "e_snare"
- nodamage = 1
- knockdown = 0
- hitsound = 'sound/weapons/taserhit.ogg'
- range = 10
-
-/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE)
- if(!ismob(target) || blocked >= 100)
- do_sparks(1, TRUE, src)
- qdel(src)
- if(iscarbon(target))
- var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
- B.Crossed(target)
- QDEL_IN(src, 10)
- ..()
-
-/obj/item/projectile/energy/trap/cyborg/on_range()
- do_sparks(1, TRUE, src)
- qdel(src)
-
-/obj/item/projectile/energy/declone
- name = "radiation beam"
- icon_state = "declone"
- damage = 20
- damage_type = CLONE
- irradiate = 10
- impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
-
-/obj/item/projectile/energy/dart //ninja throwing dart
- name = "dart"
- icon_state = "toxin"
- damage = 5
- damage_type = TOX
- knockdown = 100
- range = 7
-
-/obj/item/projectile/energy/bolt //ebow bolts
- name = "bolt"
- icon_state = "cbbolt"
- damage = 8
- damage_type = TOX
- nodamage = 0
- knockdown = 100
- stutter = 5
-
-/obj/item/projectile/energy/bolt/halloween
- name = "candy corn"
- icon_state = "candy_corn"
-
-/obj/item/projectile/energy/bolt/large
- damage = 20
-
-/obj/item/projectile/energy/tesla
- name = "tesla bolt"
- icon_state = "tesla_projectile"
- impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
- var/chain
-
-/obj/item/projectile/energy/tesla/fire(setAngle)
- if(firer)
- chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
- ..()
-
-/obj/item/projectile/energy/tesla/Destroy()
- qdel(chain)
- return ..()
-
-/obj/item/projectile/energy/tesla/revolver
- name = "energy orb"
-
-/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target)
- . = ..()
- if(isliving(target))
- tesla_zap(target, 3, 10000)
- qdel(src)
-
-/obj/item/projectile/energy/tesla/cannon
- name = "tesla orb"
-
-/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target)
- . = ..()
- tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE)
- qdel(src)
diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm
new file mode 100644
index 0000000000..3df1eb74d3
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/_energy.dm
@@ -0,0 +1,8 @@
+/obj/item/projectile/energy
+ name = "energy"
+ icon_state = "spark"
+ damage = 0
+ damage_type = BURN
+ flag = "energy"
+ is_reflectable = TRUE
+
diff --git a/code/modules/projectiles/projectile/energy/chameleon.dm b/code/modules/projectiles/projectile/energy/chameleon.dm
new file mode 100644
index 0000000000..8ed6283c51
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/chameleon.dm
@@ -0,0 +1,3 @@
+/obj/item/projectile/energy/chameleon
+ nodamage = TRUE
+
diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm
new file mode 100644
index 0000000000..3e65bbfad2
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/ebow.dm
@@ -0,0 +1,15 @@
+/obj/item/projectile/energy/bolt //ebow bolts
+ name = "bolt"
+ icon_state = "cbbolt"
+ damage = 8
+ damage_type = TOX
+ nodamage = 0
+ knockdown = 100
+ stutter = 5
+
+/obj/item/projectile/energy/bolt/halloween
+ name = "candy corn"
+ icon_state = "candy_corn"
+
+/obj/item/projectile/energy/bolt/large
+ damage = 20
diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm
new file mode 100644
index 0000000000..21c3138add
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/misc.dm
@@ -0,0 +1,15 @@
+/obj/item/projectile/energy/declone
+ name = "radiation beam"
+ icon_state = "declone"
+ damage = 20
+ damage_type = CLONE
+ irradiate = 10
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
+
+/obj/item/projectile/energy/dart //ninja throwing dart
+ name = "dart"
+ icon_state = "toxin"
+ damage = 5
+ damage_type = TOX
+ knockdown = 100
+ range = 7
diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm
new file mode 100644
index 0000000000..01e87d26cd
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/net_snare.dm
@@ -0,0 +1,98 @@
+/obj/item/projectile/energy/net
+ name = "energy netting"
+ icon_state = "e_netting"
+ damage = 10
+ damage_type = STAMINA
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/net/Initialize()
+ . = ..()
+ SpinAnimation()
+
+/obj/item/projectile/energy/net/on_hit(atom/target, blocked = FALSE)
+ if(isliving(target))
+ var/turf/Tloc = get_turf(target)
+ if(!locate(/obj/effect/nettingportal) in Tloc)
+ new /obj/effect/nettingportal(Tloc)
+ ..()
+
+/obj/item/projectile/energy/net/on_range()
+ do_sparks(1, TRUE, src)
+ ..()
+
+/obj/effect/nettingportal
+ name = "DRAGnet teleportation field"
+ desc = "A field of bluespace energy, locking on to teleport a target."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "dragnetfield"
+ light_range = 3
+ anchored = TRUE
+
+/obj/effect/nettingportal/Initialize()
+ . = ..()
+ var/obj/item/device/radio/beacon/teletarget = null
+ for(var/obj/machinery/computer/teleporter/com in GLOB.machines)
+ if(com.target)
+ if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
+ teletarget = com.target
+
+ addtimer(CALLBACK(src, .proc/pop, teletarget), 30)
+
+/obj/effect/nettingportal/proc/pop(teletarget)
+ if(teletarget)
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
+ else
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
+
+ qdel(src)
+
+/obj/effect/nettingportal/singularity_act()
+ return
+
+/obj/effect/nettingportal/singularity_pull()
+ return
+
+/obj/item/projectile/energy/trap
+ name = "energy snare"
+ icon_state = "e_snare"
+ nodamage = 1
+ knockdown = 20
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 4
+
+/obj/item/projectile/energy/trap/on_hit(atom/target, blocked = FALSE)
+ if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap
+ new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
+ else if(iscarbon(target))
+ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
+ B.Crossed(target)
+ ..()
+
+/obj/item/projectile/energy/trap/on_range()
+ new /obj/item/restraints/legcuffs/beartrap/energy(loc)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg
+ name = "Energy Bola"
+ icon_state = "e_snare"
+ nodamage = 1
+ knockdown = 0
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE)
+ if(!ismob(target) || blocked >= 100)
+ do_sparks(1, TRUE, src)
+ qdel(src)
+ if(iscarbon(target))
+ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
+ B.Crossed(target)
+ QDEL_IN(src, 10)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg/on_range()
+ do_sparks(1, TRUE, src)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
new file mode 100644
index 0000000000..598b64d025
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -0,0 +1,28 @@
+/obj/item/projectile/energy/electrode
+ name = "electrode"
+ icon_state = "spark"
+ color = "#FFFF00"
+ nodamage = 1
+ knockdown = 100
+ stutter = 5
+ jitter = 20
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 7
+ tracer_type = /obj/effect/projectile/tracer/stun
+ muzzle_type = /obj/effect/projectile/muzzle/stun
+ impact_type = /obj/effect/projectile/impact/stun
+
+/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
+ do_sparks(1, TRUE, src)
+ else if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(C.dna && C.dna.check_mutation(HULK))
+ C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
+ addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
+
+/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
+ do_sparks(1, TRUE, src)
+ ..()
diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm
new file mode 100644
index 0000000000..6eebd6afbf
--- /dev/null
+++ b/code/modules/projectiles/projectile/energy/tesla.dm
@@ -0,0 +1,31 @@
+/obj/item/projectile/energy/tesla
+ name = "tesla bolt"
+ icon_state = "tesla_projectile"
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
+ var/chain
+
+/obj/item/projectile/energy/tesla/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY)
+ ..()
+
+/obj/item/projectile/energy/tesla/Destroy()
+ qdel(chain)
+ return ..()
+
+/obj/item/projectile/energy/tesla/revolver
+ name = "energy orb"
+
+/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target)
+ . = ..()
+ if(isliving(target))
+ tesla_zap(target, 3, 10000)
+ qdel(src)
+
+/obj/item/projectile/energy/tesla/cannon
+ name = "tesla orb"
+
+/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target)
+ . = ..()
+ tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm
new file mode 100644
index 0000000000..33c9678fe4
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable/_reusable.dm
@@ -0,0 +1,20 @@
+/obj/item/projectile/bullet/reusable
+ name = "reusable bullet"
+ desc = "How do you even reuse a bullet?"
+ var/ammo_type = /obj/item/ammo_casing/caseless
+ var/dropped = FALSE
+ impact_effect_type = null
+
+/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ handle_drop()
+
+/obj/item/projectile/bullet/reusable/on_range()
+ handle_drop()
+ ..()
+
+/obj/item/projectile/bullet/reusable/proc/handle_drop()
+ if(!dropped)
+ var/turf/T = get_turf(src)
+ new ammo_type(T)
+ dropped = TRUE
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm
similarity index 59%
rename from code/modules/projectiles/projectile/reusable.dm
rename to code/modules/projectiles/projectile/reusable/foam_dart.dm
index ccd4b7589c..c7f99c75aa 100644
--- a/code/modules/projectiles/projectile/reusable.dm
+++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm
@@ -1,69 +1,41 @@
-/obj/item/projectile/bullet/reusable
- name = "reusable bullet"
- desc = "How do you even reuse a bullet?"
- var/ammo_type = /obj/item/ammo_casing/caseless
- var/dropped = 0
- impact_effect_type = null
-
-/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE)
- . = ..()
- handle_drop()
-
-/obj/item/projectile/bullet/reusable/on_range()
- handle_drop()
- ..()
-
-/obj/item/projectile/bullet/reusable/proc/handle_drop()
- if(!dropped)
- var/turf/T = get_turf(src)
- new ammo_type(T)
- dropped = 1
-
-/obj/item/projectile/bullet/reusable/magspear
- name = "magnetic spear"
- desc = "WHITE WHALE, HOLY GRAIL"
- damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
- icon_state = "magspear"
- ammo_type = /obj/item/ammo_casing/caseless/magspear
-
-/obj/item/projectile/bullet/reusable/foam_dart
- name = "foam dart"
- desc = "I hope you're wearing eye protection."
- damage = 0 // It's a damn toy.
- damage_type = OXY
- nodamage = 1
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart_proj"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- range = 10
- var/modified = 0
- var/obj/item/pen/pen = null
-
-/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
- if(dropped)
- return
- var/turf/T = get_turf(src)
- dropped = 1
- var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T)
- newcasing.modified = modified
- var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
- newdart.modified = modified
- newdart.damage = damage
- newdart.nodamage = nodamage
- newdart.damage_type = damage_type
- if(pen)
- newdart.pen = pen
- pen.forceMove(newdart)
- pen = null
- newdart.update_icon()
-
-
-/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
- pen = null
- return ..()
-
-/obj/item/projectile/bullet/reusable/foam_dart/riot
- name = "riot foam dart"
- icon_state = "foamdart_riot_proj"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- stamina = 25
+/obj/item/projectile/bullet/reusable/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ damage_type = OXY
+ nodamage = 1
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foamdart_proj"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ range = 10
+ var/modified = 0
+ var/obj/item/pen/pen = null
+
+/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
+ if(dropped)
+ return
+ var/turf/T = get_turf(src)
+ dropped = 1
+ var/obj/item/ammo_casing/caseless/foam_dart/newcasing = new ammo_type(T)
+ newcasing.modified = modified
+ var/obj/item/projectile/bullet/reusable/foam_dart/newdart = newcasing.BB
+ newdart.modified = modified
+ newdart.damage = damage
+ newdart.nodamage = nodamage
+ newdart.damage_type = damage_type
+ if(pen)
+ newdart.pen = pen
+ pen.forceMove(newdart)
+ pen = null
+ newdart.update_icon()
+
+
+/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
+ pen = null
+ return ..()
+
+/obj/item/projectile/bullet/reusable/foam_dart/riot
+ name = "riot foam dart"
+ icon_state = "foamdart_riot_proj"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ stamina = 25
diff --git a/code/modules/projectiles/projectile/reusable/magspear.dm b/code/modules/projectiles/projectile/reusable/magspear.dm
new file mode 100644
index 0000000000..7fcd6b80a6
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable/magspear.dm
@@ -0,0 +1,6 @@
+/obj/item/projectile/bullet/reusable/magspear
+ name = "magnetic spear"
+ desc = "WHITE WHALE, HOLY GRAIL"
+ damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
+ icon_state = "magspear"
+ ammo_type = /obj/item/ammo_casing/caseless/magspear
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
deleted file mode 100644
index e8f309309a..0000000000
--- a/code/modules/projectiles/projectile/special.dm
+++ /dev/null
@@ -1,617 +0,0 @@
-/obj/item/projectile/ion
- name = "ion bolt"
- icon_state = "ion"
- damage = 0
- damage_type = BURN
- nodamage = 1
- flag = "energy"
- impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
-
-
-/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE)
- ..()
- empulse(target, 1, 1)
- return 1
-
-
-/obj/item/projectile/ion/weak
-
-/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE)
- ..()
- empulse(target, 0, 0)
- return 1
-
-
-/obj/item/projectile/bullet/gyro
- name ="explosive bolt"
- icon_state= "bolter"
- damage = 50
-
-/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 2)
- return 1
-
-/obj/item/projectile/bullet/a84mm
- name ="anti-armour rocket"
- desc = "USE A WEEL GUN"
- icon_state= "atrocket"
- damage = 80
- var/anti_armour_damage = 200
- armour_penetration = 100
- dismemberment = 100
-
-/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
-
- if(ismecha(target))
- var/obj/mecha/M = target
- M.take_damage(anti_armour_damage)
- if(issilicon(target))
- var/mob/living/silicon/S = target
- S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
- return 1
-
-/obj/item/projectile/bullet/srmrocket
- name ="SRM-8 Rocket"
- desc = "Boom."
- icon_state = "missile"
- damage = 30
- ricochets_max = 0 //it's a MISSILE
-
-/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
- ..()
- if(!isliving(target)) //if the target isn't alive, so is a wall or something
- explosion(target, 0, 1, 2, 4)
- else
- explosion(target, 0, 0, 2, 4)
- return 1
-
-/obj/item/projectile/temp
- name = "freeze beam"
- icon_state = "ice_2"
- damage = 0
- damage_type = BURN
- nodamage = 1
- flag = "energy"
- var/temperature = 100
-
-
-/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob
- ..()
- if(isliving(target))
- var/mob/M = target
- M.bodytemperature = temperature
- return 1
-
-/obj/item/projectile/temp/hot
- name = "heat beam"
- temperature = 400
-
-/obj/item/projectile/meteor
- name = "meteor"
- icon = 'icons/obj/meteor.dmi'
- icon_state = "small1"
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- flag = "bullet"
-
-/obj/item/projectile/meteor/Collide(atom/A)
- if(A == firer)
- forceMove(A.loc)
- return
- A.ex_act(EXPLODE_HEAVY)
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
- for(var/mob/M in urange(10, src))
- if(!M.stat)
- shake_camera(M, 3, 1)
- qdel(src)
-
-/obj/item/projectile/energy/floramut
- name = "alpha somatoray"
- icon_state = "energy"
- damage = 0
- damage_type = TOX
- nodamage = 1
- flag = "energy"
-
-/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(C.dna.species.id == "pod")
- C.randmuti()
- C.randmut()
- C.updateappearance()
- C.domutcheck()
-
-/obj/item/projectile/energy/florayield
- name = "beta somatoray"
- icon_state = "energy2"
- damage = 0
- damage_type = TOX
- nodamage = 1
- flag = "energy"
-
-/obj/item/projectile/beam/mindflayer
- name = "flayer ray"
-
-/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(ishuman(target))
- var/mob/living/carbon/human/M = target
- M.adjustBrainLoss(20)
- M.hallucination += 20
-
-/obj/item/projectile/beam/wormhole
- name = "bluespace beam"
- icon_state = "spark"
- hitsound = "sparks"
- damage = 3
- var/obj/item/gun/energy/wormhole_projector/gun
- color = "#33CCFF"
-
-/obj/item/projectile/beam/wormhole/orange
- name = "orange bluespace beam"
- color = "#FF6600"
-
-/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing)
- if(casing)
- gun = casing.gun
-
-/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/gun/energy/wormhole_projector/wh)
- gun = wh
-
-/obj/item/projectile/beam/wormhole/on_hit(atom/target)
- if(ismob(target))
- var/turf/portal_destination = pick(orange(6, src))
- do_teleport(target, portal_destination)
- return ..()
- if(!gun)
- qdel(src)
- gun.create_portal(src, get_turf(src))
-
-/obj/item/projectile/plasma
- name = "plasma blast"
- icon_state = "plasmacutter"
- damage_type = BRUTE
- damage = 20
- range = 4
- dismemberment = 20
- impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
- var/pressure_decrease_active = FALSE
- var/pressure_decrease = 0.25
- var/mine_range = 3 //mines this many additional tiles of rock
- tracer_type = /obj/effect/projectile/tracer/plasma_cutter
- muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter
- impact_type = /obj/effect/projectile/impact/plasma_cutter
-
-/obj/item/projectile/plasma/Initialize()
- . = ..()
- if(!lavaland_equipment_pressure_check(get_turf(src)))
- name = "weakened [name]"
- damage = damage * pressure_decrease
- pressure_decrease_active = TRUE
-
-/obj/item/projectile/plasma/on_hit(atom/target)
- . = ..()
- if(ismineralturf(target))
- var/turf/closed/mineral/M = target
- M.gets_drilled(firer)
- if(mine_range)
- mine_range--
- range++
- if(range > 0)
- return -1
-
-/obj/item/projectile/plasma/adv
- damage = 28
- range = 5
- mine_range = 5
-
-/obj/item/projectile/plasma/adv/mech
- damage = 40
- range = 9
- mine_range = 3
-
-/obj/item/projectile/plasma/turret
- //Between normal and advanced for damage, made a beam so not the turret does not destroy glass
- name = "plasma beam"
- damage = 24
- range = 7
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-
-/obj/item/projectile/gravityrepulse
- name = "repulsion bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#33CCFF"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravityrepulse/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravityrepulse/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravityrepulse/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
- A.throw_at(throwtarget,power+1,1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravityattract
- name = "attraction bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#FF6600"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravityattract/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravityattract/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravityattract/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(T, power+1, 1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravitychaos
- name = "gravitational blast"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
- color = "#101010"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-
-/obj/item/projectile/gravitychaos/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravitychaos/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravitychaos/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
- thrown_items[A] = A
- for(var/turf/Z in range(T,power))
- new /obj/effect/temp_visual/gravpush(Z)
-
-/obj/effect/ebeam/curse_arm
- name = "curse arm"
- layer = LARGE_MOB_LAYER
-
-/obj/item/projectile/curse_hand
- name = "curse hand"
- icon_state = "cursehand"
- hitsound = 'sound/effects/curse4.ogg'
- layer = LARGE_MOB_LAYER
- damage_type = BURN
- damage = 10
- knockdown = 20
- speed = 2
- range = 16
- forcedodge = TRUE
- var/datum/beam/arm
- var/handedness = 0
-
-/obj/item/projectile/curse_hand/Initialize(mapload)
- . = ..()
- handedness = prob(50)
- update_icon()
-
-/obj/item/projectile/curse_hand/update_icon()
- icon_state = "[icon_state][handedness]"
-
-/obj/item/projectile/curse_hand/fire(setAngle)
- if(starting)
- arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm)
- ..()
-
-/obj/item/projectile/curse_hand/prehit(atom/target)
- if(target == original)
- forcedodge = FALSE
- else if(!isturf(target))
- return FALSE
- return ..()
-
-/obj/item/projectile/curse_hand/Destroy()
- if(arm)
- arm.End()
- arm = null
- if(forcedodge)
- playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
- var/turf/T = get_step(src, dir)
- new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness)
- for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
- qdel(G)
- new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
- var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
- for(var/b in D.elements)
- var/obj/effect/ebeam/B = b
- animate(B, alpha = 0, time = 32)
- return ..()
-
-/obj/item/projectile/hallucination
- name = "bullet"
- icon = null
- icon_state = null
- hitsound = ""
- suppressed = TRUE
- ricochets_max = 0
- ricochet_chance = 0
- damage = 0
- nodamage = TRUE
- projectile_type = /obj/item/projectile/hallucination
- log_override = TRUE
- var/hal_icon_state
- var/image/fake_icon
- var/mob/living/carbon/hal_target
- var/hal_fire_sound
- var/hal_hitsound
- var/hal_hitsound_wall
- var/hal_impact_effect
- var/hal_impact_effect_wall
- var/hit_duration
- var/hit_duration_wall
-
-/obj/item/projectile/hallucination/fire()
- ..()
- fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER)
- if(hal_target.client)
- hal_target.client.images += fake_icon
-
-/obj/item/projectile/hallucination/Destroy()
- if(hal_target.client)
- hal_target.client.images -= fake_icon
- QDEL_NULL(fake_icon)
- return ..()
-
-/obj/item/projectile/hallucination/Collide(atom/A)
- if(!ismob(A))
- if(hal_hitsound_wall)
- hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1)
- if(hal_impact_effect_wall)
- spawn_hit(A, TRUE)
- else if(A == hal_target)
- if(hal_hitsound)
- hal_target.playsound_local(A, hal_hitsound, 100, 1)
- target_on_hit(A)
- qdel(src)
- return TRUE
-
-/obj/item/projectile/hallucination/proc/target_on_hit(mob/M)
- if(M == hal_target)
- to_chat(hal_target, "[M] is hit by \a [src] in the chest!")
- hal_apply_effect()
- else if(M in view(hal_target))
- to_chat(hal_target, "[M] is hit by \a [src] in the chest!!")
- if(damage_type == BRUTE)
- var/splatter_dir = dir
- if(starting)
- splatter_dir = get_dir(starting, get_turf(M))
- spawn_blood(M, splatter_dir)
- else if(hal_impact_effect)
- spawn_hit(M, FALSE)
-
-/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir)
- set waitfor = 0
- if(!hal_target.client)
- return
-
- var/splatter_icon_state
- if(set_dir in GLOB.diagonals)
- splatter_icon_state = "splatter[pick(1, 2, 6)]"
- else
- splatter_icon_state = "splatter[pick(3, 4, 5)]"
-
- var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER)
- var/target_pixel_x = 0
- var/target_pixel_y = 0
- switch(set_dir)
- if(NORTH)
- target_pixel_y = 16
- if(SOUTH)
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(EAST)
- target_pixel_x = 16
- if(WEST)
- target_pixel_x = -16
- if(NORTHEAST)
- target_pixel_x = 16
- target_pixel_y = 16
- if(NORTHWEST)
- target_pixel_x = -16
- target_pixel_y = 16
- if(SOUTHEAST)
- target_pixel_x = 16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- if(SOUTHWEST)
- target_pixel_x = -16
- target_pixel_y = -16
- layer = ABOVE_MOB_LAYER
- hal_target.client.images += blood
- animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
- addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
-
-/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood)
- hal_target.client.images -= blood
- qdel(blood)
-
-/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall)
- set waitfor = 0
- if(!hal_target.client)
- return
-
- var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER)
- hit_effect.pixel_x = A.pixel_x + rand(-4,4)
- hit_effect.pixel_y = A.pixel_y + rand(-4,4)
- hal_target.client.images += hit_effect
- sleep(is_wall ? hit_duration_wall : hit_duration)
- hal_target.client.images -= hit_effect
- qdel(hit_effect)
-
-
-/obj/item/projectile/hallucination/proc/hal_apply_effect()
- return
-
-/obj/item/projectile/hallucination/bullet
- name = "bullet"
- hal_icon_state = "bullet"
- hal_fire_sound = "gunshot"
- hal_hitsound = 'sound/weapons/pierce.ogg'
- hal_hitsound_wall = "ricochet"
- hal_impact_effect = "impact_bullet"
- hal_impact_effect_wall = "impact_bullet"
- hit_duration = 5
- hit_duration_wall = 5
-
-/obj/item/projectile/hallucination/bullet/hal_apply_effect()
- hal_target.adjustStaminaLoss(60)
-
-/obj/item/projectile/hallucination/laser
- name = "laser"
- damage_type = BURN
- hal_icon_state = "laser"
- hal_fire_sound = 'sound/weapons/laser.ogg'
- hal_hitsound = 'sound/weapons/sear.ogg'
- hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- hal_impact_effect = "impact_laser"
- hal_impact_effect_wall = "impact_laser_wall"
- hit_duration = 4
- hit_duration_wall = 10
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-/obj/item/projectile/hallucination/laser/hal_apply_effect()
- hal_target.adjustStaminaLoss(20)
- hal_target.blur_eyes(2)
-
-/obj/item/projectile/hallucination/taser
- name = "electrode"
- damage_type = BURN
- hal_icon_state = "spark"
- color = "#FFFF00"
- hal_fire_sound = 'sound/weapons/taser.ogg'
- hal_hitsound = 'sound/weapons/taserhit.ogg'
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/taser/hal_apply_effect()
- hal_target.Knockdown(100)
- hal_target.stuttering += 20
- if(hal_target.dna && hal_target.dna.check_mutation(HULK))
- hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE))
- addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
-
-/obj/item/projectile/hallucination/disabler
- name = "disabler beam"
- damage_type = STAMINA
- hal_icon_state = "omnilaser"
- hal_fire_sound = 'sound/weapons/taser2.ogg'
- hal_hitsound = 'sound/weapons/tap.ogg'
- hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
- hal_impact_effect = "impact_laser_blue"
- hal_impact_effect_wall = null
- hit_duration = 4
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
-
-/obj/item/projectile/hallucination/disabler/hal_apply_effect()
- hal_target.adjustStaminaLoss(25)
-
-/obj/item/projectile/hallucination/ebow
- name = "bolt"
- damage_type = TOX
- hal_icon_state = "cbbolt"
- hal_fire_sound = 'sound/weapons/genhit.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/ebow/hal_apply_effect()
- hal_target.Knockdown(100)
- hal_target.stuttering += 5
- hal_target.adjustStaminaLoss(8)
-
-/obj/item/projectile/hallucination/change
- name = "bolt of change"
- damage_type = BURN
- hal_icon_state = "ice_1"
- hal_fire_sound = 'sound/magic/staff_change.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/change/hal_apply_effect()
- new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE)
-
-/obj/item/projectile/hallucination/death
- name = "bolt of death"
- damage_type = BURN
- hal_icon_state = "pulse1_bl"
- hal_fire_sound = 'sound/magic/wandodeath.ogg'
- hal_hitsound = null
- hal_hitsound_wall = null
- hal_impact_effect = null
- hal_impact_effect_wall = null
-
-/obj/item/projectile/hallucination/death/hal_apply_effect()
- new /datum/hallucination/death(hal_target, TRUE)
-
-// Neurotoxin
-
-/obj/item/projectile/bullet/neurotoxin
- name = "neurotoxin spit"
- icon_state = "neurotoxin"
- damage = 5
- damage_type = TOX
- knockdown = 100
-
-/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
- if(isalien(target))
- knockdown = 0
- nodamage = TRUE
- return ..()
diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm
new file mode 100644
index 0000000000..e5ac8126dd
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/curse.dm
@@ -0,0 +1,55 @@
+/obj/effect/ebeam/curse_arm
+ name = "curse arm"
+ layer = LARGE_MOB_LAYER
+
+/obj/item/projectile/curse_hand
+ name = "curse hand"
+ icon_state = "cursehand"
+ hitsound = 'sound/effects/curse4.ogg'
+ layer = LARGE_MOB_LAYER
+ damage_type = BURN
+ damage = 10
+ knockdown = 20
+ speed = 2
+ range = 16
+ forcedodge = TRUE
+ var/datum/beam/arm
+ var/handedness = 0
+
+/obj/item/projectile/curse_hand/Initialize(mapload)
+ . = ..()
+ handedness = prob(50)
+ update_icon()
+
+/obj/item/projectile/curse_hand/update_icon()
+ icon_state = "[icon_state][handedness]"
+
+/obj/item/projectile/curse_hand/fire(setAngle)
+ if(starting)
+ arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm)
+ ..()
+
+/obj/item/projectile/curse_hand/prehit(atom/target)
+ if(target == original)
+ forcedodge = FALSE
+ else if(!isturf(target))
+ return FALSE
+ return ..()
+
+/obj/item/projectile/curse_hand/Destroy()
+ if(arm)
+ arm.End()
+ arm = null
+ if(forcedodge)
+ playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
+ var/turf/T = get_step(src, dir)
+ new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness)
+ for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
+ qdel(G)
+ new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
+ var/datum/beam/D = starting.Beam(T, icon_state = "curse[handedness]", time = 32, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm, beam_sleep_time = 1)
+ for(var/b in D.elements)
+ var/obj/effect/ebeam/B = b
+ animate(B, alpha = 0, time = 32)
+ return ..()
+
diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm
new file mode 100644
index 0000000000..295f89148a
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/floral.dm
@@ -0,0 +1,25 @@
+/obj/item/projectile/energy/floramut
+ name = "alpha somatoray"
+ icon_state = "energy"
+ damage = 0
+ damage_type = TOX
+ nodamage = 1
+ flag = "energy"
+
+/obj/item/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(C.dna.species.id == "pod")
+ C.randmuti()
+ C.randmut()
+ C.updateappearance()
+ C.domutcheck()
+
+/obj/item/projectile/energy/florayield
+ name = "beta somatoray"
+ icon_state = "energy2"
+ damage = 0
+ damage_type = TOX
+ nodamage = 1
+ flag = "energy"
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
new file mode 100644
index 0000000000..89f753d36d
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -0,0 +1,90 @@
+/obj/item/projectile/gravityrepulse
+ name = "repulsion bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#33CCFF"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravityrepulse/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravityrepulse/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravityrepulse/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
+ A.throw_at(throwtarget,power+1,1)
+ thrown_items[A] = A
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravityattract
+ name = "attraction bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#FF6600"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravityattract/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravityattract/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravityattract/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ A.throw_at(T, power+1, 1)
+ thrown_items[A] = A
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravitychaos
+ name = "gravitational blast"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ color = "#101010"
+ var/turf/T
+ var/power = 4
+ var/list/thrown_items = list()
+
+/obj/item/projectile/gravitychaos/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravitychaos/C = loc
+ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
+ power = min(C.gun.power, 15)
+
+/obj/item/projectile/gravitychaos/on_hit()
+ . = ..()
+ T = get_turf(src)
+ for(var/atom/movable/A in range(T, power))
+ if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
+ continue
+ A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
+ thrown_items[A] = A
+ for(var/turf/Z in range(T,power))
+ new /obj/effect/temp_visual/gravpush(Z)
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
new file mode 100644
index 0000000000..e158ed89f0
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -0,0 +1,230 @@
+/obj/item/projectile/hallucination
+ name = "bullet"
+ icon = null
+ icon_state = null
+ hitsound = ""
+ suppressed = TRUE
+ ricochets_max = 0
+ ricochet_chance = 0
+ damage = 0
+ nodamage = TRUE
+ projectile_type = /obj/item/projectile/hallucination
+ log_override = TRUE
+ var/hal_icon_state
+ var/image/fake_icon
+ var/mob/living/carbon/hal_target
+ var/hal_fire_sound
+ var/hal_hitsound
+ var/hal_hitsound_wall
+ var/hal_impact_effect
+ var/hal_impact_effect_wall
+ var/hit_duration
+ var/hit_duration_wall
+
+/obj/item/projectile/hallucination/fire()
+ ..()
+ fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER)
+ if(hal_target.client)
+ hal_target.client.images += fake_icon
+
+/obj/item/projectile/hallucination/Destroy()
+ if(hal_target.client)
+ hal_target.client.images -= fake_icon
+ QDEL_NULL(fake_icon)
+ return ..()
+
+/obj/item/projectile/hallucination/Collide(atom/A)
+ if(!ismob(A))
+ if(hal_hitsound_wall)
+ hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1)
+ if(hal_impact_effect_wall)
+ spawn_hit(A, TRUE)
+ else if(A == hal_target)
+ if(hal_hitsound)
+ hal_target.playsound_local(A, hal_hitsound, 100, 1)
+ target_on_hit(A)
+ qdel(src)
+ return TRUE
+
+/obj/item/projectile/hallucination/proc/target_on_hit(mob/M)
+ if(M == hal_target)
+ to_chat(hal_target, "[M] is hit by \a [src] in the chest!")
+ hal_apply_effect()
+ else if(M in view(hal_target))
+ to_chat(hal_target, "[M] is hit by \a [src] in the chest!!")
+ if(damage_type == BRUTE)
+ var/splatter_dir = dir
+ if(starting)
+ splatter_dir = get_dir(starting, get_turf(M))
+ spawn_blood(M, splatter_dir)
+ else if(hal_impact_effect)
+ spawn_hit(M, FALSE)
+
+/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir)
+ set waitfor = 0
+ if(!hal_target.client)
+ return
+
+ var/splatter_icon_state
+ if(set_dir in GLOB.diagonals)
+ splatter_icon_state = "splatter[pick(1, 2, 6)]"
+ else
+ splatter_icon_state = "splatter[pick(3, 4, 5)]"
+
+ var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER)
+ var/target_pixel_x = 0
+ var/target_pixel_y = 0
+ switch(set_dir)
+ if(NORTH)
+ target_pixel_y = 16
+ if(SOUTH)
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(EAST)
+ target_pixel_x = 16
+ if(WEST)
+ target_pixel_x = -16
+ if(NORTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = 16
+ if(NORTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = 16
+ if(SOUTHEAST)
+ target_pixel_x = 16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ if(SOUTHWEST)
+ target_pixel_x = -16
+ target_pixel_y = -16
+ layer = ABOVE_MOB_LAYER
+ hal_target.client.images += blood
+ animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
+ addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
+
+/obj/item/projectile/hallucination/proc/cleanup_blood(image/blood)
+ hal_target.client.images -= blood
+ qdel(blood)
+
+/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall)
+ set waitfor = 0
+ if(!hal_target.client)
+ return
+
+ var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER)
+ hit_effect.pixel_x = A.pixel_x + rand(-4,4)
+ hit_effect.pixel_y = A.pixel_y + rand(-4,4)
+ hal_target.client.images += hit_effect
+ sleep(is_wall ? hit_duration_wall : hit_duration)
+ hal_target.client.images -= hit_effect
+ qdel(hit_effect)
+
+
+/obj/item/projectile/hallucination/proc/hal_apply_effect()
+ return
+
+/obj/item/projectile/hallucination/bullet
+ name = "bullet"
+ hal_icon_state = "bullet"
+ hal_fire_sound = "gunshot"
+ hal_hitsound = 'sound/weapons/pierce.ogg'
+ hal_hitsound_wall = "ricochet"
+ hal_impact_effect = "impact_bullet"
+ hal_impact_effect_wall = "impact_bullet"
+ hit_duration = 5
+ hit_duration_wall = 5
+
+/obj/item/projectile/hallucination/bullet/hal_apply_effect()
+ hal_target.adjustStaminaLoss(60)
+
+/obj/item/projectile/hallucination/laser
+ name = "laser"
+ damage_type = BURN
+ hal_icon_state = "laser"
+ hal_fire_sound = 'sound/weapons/laser.ogg'
+ hal_hitsound = 'sound/weapons/sear.ogg'
+ hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hal_impact_effect = "impact_laser"
+ hal_impact_effect_wall = "impact_laser_wall"
+ hit_duration = 4
+ hit_duration_wall = 10
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+
+/obj/item/projectile/hallucination/laser/hal_apply_effect()
+ hal_target.adjustStaminaLoss(20)
+ hal_target.blur_eyes(2)
+
+/obj/item/projectile/hallucination/taser
+ name = "electrode"
+ damage_type = BURN
+ hal_icon_state = "spark"
+ color = "#FFFF00"
+ hal_fire_sound = 'sound/weapons/taser.ogg'
+ hal_hitsound = 'sound/weapons/taserhit.ogg'
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/taser/hal_apply_effect()
+ hal_target.Knockdown(100)
+ hal_target.stuttering += 20
+ if(hal_target.dna && hal_target.dna.check_mutation(HULK))
+ hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE))
+ addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
+
+/obj/item/projectile/hallucination/disabler
+ name = "disabler beam"
+ damage_type = STAMINA
+ hal_icon_state = "omnilaser"
+ hal_fire_sound = 'sound/weapons/taser2.ogg'
+ hal_hitsound = 'sound/weapons/tap.ogg'
+ hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hal_impact_effect = "impact_laser_blue"
+ hal_impact_effect_wall = null
+ hit_duration = 4
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+
+/obj/item/projectile/hallucination/disabler/hal_apply_effect()
+ hal_target.adjustStaminaLoss(25)
+
+/obj/item/projectile/hallucination/ebow
+ name = "bolt"
+ damage_type = TOX
+ hal_icon_state = "cbbolt"
+ hal_fire_sound = 'sound/weapons/genhit.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/ebow/hal_apply_effect()
+ hal_target.Knockdown(100)
+ hal_target.stuttering += 5
+ hal_target.adjustStaminaLoss(8)
+
+/obj/item/projectile/hallucination/change
+ name = "bolt of change"
+ damage_type = BURN
+ hal_icon_state = "ice_1"
+ hal_fire_sound = 'sound/magic/staff_change.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/change/hal_apply_effect()
+ new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE)
+
+/obj/item/projectile/hallucination/death
+ name = "bolt of death"
+ damage_type = BURN
+ hal_icon_state = "pulse1_bl"
+ hal_fire_sound = 'sound/magic/wandodeath.ogg'
+ hal_hitsound = null
+ hal_hitsound_wall = null
+ hal_impact_effect = null
+ hal_impact_effect_wall = null
+
+/obj/item/projectile/hallucination/death/hal_apply_effect()
+ new /datum/hallucination/death(hal_target, TRUE)
diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm
new file mode 100644
index 0000000000..403a1bedd7
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/ion.dm
@@ -0,0 +1,20 @@
+/obj/item/projectile/ion
+ name = "ion bolt"
+ icon_state = "ion"
+ damage = 0
+ damage_type = BURN
+ nodamage = 1
+ flag = "energy"
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
+
+/obj/item/projectile/ion/on_hit(atom/target, blocked = FALSE)
+ ..()
+ empulse(target, 1, 1)
+ return TRUE
+
+/obj/item/projectile/ion/weak
+
+/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = FALSE)
+ ..()
+ empulse(target, 0, 0)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm
new file mode 100644
index 0000000000..f4e60998e1
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/meteor.dm
@@ -0,0 +1,19 @@
+/obj/item/projectile/meteor
+ name = "meteor"
+ icon = 'icons/obj/meteor.dmi'
+ icon_state = "small1"
+ damage = 0
+ damage_type = BRUTE
+ nodamage = 1
+ flag = "bullet"
+
+/obj/item/projectile/meteor/Collide(atom/A)
+ if(A == firer)
+ forceMove(A.loc)
+ return
+ A.ex_act(EXPLODE_HEAVY)
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
+ for(var/mob/M in urange(10, src))
+ if(!M.stat)
+ shake_camera(M, 3, 1)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm
new file mode 100644
index 0000000000..eaa998f7e0
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/mindflayer.dm
@@ -0,0 +1,9 @@
+/obj/item/projectile/beam/mindflayer
+ name = "flayer ray"
+
+/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(ishuman(target))
+ var/mob/living/carbon/human/M = target
+ M.adjustBrainLoss(20)
+ M.hallucination += 20
diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm
new file mode 100644
index 0000000000..46027e7bdf
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/neurotoxin.dm
@@ -0,0 +1,12 @@
+/obj/item/projectile/bullet/neurotoxin
+ name = "neurotoxin spit"
+ icon_state = "neurotoxin"
+ damage = 5
+ damage_type = TOX
+ knockdown = 100
+
+/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
+ if(isalien(target))
+ knockdown = 0
+ nodamage = TRUE
+ return ..()
diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm
new file mode 100644
index 0000000000..aeafb6157a
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/plasma.dm
@@ -0,0 +1,49 @@
+/obj/item/projectile/plasma
+ name = "plasma blast"
+ icon_state = "plasmacutter"
+ damage_type = BRUTE
+ damage = 20
+ range = 4
+ dismemberment = 20
+ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
+ var/pressure_decrease_active = FALSE
+ var/pressure_decrease = 0.25
+ var/mine_range = 3 //mines this many additional tiles of rock
+ tracer_type = /obj/effect/projectile/tracer/plasma_cutter
+ muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter
+ impact_type = /obj/effect/projectile/impact/plasma_cutter
+
+/obj/item/projectile/plasma/Initialize()
+ . = ..()
+ if(!lavaland_equipment_pressure_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+
+/obj/item/projectile/plasma/on_hit(atom/target)
+ . = ..()
+ if(ismineralturf(target))
+ var/turf/closed/mineral/M = target
+ M.gets_drilled(firer)
+ if(mine_range)
+ mine_range--
+ range++
+ if(range > 0)
+ return -1
+
+/obj/item/projectile/plasma/adv
+ damage = 28
+ range = 5
+ mine_range = 5
+
+/obj/item/projectile/plasma/adv/mech
+ damage = 40
+ range = 9
+ mine_range = 3
+
+/obj/item/projectile/plasma/turret
+ //Between normal and advanced for damage, made a beam so not the turret does not destroy glass
+ name = "plasma beam"
+ damage = 24
+ range = 7
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
new file mode 100644
index 0000000000..6518b2a4d5
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -0,0 +1,45 @@
+/obj/item/projectile/bullet/gyro
+ name ="explosive bolt"
+ icon_state= "bolter"
+ damage = 50
+
+/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 2)
+ return TRUE
+
+/obj/item/projectile/bullet/a84mm
+ name ="anti-armour rocket"
+ desc = "USE A WEEL GUN"
+ icon_state= "atrocket"
+ damage = 80
+ var/anti_armour_damage = 200
+ armour_penetration = 100
+ dismemberment = 100
+
+/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
+
+ if(ismecha(target))
+ var/obj/mecha/M = target
+ M.take_damage(anti_armour_damage)
+ if(issilicon(target))
+ var/mob/living/silicon/S = target
+ S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
+ return TRUE
+
+/obj/item/projectile/bullet/srmrocket
+ name ="SRM-8 Rocket"
+ desc = "Boom."
+ icon_state = "missile"
+ damage = 30
+ ricochets_max = 0 //it's a MISSILE
+
+/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
+ ..()
+ if(!isliving(target)) //if the target isn't alive, so is a wall or something
+ explosion(target, 0, 1, 2, 4)
+ else
+ explosion(target, 0, 0, 2, 4)
+ return TRUE
diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm
new file mode 100644
index 0000000000..7fb9c6efb2
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/temperature.dm
@@ -0,0 +1,19 @@
+/obj/item/projectile/temp
+ name = "freeze beam"
+ icon_state = "ice_2"
+ damage = 0
+ damage_type = BURN
+ nodamage = FALSE
+ flag = "energy"
+ var/temperature = 100
+
+/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)//These two could likely check temp protection on the mob
+ ..()
+ if(isliving(target))
+ var/mob/M = target
+ M.bodytemperature = temperature
+ return TRUE
+
+/obj/item/projectile/temp/hot
+ name = "heat beam"
+ temperature = 400
diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm
new file mode 100644
index 0000000000..94ef5b9a23
--- /dev/null
+++ b/code/modules/projectiles/projectile/special/wormhole.dm
@@ -0,0 +1,25 @@
+/obj/item/projectile/beam/wormhole
+ name = "bluespace beam"
+ icon_state = "spark"
+ hitsound = "sparks"
+ damage = 3
+ var/obj/item/gun/energy/wormhole_projector/gun
+ color = "#33CCFF"
+
+/obj/item/projectile/beam/wormhole/orange
+ name = "orange bluespace beam"
+ color = "#FF6600"
+
+/obj/item/projectile/beam/wormhole/Initialize(mapload, obj/item/ammo_casing/energy/wormhole/casing)
+ . = ..()
+ if(casing)
+ gun = casing.gun
+
+/obj/item/projectile/beam/wormhole/on_hit(atom/target)
+ if(ismob(target))
+ var/turf/portal_destination = pick(orange(6, src))
+ do_teleport(target, portal_destination)
+ return ..()
+ if(!gun)
+ qdel(src)
+ gun.create_portal(src, get_turf(src))
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 0f3ac0e1bc..5735463af2 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -251,7 +251,7 @@
R.handle_reactions()
return amount
-/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0)
+/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE)
var/list/cached_reagents = reagent_list
var/list/cached_addictions = addiction_list
if(C)
@@ -261,6 +261,8 @@
var/datum/reagent/R = reagent
if(QDELETED(R.holder))
continue
+ if(liverless && !R.self_consuming) //need to be metabolized
+ continue
if(!C)
C = R.holder.my_atom
if(C && R)
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index b14d436df5..00a3f0effd 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -57,7 +57,7 @@
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/A = D
var/disease_name = SSdisease.get_disease_name(A.GetDiseaseID())
- if(disease_name == "Unknown")
+ if(disease_name == "Unknown" && A.mutable)
this["can_rename"] = TRUE
this["name"] = disease_name
this["is_adv"] = TRUE
@@ -180,17 +180,21 @@
if("rename_disease")
var/id = get_virus_id_by_index(text2num(params["index"]))
var/datum/disease/advance/A = SSdisease.archive_diseases[id]
+ if(!A.mutable)
+ return
if(A)
var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN)
if(!new_name || ..())
return
A.AssignName(new_name)
- for(var/datum/disease/advance/AD in SSdisease.active_diseases)
- AD.Refresh()
. = TRUE
if("create_culture_bottle")
var/id = get_virus_id_by_index(text2num(params["index"]))
- var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id])
+ var/datum/disease/advance/A = SSdisease.archive_diseases[id]
+ if(!A.mutable)
+ to_chat(usr, "ERROR: Cannot replicate virus strain.")
+ return
+ A = A.Copy()
var/list/data = list("viruses" = list(A))
var/obj/item/reagent_containers/glass/bottle/B = new(drop_location())
B.name = "[A.name] culture bottle"
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 4ca1efa4e7..70bb594c8b 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -31,6 +31,7 @@
var/addiction_threshold = 0
var/addiction_stage = 0
var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick.
+ var/self_consuming = FALSE
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 2552bb7c8d..2f7f9eaa08 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -60,9 +60,9 @@
M.SetSleeping(0, 0)
M.jitteriness = 0
M.cure_all_traumas(TRUE, TRAUMA_RESILIENCE_MAGIC)
- for(var/thing in M.viruses)
+ for(var/thing in M.diseases)
var/datum/disease/D = thing
- if(D.severity == VIRUS_SEVERITY_POSITIVE)
+ if(D.severity == DISEASE_SEVERITY_POSITIVE)
continue
D.cure()
..()
@@ -1192,6 +1192,7 @@
id = "corazone"
description = "A medication used to treat pain, fever, and inflammation, along with heart attacks."
color = "#F5F5F5"
+ self_consuming = TRUE
/datum/reagent/medicine/muscle_stimulant
name = "Muscle Stimulant"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 75b4552a58..1ecf22627a 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -16,13 +16,15 @@
for(var/thing in data["viruses"])
var/datum/disease/D = thing
- if((D.spread_flags & VIRUS_SPREAD_SPECIAL) || (D.spread_flags & VIRUS_SPREAD_NON_CONTAGIOUS))
+ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
- if((method == TOUCH || method == VAPOR) && (D.spread_flags & VIRUS_SPREAD_CONTACT_FLUIDS))
- M.ContactContractDisease(D)
- else //ingest, patch or inject
- M.ForceContractDisease(D)
+ if(isliving(M))
+ var/mob/living/L = M
+ if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ L.ContactContractDisease(D)
+ else //ingest, patch or inject
+ L.ForceContractDisease(D)
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -97,12 +99,15 @@
taste_description = "slime"
/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(islist(data) && (method == INGEST || method == INJECT))
- for(var/thing in M.viruses)
+ for(var/thing in L.diseases)
var/datum/disease/D = thing
if(D.GetDiseaseID() in data)
D.cure()
- M.resistances |= data
+ L.disease_resistances |= data
/datum/reagent/vaccine/on_merge(list/data)
if(istype(data))
@@ -623,8 +628,11 @@
taste_description = "slime"
/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method != TOUCH)
- M.ForceContractDisease(new /datum/disease/transformation/slime(0))
+ L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
/datum/reagent/gluttonytoxin
name = "Gluttony's Blessing"
@@ -635,7 +643,10 @@
taste_description = "decay"
/datum/reagent/gluttonytoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
- M.ForceContractDisease(new /datum/disease/transformation/morph(0))
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
+ L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE)
/datum/reagent/serotrotium
name = "Serotrotium"
@@ -1103,8 +1114,11 @@
taste_description = "sludge"
/datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/transformation/robot(0))
+ L.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE)
/datum/reagent/xenomicrobes
name = "Xenomicrobes"
@@ -1115,8 +1129,11 @@
taste_description = "sludge"
/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/transformation/xeno(0))
+ L.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE)
/datum/reagent/fungalspores
name = "Tubercle bacillus Cosmosis microbes"
@@ -1127,8 +1144,11 @@
taste_description = "slime"
/datum/reagent/fungalspores/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+ if(!isliving(M))
+ return
+ var/mob/living/L = M
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
- M.ForceContractDisease(new /datum/disease/tuberculosis(0))
+ L.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE)
/datum/reagent/fluorosurfactant//foam precursor
name = "Fluorosurfactant"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 531c3b4257..e77d87c5b6 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -100,16 +100,14 @@
/datum/reagent/toxin/lexorin/on_mob_life(mob/living/M)
. = TRUE
- var/mob/living/carbon/C
- if(iscarbon(M))
- C = M
- CHECK_DNA_AND_SPECIES(C)
- if(NOBREATH in C.dna.species.species_traits)
- . = FALSE
+
+ if(M.has_trait(TRAIT_NOBREATH))
+ . = FALSE
if(.)
M.adjustOxyLoss(5, 0)
- if(C)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
C.losebreath += 2
if(prob(20))
M.emote("gasp")
@@ -810,6 +808,7 @@
toxpwr = 1
var/acidpwr = 10 //the amount of protection removed from the armour
taste_description = "acid"
+ self_consuming = TRUE
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index d6213a391b..054fe077c3 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -18,7 +18,7 @@
volume = vol
create_reagents(volume)
if(spawned_disease)
- var/datum/disease/F = new spawned_disease(0)
+ var/datum/disease/F = new spawned_disease()
var/list/data = list("viruses"= list(F))
reagents.add_reagent("blood", disease_amount, data)
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 019508778b..2fc41e1638 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -129,7 +129,7 @@
display_name = "Basic Bluespace Theory"
description = "Basic studies into the mysterious alternate dimension known as bluespace."
prereq_ids = list("base")
- design_ids = list("beacon", "xenobioconsole")
+ design_ids = list("beacon") //CIT CHANGE removed xenobioconsole from here.
research_cost = 2500
export_price = 5000
@@ -148,7 +148,7 @@
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick")
+ design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning", "roastingstick", "xenobioconsole") //CIT CHANGE added xenobioconsole here
research_cost = 5000
export_price = 5000
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index e8937b5dae..f240e0b6af 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -350,7 +350,7 @@
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
to_chat(user, "You feel something wrong inside you...")
- user.ForceContractDisease(new /datum/disease/transformation/slime(0))
+ user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
return 100
if(SLIME_ACTIVATE_MAJOR)
diff --git a/code/modules/ruins/spaceruin_code/cloning_lab.dm b/code/modules/ruins/spaceruin_code/cloning_lab.dm
new file mode 100644
index 0000000000..1e372f1fa4
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/cloning_lab.dm
@@ -0,0 +1,35 @@
+/obj/item/paper/fluff/ruins/exp_cloning/manual
+ name = "paper - 'H-11 Cloning Apparatus Manual"
+ info = {"Getting Started
+ Congratulations, you are testing the H-11 experimental cloning device!
+ Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!
+ That's all there is to it!
+ Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
+ The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds.
+ The cloning pod may be unlocked early after initial maturation is complete.
+ Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.
+ Clones may also experience memory loss and radical changes in personality as a result of the cloning process.
+
+ This technology produced under license from Thinktronic Systems, LTD."}
+
+/obj/item/paper/fluff/ruins/exp_cloning/log
+ name = "experiment log"
+ info = {"Day 1
+ We are very excited to be part of the first crew of the SC Irmanda!
+ This ship is made to test an innovative FTL technology. I had some concerns at first, \
+ but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.
+ We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \
+ If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!
+
+ Day 2
+ We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \
+ but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.
+ We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \
+ the previous models. We will run further tests to see if there are improvements.
+ Day 4
+ It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \
+ and give them something to talk about. Hopefully this will end up with increased funding...
+ The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \
+ without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway.
+
+ Professor Galen Linkovich"}
\ No newline at end of file
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 997c83249a..6980cba8e2 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -69,7 +69,7 @@
P.preparePixelProjectile(target, user)
for(var/V in projectile_var_overrides)
if(P.vars[V])
- P.vars[V] = projectile_var_overrides[V]
+ P.vv_edit_var(V, projectile_var_overrides[V])
P.fire()
return TRUE
diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm
index 306c3fcef6..18bfb54935 100644
--- a/code/modules/spells/spell_types/conjure.dm
+++ b/code/modules/spells/spell_types/conjure.dm
@@ -36,8 +36,8 @@
var/atom/summoned_object = new summoned_object_type(spawn_place)
for(var/varName in newVars)
- if(varName in summoned_object.vars)
- summoned_object.vars[varName] = newVars[varName]
+ if(varName in newVars)
+ summoned_object.vv_edit_var(varName, newVars[varName])
summoned_object.admin_spawned = TRUE
if(summon_lifespan)
QDEL_IN(summoned_object, summon_lifespan)
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index ae78123a26..a43e435977 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -256,24 +256,25 @@
var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS]
L.tox_breath_dam_min = 0
L.tox_breath_dam_max = 0
- S.species_traits |= VIRUSIMMUNE
+ H.add_trait(TRAIT_VIRUSIMMUNE, "dna_vault")
if(VAULT_NOBREATH)
to_chat(H, "Your lungs feel great.")
- S.species_traits |= NOBREATH
+ H.add_trait(TRAIT_NOBREATH, "dna_vault")
if(VAULT_FIREPROOF)
to_chat(H, "You feel fireproof.")
S.burnmod = 0.5
- S.heatmod = 0
+ H.add_trait(TRAIT_RESISTHEAT, "dna_vault")
+ H.add_trait(TRAIT_NOFIRE, "dna_vault")
if(VAULT_STUNTIME)
to_chat(H, "Nothing can keep you down for long.")
S.stunmod = 0.5
if(VAULT_ARMOUR)
to_chat(H, "You feel tough.")
S.armor = 30
-
+ H.add_trait(TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "Your legs feel faster.")
- S.speedmod = -1
+ H.add_trait(TRAIT_GOTTAGOFAST, "dna_vault")
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
H.next_move_modifier = 0.5
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index f661373acd..da42e4fdb9 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -17,7 +17,7 @@
/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
- if(!LAZYLEN(target.viruses))
+ if(!LAZYLEN(target.diseases))
return FALSE
return TRUE
@@ -38,7 +38,7 @@
/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.")
- for(var/X in target.viruses)
+ for(var/X in target.diseases)
var/datum/disease/D = X
D.carrier = TRUE
return TRUE
\ No newline at end of file
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index c178d7f72f..133c22510e 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -62,7 +62,7 @@
/obj/item/bodypart/attack(mob/living/carbon/C, mob/user)
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(EASYLIMBATTACHMENT in H.dna.species.species_traits)
+ if(C.has_trait(TRAIT_LIMBATTACHMENT))
if(!H.get_bodypart(body_zone) && !animal_origin)
if(H == user)
H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 10f2d182fe..7af437ae86 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -6,16 +6,14 @@
//Dismember a limb
/obj/item/bodypart/proc/dismember(dam_type = BRUTE)
if(!owner)
- return 0
+ return FALSE
var/mob/living/carbon/C = owner
if(!dismemberable)
- return 0
+ return FALSE
if(C.status_flags & GODMODE)
- return 0
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment
- return 0
+ return FALSE
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return FALSE
var/obj/item/bodypart/affecting = C.get_bodypart("chest")
affecting.receive_damage(CLAMP(brute_dam/2, 15, 50), CLAMP(burn_dam/2, 0, 50)) //Damage the chest based on limb's existing damage
@@ -46,14 +44,12 @@
/obj/item/bodypart/chest/dismember()
if(!owner)
- return 0
+ return FALSE
var/mob/living/carbon/C = owner
if(!dismemberable)
- return 0
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(NODISMEMBER in H.dna.species.species_traits) // species don't allow dismemberment
- return 0
+ return FALSE
+ if(C.has_trait(TRAIT_NODISMEMBER))
+ return FALSE
var/organ_spilled = 0
var/turf/T = get_turf(C)
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index 35a2d851e3..4494148082 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -14,7 +14,7 @@
name = "appendix"
/obj/item/organ/appendix/Remove(mob/living/carbon/M, special = 0)
- for(var/datum/disease/appendicitis/A in M.viruses)
+ for(var/datum/disease/appendicitis/A in M.diseases)
A.cure()
inflamed = 1
update_icon()
@@ -23,7 +23,7 @@
/obj/item/organ/appendix/Insert(mob/living/carbon/M, special = 0)
..()
if(inflamed)
- M.AddDisease(new /datum/disease/appendicitis)
+ M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE)
/obj/item/organ/appendix/prepare_eat()
var/obj/S = ..()
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index f492d99b8e..737ffbe6e8 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -68,17 +68,15 @@
/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
if((H.status_flags & GODMODE))
return
-
- var/species_traits = list()
- if(H && H.dna && H.dna.species && H.dna.species.species_traits)
- species_traits = H.dna.species.species_traits
+ if(H.has_trait(TRAIT_NOBREATH))
+ return
if(!breath || (breath.total_moles() == 0))
if(H.reagents.has_reagent(crit_stabilizing_reagent))
return
if(H.health >= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- else if(!(NOCRITDAMAGE in species_traits))
+ else if(!H.has_trait(TRAIT_NOCRITDAMAGE))
H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
H.failed_last_breath = TRUE
@@ -313,11 +311,7 @@
/obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
var/breath_temperature = breath.temperature
- var/species_traits = list()
- if(H && H.dna && H.dna.species && H.dna.species.species_traits)
- species_traits = H.dna.species.species_traits
-
- if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
+ if(!H.has_trait(TRAIT_RESISTCOLD)) // COLD DAMAGE
var/cold_modifier = H.dna.species.coldmod
if(breath_temperature < cold_level_3_threshold)
H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type)
@@ -329,7 +323,7 @@
if(prob(20))
to_chat(H, "You feel [cold_message] in your [name]!")
- if(!(RESISTHOT in species_traits)) // HEAT DAMAGE
+ if(!H.has_trait(TRAIT_RESISTHEAT)) // HEAT DAMAGE
var/heat_modifier = H.dna.species.heatmod
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index fcaf89c61c..fe613af015 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -110,7 +110,7 @@
var/breathes = TRUE
var/blooded = TRUE
if(dna && dna.species)
- if(NOBREATH in dna.species.species_traits)
+ if(has_trait(TRAIT_NOBREATH, SPECIES_TRAIT))
breathes = FALSE
if(NOBLOOD in dna.species.species_traits)
blooded = FALSE
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 47d35108a1..862991c4b8 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -1,7 +1,8 @@
//include unit test files in this module in this ifdef
-
+// CITADEL EDIT add vore_tests.dm
#ifdef UNIT_TESTS
#include "unit_test.dm"
#include "reagent_recipe_collisions.dm"
#include "reagent_id_typos.dm"
+//#include "vore_tests.dm"
#endif
diff --git a/code/modules/unit_tests/vore_tests.dm b/code/modules/unit_tests/vore_tests.dm
new file mode 100644
index 0000000000..6549aa9ce7
--- /dev/null
+++ b/code/modules/unit_tests/vore_tests.dm
@@ -0,0 +1,218 @@
+/datum/unit_test
+ var/static/default_mobloc = null
+
+/datum/unit_test/proc/create_test_mob(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human, var/with_mind = FALSE)
+ if(isnull(mobloc))
+ if(!default_mobloc)
+ for(var/turf/simulated/floor/tiled/T in world)
+ var/pressure = T.zone.air.return_pressure()
+ if(90 < pressure && pressure < 120) // Find a turf between 90 and 120
+ default_mobloc = T
+ break
+ mobloc = default_mobloc
+ if(!mobloc)
+ Fail("Unable to find a location to create test mob")
+ return FALSE
+
+ var/mob/living/carbon/human/H = new mobtype(mobloc)
+
+ if(with_mind)
+ H.mind_initialize("TestKey[rand(0,10000)]")
+
+ return H
+
+/datum/unit_test/space_suffocation
+ name = "MOB: human mob suffocates in space"
+
+ var/startOxyloss
+ var/endOxyloss
+ var/mob/living/carbon/human/H
+ async = 1
+
+/datum/unit_test/space_suffocation/Run()
+ var/turf/open/space/T = locate()
+
+ H = new(T)
+ startOxyloss = H.getOxyLoss()
+
+ return 1
+
+/datum/unit_test/space_suffocation/check_result()
+ if(H.life_tick < 10)
+ return 0
+
+ endOxyloss = H.getOxyLoss()
+
+ if(!startOxyloss < endOxyloss)
+ Fail("Human mob is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])")
+
+ qdel(H)
+ return 1
+
+/datum/unit_test/belly_nonsuffocation
+ name = "MOB: human mob does not suffocate in a belly"
+ var/startLifeTick
+ var/startOxyloss
+ var/endOxyloss
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_nonsuffocation/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_nonsuffocation/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ startLifeTick = pred.life_tick
+ startOxyloss = prey.getOxyLoss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait for them to breathe a few times
+
+ // Alright lets check it!
+ endOxyloss = prey.getOxyLoss()
+ if(startOxyloss < endOxyloss)
+ Fail("Prey takes oxygen damage in a pred's belly! (Before: [startOxyloss]; after: [endOxyloss])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
+////////////////////////////////////////////////////////////////
+/datum/unit_test/belly_spacesafe
+ name = "MOB: human mob protected from space in a belly"
+ var/startLifeTick
+ var/startOxyloss
+ var/startBruteloss
+ var/endOxyloss
+ var/endBruteloss
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_spacesafe/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_spacesafe/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+ else
+ var/turf/T = locate(/turf/open/space)
+ if(!T)
+ Fail("could not find a space turf for testing")
+ return TRUE
+ else
+ pred.forceMove(T)
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ startLifeTick = pred.life_tick
+ startOxyloss = prey.getOxyLoss()
+ startBruteloss = prey.getBruteloss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait for them to breathe a few times
+
+ // Alright lets check it!
+ endOxyloss = prey.getOxyLoss()
+ endBruteloss = prey.getBruteLoss()
+ if(startBruteloss < endBruteloss)
+ Fail("Prey takes brute damage in space! (Before: [startBruteloss]; after: [endBruteloss])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
+////////////////////////////////////////////////////////////////
+/datum/unit_test/belly_damage
+ name = "MOB: human mob takes damage from digestion"
+ var/startLifeTick
+ var/startBruteBurn
+ var/endBruteBurn
+ var/mob/living/carbon/human/pred
+ var/mob/living/carbon/human/prey
+
+/datum/unit_test/belly_damage/Run()
+ pred = create_test_mob()
+ if(!istype(pred))
+ return FALSE
+ prey = create_test_mob(pred.loc)
+ if(!istype(prey))
+ return FALSE
+
+ return TRUE
+
+/datum/unit_test/belly_damage/check_result()
+ // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
+ if(!pred.vore_organs || !pred.vore_organs.len)
+ return FALSE
+
+ // Now that pred belly exists, we can eat the prey.
+ if(!pred.vore_selected)
+ Fail("[pred] has no vore_selected.")
+ return TRUE
+
+ // Attempt to eat the prey
+ if(prey.loc != pred.vore_selected)
+ pred.vore_selected.nom_mob(prey)
+
+ if(prey.loc != pred.vore_selected)
+ Fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
+ return TRUE
+
+ // Okay, we succeeded in eating them, now lets wait a bit
+ pred.vore_selected.digest_mode = DM_DIGEST
+ startLifeTick = pred.life_tick
+ startBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
+ return FALSE
+
+ if(pred.life_tick < (startLifeTick + 10))
+ return FALSE // Wait a few ticks for damage to happen
+
+ // Alright lets check it!
+ endBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
+ if(startBruteBurn >= endBruteBurn)
+ Fail("Prey doesn't take damage in digesting belly! (Before: [startBruteBurn]; after: [endBruteBurn])")
+ qdel(prey)
+ qdel(pred)
+ return TRUE
diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm
deleted file mode 100644
index d175f51e02..0000000000
--- a/code/modules/vore/eating/belly_vr.dm
+++ /dev/null
@@ -1,467 +0,0 @@
-//
-// The belly object is what holds onto a mob while they're inside a predator.
-// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
-//
-
-// If you change what variables are on this, then you need to update the copy() proc.
-
-//
-// Parent type of all the various "belly" varieties.
-//
-/datum/belly
- var/name // Name of this location
- var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
- var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
- var/vore_verb = "ingest" // Verb for eating with this in messages
- var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human
- var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else
- var/emoteTime = 30 SECONDS // How long between stomach emotes at prey
- var/digest_brute = 0 // Brute damage per tick in digestion mode
- var/digest_burn = 1 // Burn damage per tick in digestion mode
- var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on
- var/immutable = FALSE // Prevents this belly from being deleted
- var/escapable = FALSE // Belly can be resisted out of at any time
- var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
- var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
-// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play?
- var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
-
- var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
- var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
- var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
- var/autotransferwait = 10 // Time between trying to transfer.
- var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
-
- var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
- var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
- var/tmp/mob/living/owner // The mob whose belly this is.
- var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
- var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
- var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
- var/swallow_time = 10 SECONDS // for mob transfering automation
- var/vore_capacity = 1 // The capacity (in people) this person can hold
-
- // Don't forget to watch your commas at the end of each line if you change these.
- var/list/struggle_messages_outside = list(
- "%pred's %belly wobbles with a squirming meal.",
- "%pred's %belly jostles with movement.",
- "%pred's %belly briefly swells outward as someone pushes from inside.",
- "%pred's %belly fidgets with a trapped victim.",
- "%pred's %belly jiggles with motion from inside.",
- "%pred's %belly sloshes around.",
- "%pred's %belly gushes softly.",
- "%pred's %belly lets out a wet squelch.")
-
- var/list/struggle_messages_inside = list(
- "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
- "Your struggles only cause %pred's %belly to gush softly around you.",
- "Your movement only causes %pred's %belly to slosh around you.",
- "Your motion causes %pred's %belly to jiggle.",
- "You fidget around inside of %pred's %belly.",
- "You shove against the walls of %pred's %belly, making it briefly swell outward.",
- "You jostle %pred's %belly with movement.",
- "You squirm inside of %pred's %belly, making it wobble around.")
-
- var/list/digest_messages_owner = list(
- "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
- "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
- "Your %belly lets out a rumble as it melts %prey into sludge.",
- "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
- "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
- "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
- "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
- "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
-
- var/list/digest_messages_prey = list(
- "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
- "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
- "%pred's %belly lets out a rumble as it melts you into sludge.",
- "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
- "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
- "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
- "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
- "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
-
- var/list/examine_messages = list(
- "They have something solid in their %belly!",
- "It looks like they have something in their %belly!")
-
- //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
- //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
- //List has indexes that are the digestion mode strings, and keys that are lists of strings.
- var/list/emote_lists = list()
-
-// Constructor that sets the owning mob
-/datum/belly/New(var/mob/living/owning_mob)
- owner = owning_mob
-
-// Toggle digestion on/off and notify user of the new setting.
-// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted.
-/datum/belly/proc/toggle_digestion()
- return
-
-// Checks if any mobs are present inside the belly
-// return True if the belly is empty.
-/datum/belly/proc/is_empty()
- return internal_contents.len == 0
-
-// Release all contents of this belly into the owning mob's location.
-// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
-// Returns the number of mobs so released.
-/datum/belly/proc/release_all_contents()
- if (internal_contents.len == 0)
- return 0
- for (var/atom/movable/M in internal_contents)
- M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- for(var/mob/living/W in M)
- W.stop_sound_channel(CHANNEL_PREYLOOP)
- internal_contents.Remove(M) // Remove from the belly contents
-
- var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
- if(B)
- B.internal_contents.Add(M)
-
- owner.visible_message("[owner] expels everything from their [lowertext(name)]!")
- return TRUE
-
-// Release a specific atom from the contents of this belly into the owning mob's location.
-// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
-// Returns the number of atoms so released.
-/datum/belly/proc/release_specific_contents(var/atom/movable/M)
- if (!(M in internal_contents))
- return FALSE // They weren't in this belly anyway
-
- M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
- for(var/mob/living/W in M)
- W.stop_sound_channel(CHANNEL_PREYLOOP)
- src.internal_contents.Remove(M) // Remove from the belly contents
-
- var/datum/belly/B = check_belly(owner)
- if(B)
- B.internal_contents.Add(M)
-
- owner.visible_message("[owner] expels [M] from their [lowertext(name)]!")
-// owner.regenerate_icons()
- return TRUE
-
-// Actually perform the mechanics of devouring the tasty prey.
-// The purpose of this method is to avoid duplicate code, and ensure that all necessary
-// steps are taken.
-/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user)
- var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
-
- prey.forceMove(owner)
- internal_contents.Add(prey)
- prey.playsound_local(get_turf(prey),preyloop,40,0, channel = CHANNEL_PREYLOOP)
-
- // Handle prey messages
- if(inside_flavor)
- to_chat(prey, "[src.inside_flavor]")
- if(isliving(prey))
- var/mob/living/M = prey
- if(can_taste && M.get_taste_message(0))
- to_chat(owner, "[M] tastes of [M.get_taste_message(0)].")
-
- // Setup the autotransfer checks if needed
- if(transferlocation && autotransferchance > 0)
- addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait)
-
-/datum/belly/proc/check_autotransfer(var/mob/prey)
- // Some sanity checks
- if(transferlocation && (autotransferchance > 0) && (prey in internal_contents))
- if(prob(autotransferchance))
- // Double check transferlocation isn't insane
- if(verify_transferlocation())
- transfer_contents(prey, transferlocation)
- else
- // Didn't transfer, so wait before retrying
- addtimer(CALLBACK(src, /datum/belly/.proc/check_autotransfer, prey), autotransferwait)
-
-/datum/belly/proc/verify_transferlocation()
- for(var/I in owner.vore_organs)
- var/datum/belly/B = owner.vore_organs[I]
- if(B == transferlocation)
- return TRUE
-
- for(var/I in owner.vore_organs)
- var/datum/belly/B = owner.vore_organs[I]
- if(B.name == transferlocation.name)
- transferlocation = B
- return TRUE
- return FALSE
-
-// Get the line that should show up in Examine message if the owner of this belly
-// is examined. By making this a proc, we not only take advantage of polymorphism,
-// but can easily make the message vary based on how many people are inside, etc.
-// Returns a string which shoul be appended to the Examine output.
-/datum/belly/proc/get_examine_msg()
- if(internal_contents.len && examine_messages.len)
- var/formatted_message
- var/raw_message = pick(examine_messages)
-
- formatted_message = replacetext(raw_message,"%belly",lowertext(name))
- formatted_message = replacetext(formatted_message,"%pred",owner)
- formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents))
-
- return("[formatted_message]
")
-
-// The next function gets the messages set on the belly, in human-readable format.
-// This is useful in customization boxes and such. The delimiter right now is \n\n so
-// in message boxes, this looks nice and is easily delimited.
-/datum/belly/proc/get_messages(var/type, var/delim = "\n\n")
- ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
- var/list/raw_messages
-
- switch(type)
- if("smo")
- raw_messages = struggle_messages_outside
- if("smi")
- raw_messages = struggle_messages_inside
- if("dmo")
- raw_messages = digest_messages_owner
- if("dmp")
- raw_messages = digest_messages_prey
- if("em")
- raw_messages = examine_messages
-
- var/messages = list2text(raw_messages,delim)
- return messages
-
-// The next function sets the messages on the belly, from human-readable var
-// replacement strings and linebreaks as delimiters (two \n\n by default).
-// They also sanitize the messages.
-/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
- ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
-
- var/list/raw_list = text2list(html_encode(raw_text),delim)
- if(raw_list.len > 10)
- raw_list.Cut(11)
-
- for(var/i = 1, i <= raw_list.len, i++)
- if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
- raw_list.Cut(i,i)
- else
- raw_list[i] = readd_quotes(raw_list[i])
- //Also fix % sign for var replacement
- raw_list[i] = replacetext(raw_list[i],"%","%")
-
- ASSERT(raw_list.len <= 10) //Sanity
-
- switch(type)
- if("smo")
- struggle_messages_outside = raw_list
- if("smi")
- struggle_messages_inside = raw_list
- if("dmo")
- digest_messages_owner = raw_list
- if("dmp")
- digest_messages_prey = raw_list
- if("em")
- examine_messages = raw_list
-
- return
-
-// Handle the death of a mob via digestion.
-// Called from the process_Life() methods of bellies that digest prey.
-// Default implementation calls M.death() and removes from internal contents.
-// Indigestable items are removed, and M is deleted.
-/datum/belly/proc/digestion_death(var/mob/living/M)
- is_full = TRUE
- internal_contents.Remove(M)
- M.stop_sound_channel(CHANNEL_PREYLOOP)
- // If digested prey is also a pred... anyone inside their bellies gets moved up.
- if(is_vore_predator(M))
- for(var/bellytype in M.vore_organs)
- var/datum/belly/belly = M.vore_organs[bellytype]
- for (var/obj/thing in belly.internal_contents)
- thing.loc = owner
- internal_contents.Add(thing)
- for (var/mob/subprey in belly.internal_contents)
- subprey.loc = owner
- internal_contents.Add(subprey)
- to_chat(subprey, "As [M] melts away around you, you find yourself in [owner]'s [name]")
-
- //Drop all items into the belly
- for(var/obj/item/W in M)
- if(!M.dropItemToGround(W))
- qdel(W)
-
- message_admins("[key_name(owner)] digested [key_name(M)].")
- log_attack("[key_name(owner)] digested [key_name(M)].")
-
- // Delete the digested mob
- qdel(M)
-
-//Handle a mob struggling
-// Called from /mob/living/carbon/relaymove()
-/datum/belly/proc/relay_resist(var/mob/living/R)
- if (!(R in internal_contents))
- return // User is not in this belly, or struggle too soon.
-
- R.setClickCooldown(50)
- var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
-
- if(owner.stat) //If owner is stat (dead, KO) we can actually escape
- to_chat(R, "You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)")
- to_chat(owner, "Someone is attempting to climb out of your [name]!")
-
- if(do_after(R, escapetime, owner))
- if((owner.stat || escapable) && (R in internal_contents)) //Can still escape?
- release_specific_contents(R)
- return
- else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
- return
- else //Belly became inescapable or mob revived
- to_chat(R, "Your attempt to escape [name] has failed!")
- to_chat(owner, "The attempt to escape from your [name] has failed!")
- return
- return
- var/struggle_outer_message = pick(struggle_messages_outside)
- var/struggle_user_message = pick(struggle_messages_inside)
-
- struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
- struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
- struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
-
- struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
- struggle_user_message = replacetext(struggle_user_message,"%prey",R)
- struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
-
- struggle_outer_message = "" + struggle_outer_message + ""
- struggle_user_message = "" + struggle_user_message + ""
-
- R.visible_message( "[struggle_outer_message]", "[struggle_user_message]")
- playsound(get_turf(owner),"struggle_sound",35,0,-6,1,channel=151,ignore_walls = FALSE)
- R.stop_sound_channel(151)
- R.playsound_local(get_turf(R),prey_struggle,45,0)
-
- if(escapable && R.a_intent != "help") //If the stomach has escapable enabled and the person is actually trying to kick out
- to_chat(R, "You attempt to climb out of \the [name].")
- to_chat(owner, "Someone is attempting to climb out of your [name]!")
- if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
- if(do_after(R, escapetime))
- if((escapable) && (R in internal_contents)) //Does the owner still have escapable enabled?
- release_specific_contents(R)
- to_chat(R, "You climb out of \the [name].")
- to_chat(owner, "[R] climbs out of your [name]!")
- for(var/mob/M in viewers(4, owner))
- M.visible_message("[R] climbs out of [owner]'s [name]!", 2)
- return
- else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
- return
- else //Belly became inescapable.
- to_chat(R, "Your attempt to escape [name] has failed!")
- to_chat(owner, "The attempt to escape from your [name] has failed!/span>")
- return
-
- else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
- var/location_ok = verify_transferlocation()
-
- if(!location_ok)
- to_chat(owner, "Something went wrong with your belly transfer settings.")
- transferlocation = null
- return
-
- to_chat(R, "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!")
- to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [name]!")
- transfer_contents(R, transferlocation)
- return
-
- else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
- to_chat(R, "In response to your struggling, \the [name] begins to get more active...")
- to_chat(owner, "You feel your [name] beginning to become active!")
- digest_mode = DM_DIGEST
- return
- else //Nothing interesting happened.
- to_chat(R, "But make no progress in escaping [owner]'s [name].")
- to_chat(owner, "But appears to be unable to make any progress in escaping your [name].")
- return
-
-//Transfers contents from one belly to another
-/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0)
- if(!(content in internal_contents))
- return
- internal_contents.Remove(content)
- // Re-use nom_mob
- target.nom_mob(content, target.owner)
- if(!silent)
- playsound(get_turf(owner),"[target].vore_sound",35,0,-6,1,ignore_walls = FALSE)
-/*
-//Handles creation of temporary 'vore chest' upon digestion
-/datum/belly/proc/slimy_mass(var/obj/item/content, var/mob/living/M)
- if(!content in internal_contents)
- return
- internal_contents += new /obj/structure/closet/crate/vore(src)
- internal_contents.Remove(content)
- M.transferItemToLoc(content, /obj/structure/closet/crate/vore)
- if(!M.transferItemToLoc(W))
- qdel(W)
-
-/datum/belly/proc/regurgitate_items(var/obj/structure/closet/crate/vore/C)
- */
-
-// Belly copies and then returns the copy
-// Needs to be updated for any var changes
-/datum/belly/proc/copy(mob/new_owner)
- var/datum/belly/dupe = new /datum/belly(new_owner)
-
- //// Non-object variables
- dupe.name = name
- dupe.inside_flavor = inside_flavor
- dupe.vore_sound = vore_sound
- dupe.vore_verb = vore_verb
- dupe.human_prey_swallow_time = human_prey_swallow_time
- dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
- dupe.emoteTime = emoteTime
- dupe.digest_brute = digest_brute
- dupe.digest_burn = digest_burn
- dupe.digest_tickrate = digest_tickrate
- dupe.immutable = immutable
- dupe.can_taste = can_taste
- dupe.escapable = escapable
- dupe.escapetime = escapetime
- dupe.digestchance = digestchance
- dupe.escapechance = escapechance
- dupe.transferchance = transferchance
- dupe.transferlocation = transferlocation
- dupe.autotransferchance = autotransferchance
- dupe.autotransferwait = autotransferwait
-
- //// Object-holding variables
- //struggle_messages_outside - strings
- dupe.struggle_messages_outside.Cut()
- for(var/I in struggle_messages_outside)
- dupe.struggle_messages_outside += I
-
- //struggle_messages_inside - strings
- dupe.struggle_messages_inside.Cut()
- for(var/I in struggle_messages_inside)
- dupe.struggle_messages_inside += I
-
- //digest_messages_owner - strings
- dupe.digest_messages_owner.Cut()
- for(var/I in digest_messages_owner)
- dupe.digest_messages_owner += I
-
- //digest_messages_prey - strings
- dupe.digest_messages_prey.Cut()
- for(var/I in digest_messages_prey)
- dupe.digest_messages_prey += I
-
- //examine_messages - strings
- dupe.examine_messages.Cut()
- for(var/I in examine_messages)
- dupe.examine_messages += I
-
- //emote_lists - index: digest mode, key: list of strings
- dupe.emote_lists.Cut()
- for(var/K in emote_lists)
- dupe.emote_lists[K] = list()
- for(var/I in emote_lists[K])
- dupe.emote_lists[K] += I
-
- return dupe
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
deleted file mode 100644
index 3d00f9e0fe..0000000000
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
-// Called from /mob/living/Life() proc.
-/datum/belly/proc/process_Life()
- var/sound/prey_gurgle = sound(get_sfx("digest_prey"))
- var/sound/prey_digest = sound(get_sfx("death_prey"))
-
-/////////////////////////// Auto-Emotes ///////////////////////////
- if((digest_mode in emote_lists) && !emotePend)
- emotePend = TRUE
-
- spawn(emoteTime)
- var/list/EL = emote_lists[digest_mode]
- for(var/mob/living/M in internal_contents)
- M << "[pick(EL)]"
- src.emotePend = FALSE
-
-///////////////////////////// DM_HOLD /////////////////////////////
- if(digest_mode == DM_HOLD)
- return //Pretty boring, huh
-
-//////////////////////////// DM_DIGEST ////////////////////////////
- if(digest_mode == DM_DIGEST)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- //Pref protection!
- if (!M.digestable)
- continue
-
- //Person just died in guts!
- if(M.stat == DEAD)
- var/digest_alert_owner = pick(digest_messages_owner)
- var/digest_alert_prey = pick(digest_messages_prey)
-
- //Replace placeholder vars
- digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
- digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
- digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
-
- digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
- digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
- digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
-
- //Send messages
- to_chat(owner, "[digest_alert_owner]")
- to_chat(M, "[digest_alert_prey]")
- M.visible_message("You watch as [owner]'s form loses its additions.")
-
- owner.nutrition += 400 // so eating dead mobs gives you *something*.
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_digest)
- digestion_death(M)
- owner.update_icons()
- continue
-
-
- // Deal digestion damage (and feed the pred)
- if(!(M.status_flags & GODMODE))
- M.adjustFireLoss(digest_burn)
- owner.nutrition += 1
- return
-
-///////////////////////////// DM_HEAL /////////////////////////////
- if(digest_mode == DM_HEAL)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- if(M.stat != DEAD)
- if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
- M.adjustBruteLoss(-1)
- M.adjustFireLoss(-1)
- owner.nutrition -= 10
- return
-
-////////////////////////// DM_NOISY /////////////////////////////////
-//for when you just want people to squelch around
- if(digest_mode == DM_NOISY)
- for (var/mob/living/M in internal_contents)
- if(prob(35))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",35,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
-
-//////////////////////////DM_DRAGON /////////////////////////////////////
-//because dragons need snowflake guts
- if(digest_mode == DM_DRAGON)
- for (var/mob/living/M in internal_contents)
- if(prob(25))
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"digest_pred",50,0,-6,0,channel=CHANNEL_PRED,ignore_walls = FALSE)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_gurgle)
-
- //No digestion protection for megafauna.
-
- //Person just died in guts!
- if(M.stat == DEAD)
- var/digest_alert_owner = pick(digest_messages_owner)
- var/digest_alert_prey = pick(digest_messages_prey)
-
- //Replace placeholder vars
- digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
- digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
- digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
-
- digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
- digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
- digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
-
- //Send messages
- to_chat(owner, "[digest_alert_owner]")
- to_chat(M, "[digest_alert_prey]")
- M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.")
-
- M.stop_sound_channel(CHANNEL_PRED)
- playsound(get_turf(owner),"death_pred",45,0,-6,0,channel=CHANNEL_PRED)
- M.stop_sound_channel(CHANNEL_PRED)
- M.playsound_local(get_turf(M), null, 45, S = prey_digest)
- M.spill_organs(FALSE,TRUE,TRUE)
- M << sound(null, repeat = 0, wait = 0, volume = 80, channel = CHANNEL_PREYLOOP)
- digestion_death(M)
- owner.update_icons()
- continue
-
-
- // Deal digestion damage (and feed the pred)
- if(!(M.status_flags & GODMODE))
- M.adjustFireLoss(digest_burn)
- M.adjustToxLoss(4) // something something plasma based acids
- M.adjustCloneLoss(3) // eventually this'll kill you if you're healing everything else, you nerds.
- return
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-5323.yml b/html/changelogs/AutoChangeLog-pr-5323.yml
deleted file mode 100644
index 82ae6c925b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5323.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Raeschen"
-delete-after: True
-changes:
- - tweak: "Changed/removed some miscreant objectives"
diff --git a/html/changelogs/AutoChangeLog-pr-5374.yml b/html/changelogs/AutoChangeLog-pr-5374.yml
deleted file mode 100644
index 82a54f6df9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5374.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Telecom equipment now can only be printed by engineers and scientists as intended."
- - bugfix: "WT-550 AP can only be printed by sec now."
- - tweak: "Removed engineering requirement for arcade machines to bring it in line with others."
diff --git a/html/changelogs/AutoChangeLog-pr-5377.yml b/html/changelogs/AutoChangeLog-pr-5377.yml
deleted file mode 100644
index 349cd33be9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5377.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Cyborg engineering module geiger counters now work properly again"
diff --git a/html/changelogs/AutoChangeLog-pr-5378.yml b/html/changelogs/AutoChangeLog-pr-5378.yml
deleted file mode 100644
index 39ee297c68..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5378.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Improvedname, Toriate"
-delete-after: True
-changes:
- - rscadd: "Adds carrot satchel"
diff --git a/html/changelogs/AutoChangeLog-pr-5379.yml b/html/changelogs/AutoChangeLog-pr-5379.yml
deleted file mode 100644
index 2c634bd925..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5379.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "As it would happen, the chef does not actually have Italian genes, but rather was being influenced by a strange moustache-a."
diff --git a/html/changelogs/AutoChangeLog-pr-5384.yml b/html/changelogs/AutoChangeLog-pr-5384.yml
deleted file mode 100644
index 76a838dbe5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5384.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - tweak: "Input boxes for emotes are now larger. Check it out with the *subtle and *custom commands. This also applies to the M hotkey."
diff --git a/html/changelogs/AutoChangeLog-pr-5385.yml b/html/changelogs/AutoChangeLog-pr-5385.yml
deleted file mode 100644
index 3cb16e227b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5385.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Removes grind_results from empty soda cans since they can't be ground."
diff --git a/html/changelogs/AutoChangeLog-pr-5386.yml b/html/changelogs/AutoChangeLog-pr-5386.yml
deleted file mode 100644
index bd2fed8838..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5386.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - spellcheck: "For consistency's sake, aluminium is now universally spelled with two 'i'."
diff --git a/html/changelogs/AutoChangeLog-pr-5387.yml b/html/changelogs/AutoChangeLog-pr-5387.yml
deleted file mode 100644
index d7abf266c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5387.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Defibs can now be researched and printed."
diff --git a/html/changelogs/AutoChangeLog-pr-5388.yml b/html/changelogs/AutoChangeLog-pr-5388.yml
deleted file mode 100644
index 31f18743c6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5388.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Changed can_synth values from 0/1 to FALSE/TRUE"
diff --git a/html/changelogs/AutoChangeLog-pr-5389.yml b/html/changelogs/AutoChangeLog-pr-5389.yml
deleted file mode 100644
index 884319e080..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5389.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Goliath hide plates now properly apply to explorer suits and APLUs again."
diff --git a/html/changelogs/AutoChangeLog-pr-5390.yml b/html/changelogs/AutoChangeLog-pr-5390.yml
deleted file mode 100644
index 8cb9140c3e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5390.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "Printed power cells must now be charged before use"
diff --git a/html/changelogs/AutoChangeLog-pr-5391.yml b/html/changelogs/AutoChangeLog-pr-5391.yml
deleted file mode 100644
index 497af33fd9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5391.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - balance: "Hatches are now small instead of tiny."
diff --git a/html/changelogs/AutoChangeLog-pr-5397.yml b/html/changelogs/AutoChangeLog-pr-5397.yml
deleted file mode 100644
index 42ac36f460..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5397.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "Fixed the limb grower having a max volume of 0."
diff --git a/html/changelogs/AutoChangeLog-pr-5398.yml b/html/changelogs/AutoChangeLog-pr-5398.yml
deleted file mode 100644
index 23246095b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5398.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The preference to lock action buttons in place is now correctly saved across rounds."
diff --git a/html/changelogs/AutoChangeLog-pr-5399.yml b/html/changelogs/AutoChangeLog-pr-5399.yml
deleted file mode 100644
index f31125b6e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5399.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ordo"
-delete-after: True
-changes:
- - tweak: "Replaced nitrogen with ethanol in morphine recipe. The recipe now has a lower yield."
diff --git a/html/changelogs/AutoChangeLog-pr-5400.yml b/html/changelogs/AutoChangeLog-pr-5400.yml
deleted file mode 100644
index 007a5dbb1f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5400.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "UI Changes"
-delete-after: True
-changes:
- - tweak: "The Scan with Debugger/Device button now reads Copy Ref and no longer sends you to the circuit's page when clicked"
- - tweak: "The assembly's menu is now slightly wider"
- - tweak: "The advanced in \"integrated advanced medical analyser\" is now abbreviated to adv."
diff --git a/html/changelogs/AutoChangeLog-pr-5404.yml b/html/changelogs/AutoChangeLog-pr-5404.yml
deleted file mode 100644
index 738d191bf6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5404.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "Changed the chemical recipe for Lexorin from plasma, hydrogen, and nitrogen to plasma, hydrogen, and oxygen."
- - bugfix: "These were necessary due to recipe conflicts"
diff --git a/html/changelogs/AutoChangeLog-pr-5405.yml b/html/changelogs/AutoChangeLog-pr-5405.yml
deleted file mode 100644
index 4684cf09d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5405.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Cloner UI now properly updates cloning pod status when autocloning starts cloning someone."
diff --git a/html/changelogs/AutoChangeLog-pr-5408.yml b/html/changelogs/AutoChangeLog-pr-5408.yml
deleted file mode 100644
index ea9647b343..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5408.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added magnetic weapons to techwebs nodes"
- - tweak: "Magrifle magazine now has 24-round capacity, magpistol has 14-round capacity"
- - balance: "rebalanced magrifle projectiles to deal more damage overall on a full burst, but less individually"
- - bugfix: "fixed broken sprites for magrifles"
diff --git a/html/changelogs/AutoChangeLog-pr-5409.yml b/html/changelogs/AutoChangeLog-pr-5409.yml
deleted file mode 100644
index 9cadfc27f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5409.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - bugfix: "Corrected a number of missing checks when using alt-click actions. Please report any strange behavior to a coder."
diff --git a/html/changelogs/AutoChangeLog-pr-5410.yml b/html/changelogs/AutoChangeLog-pr-5410.yml
deleted file mode 100644
index f2ee8ca86e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5410.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - balance: "Grabbers/throwers no longer can contain/throw things equal to the assembly size."
diff --git a/html/changelogs/AutoChangeLog-pr-5412.yml b/html/changelogs/AutoChangeLog-pr-5412.yml
deleted file mode 100644
index 4575638349..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5412.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Mokiros"
-delete-after: True
-changes:
- - rscadd: "All-In-One Grinder can now be built with researchable curcuit and micro-manipulator."
diff --git a/html/changelogs/AutoChangeLog-pr-5414.yml b/html/changelogs/AutoChangeLog-pr-5414.yml
deleted file mode 100644
index 8c582750a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5414.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "You can now smelt titanium glass and plastitanium glass"
- - rscadd: "Use titanium glass and plastitanium glass to build shuttle windows and plastitanium windows"
diff --git a/html/changelogs/AutoChangeLog-pr-5415.yml b/html/changelogs/AutoChangeLog-pr-5415.yml
deleted file mode 100644
index 655fb49afe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5415.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - rscadd: "Mining sentience upgrades now grant minebots an ID and radio."
diff --git a/html/changelogs/AutoChangeLog-pr-5416.yml b/html/changelogs/AutoChangeLog-pr-5416.yml
deleted file mode 100644
index 984d50ea2d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5416.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You, Basilman, and MMMiracles"
-delete-after: True
-changes:
- - rscadd: "Deep in space, a valuable artifact awaits"
diff --git a/html/changelogs/AutoChangeLog-pr-5419.yml b/html/changelogs/AutoChangeLog-pr-5419.yml
deleted file mode 100644
index a5d05ffa00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5419.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscdel: "Steam engines have been removed from maintenance, engineering, atmos and teleportation areas."
diff --git a/html/changelogs/AutoChangeLog-pr-5420.yml b/html/changelogs/AutoChangeLog-pr-5420.yml
deleted file mode 100644
index 821c60f3b4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5420.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Fixes duplicate air alarm on meta."
diff --git a/html/changelogs/AutoChangeLog-pr-5421.yml b/html/changelogs/AutoChangeLog-pr-5421.yml
deleted file mode 100644
index 1e4b3c7f9e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5421.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Prevents megafauna (and other large things like spiders and mulebots) from going into machines"
diff --git a/html/changelogs/AutoChangeLog-pr-5422.yml b/html/changelogs/AutoChangeLog-pr-5422.yml
deleted file mode 100644
index a004909230..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5422.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - spellcheck: "Corrected typo in NTNet Scanner circuits' name, make sure to update your blueprints."
diff --git a/html/changelogs/AutoChangeLog-pr-5423.yml b/html/changelogs/AutoChangeLog-pr-5423.yml
deleted file mode 100644
index a52ec62ade..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5423.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - admin: "The notify irc/discord bot chat command no longer requires admin privileges."
diff --git a/html/changelogs/AutoChangeLog-pr-5427.yml b/html/changelogs/AutoChangeLog-pr-5427.yml
deleted file mode 100644
index c94a419a29..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5427.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscadd: "The chef is now trained for working under siege"
diff --git a/html/changelogs/AutoChangeLog-pr-5428.yml b/html/changelogs/AutoChangeLog-pr-5428.yml
deleted file mode 100644
index 25cfb0aa6d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5428.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - rscadd: "You can now squish urinal cakes"
diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml
deleted file mode 100644
index 7d159a3c40..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5432.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - rscadd: "Added a QM Command Headset and Encryption key"
- - tweak: "Removed the HoP's Cargo access and supply comms access."
- - tweak: "The QM is immune to revolutionaries now and must be murdered, as a head of staff."
- - rscdel: "Removed QM access from Shaft Miners and Cargo Techs during skeleton shifts."
diff --git a/html/changelogs/AutoChangeLog-pr-5433.yml b/html/changelogs/AutoChangeLog-pr-5433.yml
deleted file mode 100644
index 1fe9d351c7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5433.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Your hand no longer magically squishes urinal cakes when trying to pick them up"
diff --git a/html/changelogs/AutoChangeLog-pr-5434.yml b/html/changelogs/AutoChangeLog-pr-5434.yml
deleted file mode 100644
index 7ee8978492..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5434.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - bugfix: "Fixes lye/plastic/charcoal conflicts when mixing."
- - bugfix: "Lye is now made by combining ash with water and carbon. Plastic sheets by heating ash, sulphuric acid and oil."
diff --git a/html/changelogs/AutoChangeLog-pr-5438.yml b/html/changelogs/AutoChangeLog-pr-5438.yml
deleted file mode 100644
index 0a4d3390e8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5438.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "AI no longers block ark after mass_recall"
- - bugfix: "Placed the dispersal logic AFTER the mass_recall on ark activation instead of infront(did nothing before basically)."
diff --git a/html/changelogs/AutoChangeLog-pr-5440.yml b/html/changelogs/AutoChangeLog-pr-5440.yml
deleted file mode 100644
index 0707b4f149..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5440.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Added in prayer beads, code and sprites shamelessly stolen from Paradise. Chaplains can pray for people, to heal their wounds without the risk of braindamage, and cleanse their mind of unholy thoughts"
diff --git a/html/changelogs/AutoChangeLog-pr-5442.yml b/html/changelogs/AutoChangeLog-pr-5442.yml
deleted file mode 100644
index 1b4b8dd334..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5442.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Cell chargers can now be built and upgraded with capacitors!"
- - bugfix: "Fixed empty subtype batteries not updating icons"
diff --git a/html/changelogs/AutoChangeLog-pr-5445.yml b/html/changelogs/AutoChangeLog-pr-5445.yml
deleted file mode 100644
index 40def083f5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5445.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "SCP-294 no longer looks fucked up"
diff --git a/html/changelogs/AutoChangeLog-pr-5447.yml b/html/changelogs/AutoChangeLog-pr-5447.yml
deleted file mode 100644
index 4cd5e4a0e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5447.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - balance: "The rift created by teleporting in from space will now include a description indicating the direction of the \"origin\" teleport rune - giving the examiner a fair idea of where the \"space base\" is located."
- - balance: "You can no longer manifest spirits or summon cultists while in space or Lavaland. You may still ascend as a spirit (formerly spirit sight, astral jaunt, etc.) in either of these locations."
- - balance: "Juggernauts have lost 20% reflect rate on energy projectiles (now around 50% for standard lasers)."
- - balance: "Wraiths and Juggernauts have -5 melee damage (20 and 25 now, respectively)."
- - balance: "Construct shells now cost 50 metal through the \"twisted construction\" spell. Twisted construction is now a \"single use\" spell."
- - balance: "The Concealment spell will now work on cult airlocks (including converted airlocks). The \"concealed\" airlock will appear as a generic airlock but will deny access to any non-cultist."
- - balance: "The draw blood effect on blood splatters will now draw more blood from stains with low blood levels."
- - tweak: "Unanchored (via ritual dagger) cult structures are no longer \"dense\", meaning you can move them through teleport runes more efficiently."
- - tweak: "The button to nominate yourself for cult master now has a confirmation prompt seeking assurance that the user is prepared to be the cult's master."
- - tweak: "The reveal aspect of the concealment spell is slightly smaller, albeit still slightly larger (6 range) than the concealment aspect (5 range)."
- - imageadd: "Juggernauts \"gauntlet echo\" now has a more cult-themed appearance."
- - bugfix: "Using a shuttle curse to push the shuttle timer above its default can no longer be \"reset\" with a recall. This also adds a block_recall(time_in_deciseconds) helper-proc to the shuttle subsystem."
- - bugfix: "Using runed metal on a regular girder is no longer an option, preventing runtimes and deletions associated with the (unintended) combination."
diff --git a/html/changelogs/AutoChangeLog-pr-5451.yml b/html/changelogs/AutoChangeLog-pr-5451.yml
deleted file mode 100644
index 05ec2a27e2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5451.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - code_imp: "Synced with upstream. Again. For the hundredth time probably. Check the github for more details."
diff --git a/html/changelogs/AutoChangeLog-pr-5453.yml b/html/changelogs/AutoChangeLog-pr-5453.yml
deleted file mode 100644
index 6e9eaebe6a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5453.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "After consulting with their in-house physicists, Nanotrasen has updated their worst-case disaster training simulation \"Space Station 13\". The combustion of hydrogen isotopes now produces water vapor instead of carbon dioxide."
diff --git a/html/changelogs/AutoChangeLog-pr-5456.yml b/html/changelogs/AutoChangeLog-pr-5456.yml
deleted file mode 100644
index 0bbfaf59f9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5456.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Added hooray emoji!"
diff --git a/html/changelogs/AutoChangeLog-pr-5464.yml b/html/changelogs/AutoChangeLog-pr-5464.yml
deleted file mode 100644
index 2ec5074007..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5464.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Heart-shaped boxes of chocolates are now included in Valentine's Day event gifts"
diff --git a/html/changelogs/AutoChangeLog-pr-5465.yml b/html/changelogs/AutoChangeLog-pr-5465.yml
deleted file mode 100644
index ac80a64f1d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5465.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Iamgoofball"
-delete-after: True
-changes:
- - bugfix: "The Cook now ONLY works under siege."
diff --git a/html/changelogs/AutoChangeLog-pr-5467.yml b/html/changelogs/AutoChangeLog-pr-5467.yml
deleted file mode 100644
index ba61559a87..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5467.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Frozenguy5"
-delete-after: True
-changes:
- - bugfix: "You can craft rat kebabs now."
diff --git a/html/changelogs/AutoChangeLog-pr-5469.yml b/html/changelogs/AutoChangeLog-pr-5469.yml
deleted file mode 100644
index 7ae6cf54a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5469.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Transference potions now just rename the mob that you are transferring into with your name, rather than your name plus the old name of the mob."
diff --git a/html/changelogs/AutoChangeLog-pr-5470.yml b/html/changelogs/AutoChangeLog-pr-5470.yml
deleted file mode 100644
index f1a9fb3df8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5470.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - tweak: "The clogged vents event has been removed for pressing ceremonial reasons"
diff --git a/html/changelogs/AutoChangeLog-pr-5473.yml b/html/changelogs/AutoChangeLog-pr-5473.yml
deleted file mode 100644
index e702a232cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5473.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Chasms no longer eat shuttle docking ports, rendering them unusable and unresponsive"
diff --git a/html/changelogs/AutoChangeLog-pr-5477.yml b/html/changelogs/AutoChangeLog-pr-5477.yml
deleted file mode 100644
index ecafe93d22..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5477.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "Integrated circuits no longer start upgraded."
- - balance: "The IC printers that are available on round start in the IC labs are no longer upgraded by default. You will need to research these as was intended"
diff --git a/html/changelogs/AutoChangeLog-pr-5478.yml b/html/changelogs/AutoChangeLog-pr-5478.yml
deleted file mode 100644
index 453d0ebde9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5478.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Everyone who gets new mineral announcements should now have access to actually get those materials"
diff --git a/html/changelogs/AutoChangeLog-pr-5484.yml b/html/changelogs/AutoChangeLog-pr-5484.yml
deleted file mode 100644
index a8b6d91826..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5484.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - balance: "emags now have a 10 use endurance. Emag carefully, operatives."
diff --git a/html/changelogs/AutoChangeLog-pr-5485.yml b/html/changelogs/AutoChangeLog-pr-5485.yml
deleted file mode 100644
index 76b35f1eaf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5485.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - rscadd: "Cryopods are now available for safe round exiting, no longer will you need to ahelp with 'oh fuck wrong job'. Being kicked back to lobby for a restart is still admin. You will be warned to ahelp if you're an antag role however."
diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml
deleted file mode 100644
index 3f9f6aaa4f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5490.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - rscadd: "Security vendors now have a stunsword modification kit available for purchase with a coin. There might be another somewhere in there, but that would require tampering with it, and you're a good little redshirt, aren't you?"
diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml
deleted file mode 100644
index 712b4b9f28..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5493.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "You no longer need an aggressive grab to table someone."
diff --git a/html/changelogs/AutoChangeLog-pr-5495.yml b/html/changelogs/AutoChangeLog-pr-5495.yml
deleted file mode 100644
index 80d21e35bc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5495.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - rscadd: "Bluespace slime extracts now have a new chemical reaction with water, which create slime radio potions. When applied to a simple animal, that mob gains an internal radio."
diff --git a/html/changelogs/AutoChangeLog-pr-5496.yml b/html/changelogs/AutoChangeLog-pr-5496.yml
deleted file mode 100644
index c1e3e1c7d9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5496.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - refactor: "Map initialization now supports stations with multiple z-levels."
- - bugfix: "The map reader no longer sometimes expands the world size inappropriately."
- - tweak: "Pride's Mirror's destination has become less predictable."
diff --git a/html/changelogs/AutoChangeLog-pr-5505.yml b/html/changelogs/AutoChangeLog-pr-5505.yml
deleted file mode 100644
index 0b89b2e2e0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5505.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MMMiracles"
-delete-after: True
-changes:
- - rscadd: "You can now produce a cryostatis variant of the shotgun dart after researching Medical Weaponry. Holds 10u and doesn't have reagents react inside it."
diff --git a/html/changelogs/AutoChangeLog-pr-5506.yml b/html/changelogs/AutoChangeLog-pr-5506.yml
deleted file mode 100644
index 40765e014b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5506.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscdel: "Minimap gone from crew monitoring"
diff --git a/html/changelogs/AutoChangeLog-pr-5508.yml b/html/changelogs/AutoChangeLog-pr-5508.yml
deleted file mode 100644
index 282af66cbb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5508.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Removing and printing integrated circuits will now attempt to place them into a free hand."
- - tweak: "You can now hit an integrated circuit printer with an unsecured electronic assembly to recycle all of the parts in the assembly en masse."
- - tweak: "You can now recycle empty electronic assemblies in an integrated circuit printer!"
- - soundadd: "Integrated circuit printers now have sounds for printing circuits and assemblies."
diff --git a/html/changelogs/AutoChangeLog-pr-5509.yml b/html/changelogs/AutoChangeLog-pr-5509.yml
deleted file mode 100644
index 938597014c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5509.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Centcom now reports that thanks to extensive bioengineering, apples
-and oranges now taste of apples and oranges, rather than nothing as they
-did before."
diff --git a/html/changelogs/AutoChangeLog-pr-5512.yml b/html/changelogs/AutoChangeLog-pr-5512.yml
deleted file mode 100644
index bbabd36f85..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5512.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Fixes SCP-294 losing its top sometimes"
diff --git a/html/changelogs/AutoChangeLog-pr-5515.yml b/html/changelogs/AutoChangeLog-pr-5515.yml
deleted file mode 100644
index eea214c057..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5515.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - balance: "returned Flightsuit armor to being less useful, also ensured they're not getting the best possible huds as well. Batteries to be done eventually."
diff --git a/html/changelogs/AutoChangeLog-pr-5517.yml b/html/changelogs/AutoChangeLog-pr-5517.yml
deleted file mode 100644
index b02e311eb5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5517.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Emagging meteor shield satellites now shows you a message."
- - spellcheck: "Fixed a typo when emagging RnD servers."
diff --git a/html/changelogs/AutoChangeLog-pr-5518.yml b/html/changelogs/AutoChangeLog-pr-5518.yml
deleted file mode 100644
index 0dff286598..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5518.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - code_imp: "replaced some item-specific movement hooks with components"
diff --git a/html/changelogs/AutoChangeLog-pr-5522.yml b/html/changelogs/AutoChangeLog-pr-5522.yml
deleted file mode 100644
index ff182e1d62..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5522.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - code_imp: "made powercell rigging no longer set rigged to the plasma reagent datum what the hell and makes it use TRUE/FALSE defines"
diff --git a/html/changelogs/AutoChangeLog-pr-5525.yml b/html/changelogs/AutoChangeLog-pr-5525.yml
deleted file mode 100644
index 8fffeb931d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5525.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - rscadd: "Slimepeople (And all types, including Jelly, Xenobio Slimeperson, Stargazer and Luminescent) now have the ability to utilise the 'Alter Form' ability, allowing them to change most things about their body's form."
- - rscadd: "Re-added the slime split and bodyswap ability to Xenobiological Slimepeople, only obtainable through xenobio."
- - rscadd: "Slimepeople can now select tails, taur bodies and ears at roundstart. YOU WILL NEED TO SET YOUR COLOURS; otherwise you'll be rainbow coloured and not exactly slime-like. And nobody wants that."
- - config: "Changed the ID for the roundstart slimepeople (Without the body swap and slime split abilities) to slimeperson. This will need set in the config on Jay's end."
diff --git a/html/changelogs/AutoChangeLog-pr-5527.yml b/html/changelogs/AutoChangeLog-pr-5527.yml
deleted file mode 100644
index d1d01ed199..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5527.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "The RPG loot event will no longer break circuit analyzers."
diff --git a/html/changelogs/AutoChangeLog-pr-5532.yml b/html/changelogs/AutoChangeLog-pr-5532.yml
deleted file mode 100644
index ef599784de..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5532.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - rscadd: "Added the ability to gain smoke bomb charges by attacking the initiated ninja suit with a beaker containing smoke powder"
diff --git a/html/changelogs/AutoChangeLog-pr-5534.yml b/html/changelogs/AutoChangeLog-pr-5534.yml
deleted file mode 100644
index 5099a198f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5534.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Zna12"
-delete-after: True
-changes:
- - rscadd: "Autoylathe"
- - tweak: "Tweaked the description of replica katana to show that it's not as much of a toy as i thought it was."
diff --git a/html/changelogs/AutoChangeLog-pr-5535.yml b/html/changelogs/AutoChangeLog-pr-5535.yml
deleted file mode 100644
index c74dec1e9d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5535.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "added a subreaction for rainbow slime cores, injecting 5u of plasma now makes them explode into random slimecores."
- - rscadd: "added a slimejelly reaction to rainbow slime cores that does the above but all the cores that spawn get 5u each of plasma, water and blood injected. (aka chaos)"
- - code_imp: "improved clusterbuster code with Initialize, addtimer, vars for sounds and payload spawners, etc"
diff --git a/html/changelogs/AutoChangeLog-pr-5538.yml b/html/changelogs/AutoChangeLog-pr-5538.yml
deleted file mode 100644
index b77960fd42..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5538.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Fel and LeonDuvall"
-delete-after: True
-changes:
- - rscadd: "You can now drink sake! Can be found in the bar, or made with rice
-and sugar."
diff --git a/html/changelogs/AutoChangeLog-pr-5539.yml b/html/changelogs/AutoChangeLog-pr-5539.yml
deleted file mode 100644
index f0d826d2dc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5539.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TankNut"
-delete-after: True
-changes:
- - tweak: "Corpses spawned in ruins have their suit sensors disabled"
diff --git a/html/changelogs/AutoChangeLog-pr-5540.yml b/html/changelogs/AutoChangeLog-pr-5540.yml
deleted file mode 100644
index 858331ade5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5540.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Modafinil"
-delete-after: True
-changes:
- - rscadd: "Adds new medicine chem that suppresses sleep and very lightly reduces stunrates, has a very low metabolic rate which is randomized and a low overdose treshold. Overdosing is a lethal oxyloss unless treated. (With epipen urgently and with charcoal/calomel before it puts you to sleep)"
diff --git a/html/changelogs/AutoChangeLog-pr-5542.yml b/html/changelogs/AutoChangeLog-pr-5542.yml
deleted file mode 100644
index 941c3c2a57..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5542.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - bugfix: "Species with RESISTHOT (golems, skeletons) can extinguish burning
-items as if they were wearing fireproof gloves."
diff --git a/html/changelogs/AutoChangeLog-pr-5546.yml b/html/changelogs/AutoChangeLog-pr-5546.yml
deleted file mode 100644
index 0c26141b42..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5546.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "jakeramsay007"
-delete-after: True
-changes:
- - bugfix: "Jellypeople/Slimepeople now are able to speak their Slime language, as intended when it was added."
diff --git a/html/changelogs/AutoChangeLog-pr-5547.yml b/html/changelogs/AutoChangeLog-pr-5547.yml
deleted file mode 100644
index b9174386ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5547.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "After an incident where a very eager roboticist kept expanding a borg's size leading to a structural collapse of the entire station proper safety limitations have been implemented."
diff --git a/html/changelogs/AutoChangeLog-pr-5548.yml b/html/changelogs/AutoChangeLog-pr-5548.yml
deleted file mode 100644
index f3695c5649..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5548.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixes lava and fire burning HE-pipes"
diff --git a/html/changelogs/AutoChangeLog-pr-5549.yml b/html/changelogs/AutoChangeLog-pr-5549.yml
deleted file mode 100644
index fddb207ee1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5549.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "removes the maintenance panel examination message on poddoors (blast doors)"
diff --git a/html/changelogs/AutoChangeLog-pr-5550.yml b/html/changelogs/AutoChangeLog-pr-5550.yml
deleted file mode 100644
index 9e3ae64528..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5550.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen has invested in better reflective materials for it's reflectors. You can now make complex laser shows again."
diff --git a/html/changelogs/AutoChangeLog-pr-5554.yml b/html/changelogs/AutoChangeLog-pr-5554.yml
deleted file mode 100644
index 7db22a96bd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5554.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - admin: "Admins can use the Select Equipment verb on observers. Doing so will
-humanise them and then apply the equipment."
diff --git a/html/changelogs/AutoChangeLog-pr-5555.yml b/html/changelogs/AutoChangeLog-pr-5555.yml
deleted file mode 100644
index 37e6f9f6f2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5555.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - bugfix: "You can rotate freezers and cryo again."
diff --git a/html/changelogs/AutoChangeLog-pr-5558.yml b/html/changelogs/AutoChangeLog-pr-5558.yml
deleted file mode 100644
index c08bcd67d9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5558.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "RnD's base research point generation rate has been decreased to 1,200 points per minute."
diff --git a/html/changelogs/AutoChangeLog-pr-5563.yml b/html/changelogs/AutoChangeLog-pr-5563.yml
deleted file mode 100644
index 3a2e25a193..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5563.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscadd: "Exosuit fabricators can now build RPED and crew pinpointer upgrades for engineering and medical borgs respectively."
diff --git a/html/changelogs/AutoChangeLog-pr-5566.yml b/html/changelogs/AutoChangeLog-pr-5566.yml
deleted file mode 100644
index 008d93439f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5566.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ordo"
-delete-after: True
-changes:
- - rscadd: "Adds a few new liquors to the bar, and a few new cocktails to boot!"
diff --git a/html/changelogs/AutoChangeLog-pr-5567.yml b/html/changelogs/AutoChangeLog-pr-5567.yml
deleted file mode 100644
index cb5c5258b1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5567.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Crew pinpointers now fit on medical belts!"
diff --git a/html/changelogs/AutoChangeLog-pr-5568.yml b/html/changelogs/AutoChangeLog-pr-5568.yml
deleted file mode 100644
index 465ed69402..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5568.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "More Robust Than You"
-delete-after: True
-changes:
- - bugfix: "Actually fixes SCP 294 overlay problems"
diff --git a/html/changelogs/AutoChangeLog-pr-5571.yml b/html/changelogs/AutoChangeLog-pr-5571.yml
deleted file mode 100644
index dd25c0c971..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5571.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Bicycles are rideable again"
diff --git a/html/changelogs/AutoChangeLog-pr-5576.yml b/html/changelogs/AutoChangeLog-pr-5576.yml
deleted file mode 100644
index ea6e7f4cba..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5576.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - tweak: "Most of the light sources in the game have had their light values to be a little more realistic."
diff --git a/html/changelogs/AutoChangeLog-pr-5577.yml b/html/changelogs/AutoChangeLog-pr-5577.yml
deleted file mode 100644
index 7024c307cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5577.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - tweak: "Atmosia is considerably more lethal now. Don't go into space unprotected!"
- - balance: "being on fire is actually something to worry about."
diff --git a/html/changelogs/AutoChangeLog-pr-5580.yml b/html/changelogs/AutoChangeLog-pr-5580.yml
deleted file mode 100644
index 415bbfccbc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5580.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - bugfix: "New blob tiles are no longer invincible after their blob's death."
- - bugfix: "Blob nodes no longer produce blob tiles even after the blob's death."
diff --git a/html/changelogs/AutoChangeLog-pr-5582.yml b/html/changelogs/AutoChangeLog-pr-5582.yml
deleted file mode 100644
index 581e515c04..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5582.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Improvedname"
-delete-after: True
-changes:
- - bugfix: "Fried eggs don't require boiled eggs anymore and just normal eggs"
diff --git a/html/changelogs/AutoChangeLog-pr-5586.yml b/html/changelogs/AutoChangeLog-pr-5586.yml
deleted file mode 100644
index 2d254beaa0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5586.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Fixed paper bins not catching fire properly"
diff --git a/html/changelogs/AutoChangeLog-pr-5590.yml b/html/changelogs/AutoChangeLog-pr-5590.yml
deleted file mode 100644
index a0359447af..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5590.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - rscadd: "Added three new techweb nodes: Advanced Surgery, Experimental Surgery, and Alien Surgery(requires abductor tech)"
- - rscadd: "Added several new surgical procedures, which require these techweb nodes. To enable an advanced surgery, print its relative disk from a protolathe, and load it on an Operating Computer. Advanced surgery can only be performed at operating tables."
- - tweak: "You can now intentionally fail surgical procedures by initiating them with disarm intent instead of help intent."
- - rscadd: "Brain traumas now have a custom resilience system. Some trauma sources can cause traumas which require more extensive treatment, such as the new Lobotomy surgery."
- - rscadd: "Traitors can now purchase a Brainwashing Surgery Disk for 5 TC."
diff --git a/html/changelogs/AutoChangeLog-pr-5592.yml b/html/changelogs/AutoChangeLog-pr-5592.yml
deleted file mode 100644
index b131a5f963..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5592.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Mime's Bane, a toxin that prevents people from emoting while it's in their system, can now be created by mixing 1 part Mute Toxin, 1 part Nothing and 1 part Radium."
diff --git a/html/changelogs/AutoChangeLog-pr-5595.yml b/html/changelogs/AutoChangeLog-pr-5595.yml
deleted file mode 100644
index f3edc90a12..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5595.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Circuits integrity, charge, and overall circuit composition is displayed on diagnostic huds. If the assembly has dangerous circuits then the status icon will display exclamation points, if the assembly can communicate with something far away a wifi icon will appear next to the status icon, and if the circuit can not operate the status icon will display an 'X'."
- - rscadd: "AR interface circuit which can modify the status icon if it is not displaying the exclamation points or the 'X'."
- - tweak: "Locomotive circuits can no longer be added to assemblies that can't use them."
- - spellcheck: "Fixed a typo in the grenade primer description."
- - code_imp: "Added flags to circuits that help group subsets of circuits and regulate them."
diff --git a/html/changelogs/AutoChangeLog-pr-5596.yml b/html/changelogs/AutoChangeLog-pr-5596.yml
deleted file mode 100644
index 3f7c3c9388..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5596.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed walls under doors breaking to space"
- - tweak: "changed doors to no longer spawn on top of walls"
diff --git a/html/changelogs/AutoChangeLog-pr-5597.yml b/html/changelogs/AutoChangeLog-pr-5597.yml
deleted file mode 100644
index c830d7955a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5597.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed ghost spawners showing up in the spawner menu when you can't use them"
diff --git a/html/changelogs/AutoChangeLog-pr-5604.yml b/html/changelogs/AutoChangeLog-pr-5604.yml
deleted file mode 100644
index b26d3fbea9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5604.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - tweak: "The crusher kit now includes an advanced mining scanner."
- - tweak: "The resonator kit now includes webbing and a small extinguisher."
- - tweak: "The minebot kit now includes a minebot passthrough kinetic accelerator module, which will cause kinetic accelerator shots to pass through minebots. The welding goggles have been replaced with a welding helmet, allowing you to wear mesons and still be able to repair the minebot without eye damage.
-feature: You can now install kinetic accelerator modkits on minebots. Some exceptions may apply. Crowbar to remove modkits."
- - balance: "Minebots now shoot 33% faster by default(3 seconds to 2). The minebot cooldown upgrade still produces a fire rate of 1 second."
- - balance: "Minebots are now slightly less likely to sit in melee like idiots, and are now healed for 15 instead of 10 when welded."
- - balance: "Sentient minebots are penalized; they cannot have armor and melee upgrades installed, and making them sentient will override those upgrades if they were installed. In addition, they move very slightly slower and have their kinetic accelerator's cooldown increased by 1 second."
diff --git a/html/changelogs/AutoChangeLog-pr-5606.yml b/html/changelogs/AutoChangeLog-pr-5606.yml
deleted file mode 100644
index fd2238ab98..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5606.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "The round-end report now shows information about the first person to die in that round."
diff --git a/html/changelogs/AutoChangeLog-pr-5607.yml b/html/changelogs/AutoChangeLog-pr-5607.yml
deleted file mode 100644
index 09a3db4529..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5607.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Admins may now spawn a debug circuit printer that can always print circuits, and has infinite metal."
- - bugfix: "Buttons, number pads, and text pads in integrated circuits now correctly show their labels."
- - bugfix: "Integrated hypo-injectors can now correctly draw blood."
- - tweak: "The circuit analyzer output has been slightly tweaked and includes usage instructions."
diff --git a/html/changelogs/AutoChangeLog-pr-5608.yml b/html/changelogs/AutoChangeLog-pr-5608.yml
deleted file mode 100644
index 430d10aee3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5608.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jittai"
-delete-after: True
-changes:
- - tweak: "Ctrl+Clicking progresses through grab cycle on living mobs (not just humans)"
diff --git a/html/changelogs/AutoChangeLog-pr-5609.yml b/html/changelogs/AutoChangeLog-pr-5609.yml
deleted file mode 100644
index 9cf7d4dece..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5609.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen psychologists have identified new phobias emerging amongst the workforce. Nanotrasen's surgeon general advises all personnel to just buck up and deal with it."
diff --git a/html/changelogs/AutoChangeLog-pr-5610.yml b/html/changelogs/AutoChangeLog-pr-5610.yml
deleted file mode 100644
index 2f9459d9c4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5610.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Adds special tutorial holopads for the hazard course."
diff --git a/html/changelogs/AutoChangeLog-pr-5611.yml b/html/changelogs/AutoChangeLog-pr-5611.yml
deleted file mode 100644
index f5a6ffa91c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5611.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "NTnet circuit fix"
-delete-after: True
-changes:
- - bugfix: "Now NTnet circuits can recieve sender adress properly.Also, now messages could be sended to multiple recepiens."
diff --git a/html/changelogs/AutoChangeLog-pr-5612.yml b/html/changelogs/AutoChangeLog-pr-5612.yml
deleted file mode 100644
index 2140adcada..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5612.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kevinz000 and Naksu"
-delete-after: True
-changes:
- - bugfix: "Ore stacks will now initialize with proper visuals and no longer show a NO SPRITE text when you gather more than 20 ores to a stack."
diff --git a/html/changelogs/AutoChangeLog-pr-5613.yml b/html/changelogs/AutoChangeLog-pr-5613.yml
deleted file mode 100644
index 0d6bf7c6c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5613.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "fixed multiserver mining formula"
diff --git a/html/changelogs/AutoChangeLog-pr-5615.yml b/html/changelogs/AutoChangeLog-pr-5615.yml
deleted file mode 100644
index 5b78aec45f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5615.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Plastic surgery now lets you choose from a list of ten random names, so you can pick the one that you prefer."
- - tweak: "Abductors performing plastic surgery can now give their target spooky subject names, with one normal name available for standard plastique."
diff --git a/html/changelogs/AutoChangeLog-pr-5616.yml b/html/changelogs/AutoChangeLog-pr-5616.yml
deleted file mode 100644
index 8b9cf3dd00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5616.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "Xenos no longer have stun or stamina immunity"
diff --git a/html/changelogs/AutoChangeLog-pr-5617.yml b/html/changelogs/AutoChangeLog-pr-5617.yml
deleted file mode 100644
index f96e0ef3d6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5617.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - balance: "Sleeping Carp and Psychotic Brawl will now both use Knockdown() instead of Stun() for their stuns, making things a lot more consistent with the recent stun nerfs."
diff --git a/html/changelogs/AutoChangeLog-pr-5618.yml b/html/changelogs/AutoChangeLog-pr-5618.yml
deleted file mode 100644
index 7e25ba3dd7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5618.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - tweak: "Altered the HoP to require Service experience instead of Supply"
diff --git a/html/changelogs/AutoChangeLog-pr-5619.yml b/html/changelogs/AutoChangeLog-pr-5619.yml
deleted file mode 100644
index 08dcfe13ae..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5619.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Added the dish drive. This machine, the future in plate disposal, can be researched from techwebs (Biological Processing) and built with a standard machine frame using two matter bins, a micro manipulator, and a glass sheet."
- - rscadd: "A circuit board for the dish drive can be found in the chef's and bartender's wardrobes."
- - rscadd: "You can hit a dish drive with any dish (like a plate or drinking glass), and the dish drive will convert it from matter to energy, allowing it to store an infinite amount of dishes. You can also interact with it to get things back from it."
- - rscadd: "Dish drives also have an automatic \"suction\" function that sucks in all loose dishes within four tiles. This can be toggled by activating its circuit board in-hand."
- - rscadd: "Dish drives automatically beam their stored dishes into any disposal unit that it can see within seven tiles every minute. You can toggle this by alt-clicking its circuit board."
diff --git a/html/changelogs/AutoChangeLog-pr-5623.yml b/html/changelogs/AutoChangeLog-pr-5623.yml
deleted file mode 100644
index 89b45d32e5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5623.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Fixed preferences from overridding vore bellies on different characters with the last saved. Maybe. Worked on local."
- - soundadd: "added a button for prey to restart their sound loop, if it cut out and they want it back on."
- - soundadd: "Vore sounds respect walls, people can stop bitching about dorm room vore RP."
diff --git a/html/changelogs/AutoChangeLog-pr-5630.yml b/html/changelogs/AutoChangeLog-pr-5630.yml
deleted file mode 100644
index d7f24d0ad5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5630.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Flightsuits should be controllable again"
diff --git a/html/changelogs/AutoChangeLog-pr-5633.yml b/html/changelogs/AutoChangeLog-pr-5633.yml
deleted file mode 100644
index 8130f1cd15..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5633.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - bugfix: "Slimes of all sorts should no longer have livers"
diff --git a/html/changelogs/AutoChangeLog-pr-5634.yml b/html/changelogs/AutoChangeLog-pr-5634.yml
deleted file mode 100644
index c020140483..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5634.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - code_imp: "Renamed the IDs of various reagents to be more descriptive."
- - spellcheck: "Fixed the descriptions of changeling adrenaling reagents."
diff --git a/html/changelogs/AutoChangeLog-pr-5635.yml b/html/changelogs/AutoChangeLog-pr-5635.yml
deleted file mode 100644
index d9b05dafa2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5635.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Changed Santa event earliest start from 33 minutes & 20 seconds to 30 minutes. Changed shuttle loan earliest start from 6 minutes & 40 seconds to 7 minutes."
diff --git a/html/changelogs/AutoChangeLog-pr-5636.yml b/html/changelogs/AutoChangeLog-pr-5636.yml
deleted file mode 100644
index 36034f0db6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5636.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - spellcheck: "Tweaked the message you see when emagging meteor shield satellites."
diff --git a/html/changelogs/AutoChangeLog-pr-5638.yml b/html/changelogs/AutoChangeLog-pr-5638.yml
deleted file mode 100644
index 359dde9603..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5638.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Kevinz000 & Deathride58"
-delete-after: True
-changes:
- - rscadd: "A separate round time has been added to status panel. This will start at 00:00:00."
- - rscadd: "Night shift lighting [if enabled in the same configuration] will activate between station time 7:30 PM and 7:30 AM. This will dim all lights affected, but they will still have the same range."
- - rscadd: "APCs now have an option to set night lighting mode on or off, regardless of time."
diff --git a/html/changelogs/AutoChangeLog-pr-5640.yml b/html/changelogs/AutoChangeLog-pr-5640.yml
deleted file mode 100644
index 1e73571181..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5640.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - code_imp: "removed unused poisoned apple variant"
diff --git a/html/changelogs/AutoChangeLog-pr-5641.yml b/html/changelogs/AutoChangeLog-pr-5641.yml
deleted file mode 100644
index 9e6eba0abe..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5641.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jittai / ChuckTheSheep"
-delete-after: True
-changes:
- - imageadd: "NT has stopped buying re-boxed storebrand Donkpockets and now stocks stations with real, genuine, tasty Donkpockets!"
diff --git a/html/changelogs/AutoChangeLog-pr-5642.yml b/html/changelogs/AutoChangeLog-pr-5642.yml
deleted file mode 100644
index 1bf3247e67..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5642.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Nanotrasen has begun a campaign to inform their employees that you can alt-click to disable morgue tray beeping."
diff --git a/html/changelogs/AutoChangeLog-pr-5645.yml b/html/changelogs/AutoChangeLog-pr-5645.yml
deleted file mode 100644
index 9478df06eb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5645.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "The clock cult's marauder limit now works properly, temporarily lower the marauder limit when one has recently been summoned."
diff --git a/html/changelogs/AutoChangeLog-pr-5647.yml b/html/changelogs/AutoChangeLog-pr-5647.yml
deleted file mode 100644
index 53ae908ef9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5647.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Super3222, TheMythicGhost, DaedalusGame"
-delete-after: True
-changes:
- - rscadd: "Adds a barometer function to the standard atmos analyzer."
- - imageadd: "Adds a new sprite for the atmos analyzer to resemble a barometer."
diff --git a/html/changelogs/AutoChangeLog-pr-5648.yml b/html/changelogs/AutoChangeLog-pr-5648.yml
deleted file mode 100644
index 2c763dd2b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5648.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Repukan"
-delete-after: True
-changes:
- - bugfix: "fixed windoors dropping more cable than what was used to build them."
diff --git a/html/changelogs/AutoChangeLog-pr-5649.yml b/html/changelogs/AutoChangeLog-pr-5649.yml
deleted file mode 100644
index b973890684..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5649.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - balance: "Rebalanced cold damage on slimepeople"
- - bugfix: "Transform potions no longer give more than one alter form ability"
diff --git a/html/changelogs/AutoChangeLog-pr-5650.yml b/html/changelogs/AutoChangeLog-pr-5650.yml
deleted file mode 100644
index 0eefedb0ab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5650.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - balance: "rebalanced Ninja event to allow it to happen earlier."
diff --git a/html/changelogs/AutoChangeLog-pr-5651.yml b/html/changelogs/AutoChangeLog-pr-5651.yml
deleted file mode 100644
index eeb3b0a2cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5651.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MetroidLover"
-delete-after: True
-changes:
- - bugfix: "fixed Ninja welcome text to no longer tell you to right click your suit."
diff --git a/html/changelogs/AutoChangeLog-pr-5653.yml b/html/changelogs/AutoChangeLog-pr-5653.yml
deleted file mode 100644
index 11325e5f67..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5653.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "kevinz000, Denton"
-delete-after: True
-changes:
- - rscadd: "Nanotrasen's RnD division has integrated all stationary tachyon doppler arrays into the techweb system. Record increasingly large explosions with them and you will generate research points!"
- - spellcheck: "Fixed a few typos in the RnD doppler array name/description."
diff --git a/html/changelogs/AutoChangeLog-pr-5657.yml b/html/changelogs/AutoChangeLog-pr-5657.yml
deleted file mode 100644
index 45f0856d0e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5657.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - tweak: "Toxin loving species now properly take toxin damage from liver failiure"
diff --git a/html/changelogs/AutoChangeLog-pr-5658.yml b/html/changelogs/AutoChangeLog-pr-5658.yml
deleted file mode 100644
index 179b332095..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5658.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - code_imp: "removes input/output plates and changes autogibbers to use input dir"
diff --git a/html/changelogs/AutoChangeLog-pr-5659.yml b/html/changelogs/AutoChangeLog-pr-5659.yml
deleted file mode 100644
index b6ba2cee2b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5659.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The outer airlocks of various lavaland ruins and ships now cycle lock."
diff --git a/html/changelogs/AutoChangeLog-pr-5660.yml b/html/changelogs/AutoChangeLog-pr-5660.yml
deleted file mode 100644
index 23fd1ab34d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5660.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The outer airlocks of most space ruin airlocks are now cycle linked."
diff --git a/html/changelogs/AutoChangeLog-pr-5661.yml b/html/changelogs/AutoChangeLog-pr-5661.yml
deleted file mode 100644
index a1f53d6f16..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5661.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - admin: "Admins can now start the game as extended revs, a version of revs that doesn't end when head(rev)s are dead. Admins can also use the speedy mode, which nukes the station after 20 minutes."
diff --git a/html/changelogs/AutoChangeLog-pr-5662.yml b/html/changelogs/AutoChangeLog-pr-5662.yml
deleted file mode 100644
index c7851b94cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5662.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - bugfix: "Players can no longer kill themselves by whispering inside clone pods."
diff --git a/html/changelogs/AutoChangeLog-pr-5663.yml b/html/changelogs/AutoChangeLog-pr-5663.yml
deleted file mode 100644
index 6bda49061b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5663.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Repukan"
-delete-after: True
-changes:
- - rscadd: "Whiskey to the flask"
- - rscdel: "Hearty Punch from the flask"
diff --git a/html/changelogs/AutoChangeLog-pr-5666.yml b/html/changelogs/AutoChangeLog-pr-5666.yml
deleted file mode 100644
index 0000b86190..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5666.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "The 'neurotoxin2' toxin has been renamed to Fentanyl."
diff --git a/html/changelogs/AutoChangeLog-pr-5668.yml b/html/changelogs/AutoChangeLog-pr-5668.yml
deleted file mode 100644
index e8f9ae32b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5668.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Dogborgs should no longer have offset issues after attacking."
- - bugfix: "Dogborg laser/disabler fluff now works again."
diff --git a/html/changelogs/AutoChangeLog-pr-5669.yml b/html/changelogs/AutoChangeLog-pr-5669.yml
deleted file mode 100644
index 48cf9a6be9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5669.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - tweak: "Silicons no longer have to be adjacent to morguetrays to disable the alarms on then."
diff --git a/html/changelogs/AutoChangeLog-pr-5670.yml b/html/changelogs/AutoChangeLog-pr-5670.yml
deleted file mode 100644
index bc9ed17cfa..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5670.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Shock collars re-added to autolathes"
diff --git a/html/changelogs/AutoChangeLog-pr-5672.yml b/html/changelogs/AutoChangeLog-pr-5672.yml
deleted file mode 100644
index 4c9c5f0a06..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5672.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Astral"
-delete-after: True
-changes:
- - rscadd: "Traitor CMOs and Chemists, for 12 TC, can now get a reagent dartgun, which is capable of synthesizing it's own syringes, but does so slowly, and can be easily identified as syndicate by anyone who isn't blind!"
diff --git a/html/changelogs/AutoChangeLog-pr-5673.yml b/html/changelogs/AutoChangeLog-pr-5673.yml
deleted file mode 100644
index 15622f81a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5673.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "enables the RPED to construct/replace other parts commonly used in machines (igniters, beakers, bs crystals)"
- - bugfix: "fixes part ratings of cells so slime cells are correctly more desirable than bluespace cells and other such nonsense"
diff --git a/html/changelogs/AutoChangeLog-pr-5674.yml b/html/changelogs/AutoChangeLog-pr-5674.yml
deleted file mode 100644
index f6359e0328..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5674.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "shivering symptom now works properly instead of only cooling you if you're already cold"
- - bugfix: "fixed bodytemp going negative in a few cases"
diff --git a/html/changelogs/AutoChangeLog-pr-5680.yml b/html/changelogs/AutoChangeLog-pr-5680.yml
deleted file mode 100644
index 025217a854..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5680.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - tweak: "Reskinning objects now shows their possible appearances in the chat box."
diff --git a/html/changelogs/AutoChangeLog-pr-5681.yml b/html/changelogs/AutoChangeLog-pr-5681.yml
deleted file mode 100644
index 0334a6ccb1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5681.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Added Bastion Bourbon, which you can mix with tea, creme de menthe, triple citrus, and berry juice. When it's in your system, it will very slowly heal you as long as you're not in critical. When it's first added to your system, you heal an amount of each damage type equal to the volume taken in, with a max of 10. This is turned to a max of 20 for anyone in critical."
- - rscadd: "Added Squirt Cider, which you can mix with water, tomato juice, and nutriment. It's nutritious and healthy!"
diff --git a/html/changelogs/AutoChangeLog-pr-5684.yml b/html/changelogs/AutoChangeLog-pr-5684.yml
deleted file mode 100644
index f460ddfb01..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5684.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "The last scientists have reported that thermonuclear blasts triggered by so called 'power gamers' have shorted the doppler array. We've readjusted the ALU and are confident that this will not happen again."
diff --git a/html/changelogs/AutoChangeLog-pr-5687.yml b/html/changelogs/AutoChangeLog-pr-5687.yml
deleted file mode 100644
index c5603175fb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5687.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - rscadd: "Lights will now actually glow in the dark!"
diff --git a/html/changelogs/AutoChangeLog-pr-5689.yml b/html/changelogs/AutoChangeLog-pr-5689.yml
deleted file mode 100644
index f6eae22630..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5689.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Tweaked the inventory management of the black fedora to be more like the detective's"
diff --git a/html/changelogs/AutoChangeLog-pr-5696.yml b/html/changelogs/AutoChangeLog-pr-5696.yml
deleted file mode 100644
index a30d82f571..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5696.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added pump action particle blasters. Shotgun eguns!"
- - rscadd: "Added the Particle Defender, unique pump action particle blaster variant that replaces the warden's taser"
- - soundadd: "added new sounds for pump action particle blaster, mostly recorded by yours truly"
- - imageadd: "added new sprites for pump action particle blasters"
diff --git a/html/changelogs/AutoChangeLog-pr-5697.yml b/html/changelogs/AutoChangeLog-pr-5697.yml
deleted file mode 100644
index 24a1d5abe2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5697.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added a syndicate exclusive .357. Replaces the original one in the uplink. All other .357s are untouched."
- - imageadd: "added new sprites for crowbars, wrenches, syndicate .357, and eguns"
diff --git a/html/changelogs/AutoChangeLog-pr-5698.yml b/html/changelogs/AutoChangeLog-pr-5698.yml
deleted file mode 100644
index 8bdc304c7f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5698.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - balance: "You can no longer gain the same trauma more than once."
- - balance: "You can no longer gain more than a certain amount of brain traumas per resilience tier. (Example: You cannot gain 4 mild traumas, but you can gain 3 mild and 1 severe)"
- - tweak: "Abductors' trauma gland now gives traumas of random resilience, instead of lobotomy every time."
diff --git a/html/changelogs/AutoChangeLog-pr-5701.yml b/html/changelogs/AutoChangeLog-pr-5701.yml
deleted file mode 100644
index b113bf0ee0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5701.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - tweak: "Operating computers now display the chemicals required to complete a surgery step, if there are any."
- - tweak: "Completing a surgery without the required chems will always result in failure, instead of a success with no effect."
diff --git a/html/changelogs/AutoChangeLog-pr-5702.yml b/html/changelogs/AutoChangeLog-pr-5702.yml
deleted file mode 100644
index 9ebcd306d6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5702.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - balance: "Wizard spells and items can now be resisted/ignored with anti-magic items/clothing such as null rods!"
- - balance: "Revenant spells can now be resisted with \"holy\" items like null rods and bibles."
- - balance: "Wizard hardsuits are now magic immune, but not holy."
- - balance: "Immortality Talismans now grant both spell and holy immunity."
- - tweak: "Inquisitor Hardsuits already granted spell and holy immunity, but now they do it properly instead of having a null rod embedded inside."
- - tweak: "Holy Melons now grant holy immunity."
diff --git a/html/changelogs/AutoChangeLog-pr-5703.yml b/html/changelogs/AutoChangeLog-pr-5703.yml
deleted file mode 100644
index 1090c34dd0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5703.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - balance: "Instead of starting unable to clone circuits at all, circuit printers can now print circuits over time from roundstart. The formula for this is equal to (metal cost / 150) seconds, with a maximum of 3 minutes. You can see printing progress by using the printer's interface, and you can print normal components during this time."
- - balance: "If circuit printing is disabled in the config, cloning remains unavailable."
- - balance: "The upgrade disk to allow circuit printers to clone circuits has been replaced with an upgrade disk to make circuit cloning instant."
- - balance: "Both circuit printer upgrade disks now cost 5000 metal and glass, down from 10000."
diff --git a/html/changelogs/AutoChangeLog-pr-5704.yml b/html/changelogs/AutoChangeLog-pr-5704.yml
deleted file mode 100644
index 30963a5296..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "Tritium no longer produces so much radiation that it crashes the server"
diff --git a/html/changelogs/AutoChangeLog-pr-5705.yml b/html/changelogs/AutoChangeLog-pr-5705.yml
deleted file mode 100644
index 9a898ad295..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5705.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - code_imp: "Butchering has been refactored."
- - balance: "Some items now take longer to butcher, and have a chance to harvest fewer items, like spears. Others, however, are faster, like circular saws."
- - balance: "Certain creatures will always drop certain items on butchering, regardless of butchering effectiveness or chances."
- - balance: "Items that are very effective at butchering may yield bonus loot from butchered creatures!"
diff --git a/html/changelogs/AutoChangeLog-pr-5707.yml b/html/changelogs/AutoChangeLog-pr-5707.yml
deleted file mode 100644
index b30b0458bf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5707.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "livers don't unfail automatically every second life cycle you have to get a new one or get some corazone stat"
- - balance: "increased liver damage from alcohol significantly because apparently your liver regenerates faster than you can chug unless you drink 100 liters of bacchus blessing"
- - bugfix: "fixed cyber livers thinking they should fail at half durability"
diff --git a/html/changelogs/AutoChangeLog-pr-5711.yml b/html/changelogs/AutoChangeLog-pr-5711.yml
deleted file mode 100644
index 637e4770ca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5711.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Plain hamburgers may now spawn as steamed hams with a very low chance."
diff --git a/html/changelogs/AutoChangeLog-pr-5713.yml b/html/changelogs/AutoChangeLog-pr-5713.yml
deleted file mode 100644
index 372798d263..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5713.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "Twisted Construction will now consume ALL available plasteel in a stack."
- - bugfix: "Runes will no longer count the original invoker more than once."
diff --git a/html/changelogs/AutoChangeLog-pr-5714.yml b/html/changelogs/AutoChangeLog-pr-5714.yml
deleted file mode 100644
index 3aea8b539a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5714.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MMMiracles"
-delete-after: True
-changes:
- - rscadd: "Added tinfoil hats, headgear that can help protect against government conspiracies and extra-terrestrials. Found in hacked autolathes."
diff --git a/html/changelogs/AutoChangeLog-pr-5717.yml b/html/changelogs/AutoChangeLog-pr-5717.yml
deleted file mode 100644
index 83cda7c017..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5717.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - bugfix: "The heart attack event will now actually make the victim acquire the heart disease"
- - bugfix: "Clicking the chatbox link will let you orbit the victim"
- - tweak: "The event is now significantly more sensitive to junk food. Recent consumption of multiple junk food items will triple your chances of having a heart attack (exercise will still block it)."
diff --git a/html/changelogs/AutoChangeLog-pr-5719.yml b/html/changelogs/AutoChangeLog-pr-5719.yml
deleted file mode 100644
index ac7d4e09a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5719.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Iamgoofball"
-delete-after: True
-changes:
- - rscadd: "Look sir, free crabs!"
diff --git a/html/changelogs/AutoChangeLog-pr-5720.yml b/html/changelogs/AutoChangeLog-pr-5720.yml
deleted file mode 100644
index 5a97f1e8d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5720.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "selea"
-delete-after: True
-changes:
- - bugfix: "fixed floorbot"
- - bugfix: "fixed cleanbot"
- - refactor: "improved pathiding in case of given minimal distance;improved sanitation"
diff --git a/html/changelogs/AutoChangeLog-pr-5722.yml b/html/changelogs/AutoChangeLog-pr-5722.yml
new file mode 100644
index 0000000000..e3f570caa2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5722.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Hypospray mk IIs are being deployed to stations, these should provide an easier time for medical staff! They come with both inject and spray modes! Spray mode acts like a patch for applying meds"
+ - soundadd: "Hyposprays are fancy, you'll know when they're being used."
+ - server: "Due to fucky-ness, you'll need to unload, then reload the hypos at least once. just how it be."
diff --git a/html/changelogs/AutoChangeLog-pr-5723.yml b/html/changelogs/AutoChangeLog-pr-5723.yml
deleted file mode 100644
index f1a0c512c1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5723.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Astral"
-delete-after: True
-changes:
- - rscadd: "blood cultists can now use a nar nar plushie as an extra invoker for runes!"
diff --git a/html/changelogs/AutoChangeLog-pr-5725.yml b/html/changelogs/AutoChangeLog-pr-5725.yml
deleted file mode 100644
index 7913b00216..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5725.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "fixed borg defibs, fix is upstream as well"
- - bugfix: "fixed missing borg animations, should've been readded ages ago"
- - rscadd: "Hound Barometers are now functional."
- - rscadd: "Fetch modules readded!"
- - rscadd: "Borgi's added!"
- - tweak: "K9 cuffs take 6 seconds, for balance reasons."
- - tweak: "self repair nerfed, healing others takes a short time but amounts are unaffected. Promoting teamwork over engiborg invincibility"
diff --git a/html/changelogs/AutoChangeLog-pr-5726.yml b/html/changelogs/AutoChangeLog-pr-5726.yml
deleted file mode 100644
index 5119596f74..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5726.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - rscadd: "Tesla Corona Analyzers! Study the seemingly magic Edison's Bane for supplemental research points!"
diff --git a/html/changelogs/AutoChangeLog-pr-5727.yml b/html/changelogs/AutoChangeLog-pr-5727.yml
deleted file mode 100644
index dc916865b0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5727.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RealDonaldTrump"
-delete-after: True
-changes:
- - tweak: "Removed the probability check from prayer beads for their low amount of healing, as well as lowering the time needed to heal from 15 seconds to 10 seconds. Slimepeople won't get harmed by prayer beads either."
diff --git a/html/changelogs/AutoChangeLog-pr-5729.yml b/html/changelogs/AutoChangeLog-pr-5729.yml
deleted file mode 100644
index 8f579124be..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5729.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscdel: "SNPCs have been removed."
diff --git a/html/changelogs/AutoChangeLog-pr-5730.yml b/html/changelogs/AutoChangeLog-pr-5730.yml
deleted file mode 100644
index 5483366e13..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5730.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "XDTM"
-delete-after: True
-changes:
- - tweak: "Bath Salts now induce psychotic rage, but cause much more brain damage."
diff --git a/html/changelogs/AutoChangeLog-pr-5733.yml b/html/changelogs/AutoChangeLog-pr-5733.yml
deleted file mode 100644
index 26cb19420a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5733.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - rscadd: "Medals now show the commendation text in the description."
diff --git a/html/changelogs/AutoChangeLog-pr-5734.yml b/html/changelogs/AutoChangeLog-pr-5734.yml
deleted file mode 100644
index 7107a79eea..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Poojawa"
-delete-after: True
-changes:
- - bugfix: "Cyborg defib units are now actually functional"
diff --git a/html/changelogs/AutoChangeLog-pr-5740.yml b/html/changelogs/AutoChangeLog-pr-5740.yml
deleted file mode 100644
index 8cb8f0ea4f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5740.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ZeroNetAlpha"
-delete-after: True
-changes:
- - tweak: "Tacticool Turtlenecks are now compliant with Nanotrasen regulations and are equipped with sensors."
diff --git a/html/changelogs/AutoChangeLog-pr-5741.yml b/html/changelogs/AutoChangeLog-pr-5741.yml
deleted file mode 100644
index 7b9dd3cd08..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5741.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - imageadd: "added new egun and laser sprites, including inhands!"
- - code_imp: "Added OVERRIDE .dmis which are copypasted upstream .dmis with changes for selective sprite changes"
diff --git a/html/changelogs/AutoChangeLog-pr-5742.yml b/html/changelogs/AutoChangeLog-pr-5742.yml
deleted file mode 100644
index 3d659591c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5742.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - bugfix: "The assault pod can be launched again."
diff --git a/html/changelogs/AutoChangeLog-pr-5746.yml b/html/changelogs/AutoChangeLog-pr-5746.yml
deleted file mode 100644
index 386a725788..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5746.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MoreRobustThanYou"
-delete-after: True
-changes:
- - bugfix: "SCP-294 should no longer have overlay problems"
diff --git a/html/changelogs/AutoChangeLog-pr-5748.yml b/html/changelogs/AutoChangeLog-pr-5748.yml
deleted file mode 100644
index 3bd53bfbe9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5748.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "AlexTheSysop"
-delete-after: True
-changes:
- - bugfix: "C4 logging now shows correct location"
diff --git a/html/changelogs/AutoChangeLog-pr-5749.yml b/html/changelogs/AutoChangeLog-pr-5749.yml
deleted file mode 100644
index 67737ca0e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5749.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Astral"
-delete-after: True
-changes:
- - imageadd: "Space is now prettier"
diff --git a/html/changelogs/AutoChangeLog-pr-5750.yml b/html/changelogs/AutoChangeLog-pr-5750.yml
deleted file mode 100644
index 8b4105acd4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5750.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - tweak: "Cargo packs have been grouped and sorted alphabetically. Station goal crates are now in the Engineering section."
- - tweak: "The cargo security section has been split into security/armory."
- - tweak: "Grouped all gas canisters and fuel/water tanks together in one section with raw materials."
- - spellcheck: "Fixed a few cargo pack descriptions."
diff --git a/html/changelogs/AutoChangeLog-pr-5751.yml b/html/changelogs/AutoChangeLog-pr-5751.yml
deleted file mode 100644
index 6bf454552d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5751.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Machines can now be constructed anchored or unanchored, if the resultant machine could be unanchored."
diff --git a/html/changelogs/AutoChangeLog-pr-5753.yml b/html/changelogs/AutoChangeLog-pr-5753.yml
deleted file mode 100644
index cdebd032c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5753.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "Traits! You can now select up to three positive, negative, and neutral traits in the character setup. You can choose up to six traits based on combinations varying by the amount of points you earn with negative traits and spend with positive ones."
diff --git a/html/changelogs/AutoChangeLog-pr-5758.yml b/html/changelogs/AutoChangeLog-pr-5758.yml
deleted file mode 100644
index 003d77ac42..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5758.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Xhuis"
-delete-after: True
-changes:
- - rscadd: "You can now splash metal sheets with copper to make bronze sheets, which you can make \"clockwork\" things out of."
diff --git a/html/changelogs/AutoChangeLog-pr-5760.yml b/html/changelogs/AutoChangeLog-pr-5760.yml
deleted file mode 100644
index 17dc336104..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5760.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Selea"
-delete-after: True
-changes:
- - balance: "reduce CD of all non manipulative non list output circuits to 0.1"
- - balance: "add to locomotion circuit output ref with object, which assembly was bumped to."
- - balance: "upgrade disks have multiuse.
-balance:iducer efficiency= efficiency/number of inducers on 1 tile."
- - balance: "unnerf fuel cell.about 3-5 times.Make blood more powerful."
diff --git a/html/changelogs/AutoChangeLog-pr-5764.yml b/html/changelogs/AutoChangeLog-pr-5764.yml
deleted file mode 100644
index 8a5e2f3867..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5764.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "Denton"
-delete-after: True
-changes:
- - bugfix: "Burglar alarms in the Pubbystation library and RD office can now be disabled properly."
- - bugfix: "Fixed Pubbystation's RD office shutters."
- - rscadd: "Added missing engineering and kitchen lockdown shutters on Pubbystation."
- - rscadd: "Pubbystation: Added privacy shutters to the CMO and RD offices. Added space shutters to the HoS office. Replaced the RD office's directional windows with fulltile ones."
- - rscadd: "Added a second blast door to the Pubbystation gulag shuttle lockdown."
- - tweak: "Due to pressure from the space OSHA, Pubbystation has installed missing fire alarms and firelocks."
- - tweak: "Split the Pubbystation library into two areas with their own APCs."
diff --git a/html/changelogs/AutoChangeLog-pr-5765.yml b/html/changelogs/AutoChangeLog-pr-5765.yml
deleted file mode 100644
index 92eac9b628..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5765.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cebutris"
-delete-after: True
-changes:
- - bugfix: "Washing a glove with a white crayon will make it look like a white glove, instead of a latex glove. Instead, mime crayons make gloves look latex"
diff --git a/html/changelogs/AutoChangeLog-pr-5767.yml b/html/changelogs/AutoChangeLog-pr-5767.yml
deleted file mode 100644
index 65310118e4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5767.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Robustin"
-delete-after: True
-changes:
- - balance: "Meth now deals 1-4 brain damage while active, up from 0.25"
diff --git a/html/changelogs/AutoChangeLog-pr-5771.yml b/html/changelogs/AutoChangeLog-pr-5771.yml
deleted file mode 100644
index 3bb62bdd20..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5771.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ZeroNetAlpha"
-delete-after: True
-changes:
- - tweak: "Blobs now start at 60 minutes and only if 50 players are online."
diff --git a/html/changelogs/AutoChangeLog-pr-5772.yml b/html/changelogs/AutoChangeLog-pr-5772.yml
deleted file mode 100644
index 0b9897e054..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5772.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - rscadd: "Added 2 new toy guns in the autoylathe, the experimental hitscan pumpaction plastic blaster, and a fancy toy revolver"
diff --git a/html/changelogs/AutoChangeLog-pr-5775.yml b/html/changelogs/AutoChangeLog-pr-5775.yml
deleted file mode 100644
index a6baa68805..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5775.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ShizCalev"
-delete-after: True
-changes:
- - rscadd: "You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!"
- - rscadd: "You can now also close a canister's valve and remove the tank inside it by alt-clicking it."
diff --git a/html/changelogs/AutoChangeLog-pr-5777.yml b/html/changelogs/AutoChangeLog-pr-5777.yml
deleted file mode 100644
index 20e217994b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5777.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Toriate"
-delete-after: True
-changes:
- - balance: "rebalanced magweapons and flechette launchers to have more sensible recoil and accuracy values"
- - balance: "various citadel exclusive guns have had their recoil and accuracy values tweaked to be less ridiculous"
diff --git a/html/changelogs/AutoChangeLog-pr-5781.yml b/html/changelogs/AutoChangeLog-pr-5781.yml
deleted file mode 100644
index d0e990e276..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5781.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Jalleo"
-delete-after: True
-changes:
- - admin: "Added a cancel button to nuke timer (and others). You no longer have to make it 0 just a click to cancel."
- - admin: "You can now easily set how many \"INSERT JOB ROLE HERE\" you want in the manage job selection in the admin panel. If you put zero in it will set it to the current amount of filled positions."
- - bugfix: "moved a small amount of wording around in a admin browser to make it cleaner looking. Along with a few updated checks for certain things."
diff --git a/html/changelogs/AutoChangeLog-pr-5783.yml b/html/changelogs/AutoChangeLog-pr-5783.yml
deleted file mode 100644
index 12f0455142..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5783.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - balance: "changed the formula of liver damage so weak alcohol does barely anything while strong alcohol is still threatening"
diff --git a/html/changelogs/AutoChangeLog-pr-5785.yml b/html/changelogs/AutoChangeLog-pr-5785.yml
deleted file mode 100644
index 30cf26aeb3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5785.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - admin: "Admins can now toggle antag, med, sci, engineering huds and maximum ghost brightness with just one button."
diff --git a/html/changelogs/AutoChangeLog-pr-5786.yml b/html/changelogs/AutoChangeLog-pr-5786.yml
deleted file mode 100644
index b53587e3e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5786.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - admin: "Admins can now easily spawn cargo crates"
diff --git a/html/changelogs/AutoChangeLog-pr-5787.yml b/html/changelogs/AutoChangeLog-pr-5787.yml
new file mode 100644
index 0000000000..6b44ee591e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5787.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Tesla Engines are now standard on all but Omega."
+ - bugfix: "fixed a pipe in Meta station that wasn't connected properly."
+ - bugfix: "fixed an exploit related to Tesla wires."
diff --git a/html/changelogs/AutoChangeLog-pr-5788.yml b/html/changelogs/AutoChangeLog-pr-5788.yml
new file mode 100644
index 0000000000..2f5d1bdd2d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5788.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - code_imp: "First pass on cleaning up junk defines and unused code"
diff --git a/html/changelogs/AutoChangeLog-pr-5789.yml b/html/changelogs/AutoChangeLog-pr-5789.yml
new file mode 100644
index 0000000000..aef3f8ad01
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5789.yml
@@ -0,0 +1,12 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added release sound effects for choosing. If having a non-belly, belly."
+ - rscadd: "Added a 'silent' modifier to bellies."
+ - rscadd: "Added a vore subsystem to handle belly processing, should be less clunky"
+ - balance: "rebalanced heal mode and dragon digestion."
+ - soundadd: "added client preference based sound toggles to both eating/release/struggle and digestion noises seperately."
+ - refactor: "vore prefs save to JSON now instead of .sav. much easier really.
+refractor: dragon vore is working, though with this game who knows."
+ - server: "your prefs should automatically transfer, but it's likely you'll lose pre-loaded bellies, BACK UP EVERYTHING. (you should be doing this anyway too)"
+ - server: "Creating new characters will import the previous' bellies. but once you click 'save' they'll make the new JSON file will all the info. This is per slot, so if you change your character, you'll have to change belly stuff."
diff --git a/html/changelogs/AutoChangeLog-pr-5794.yml b/html/changelogs/AutoChangeLog-pr-5794.yml
deleted file mode 100644
index 368a86d33d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5794.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "RandomMarine"
-delete-after: True
-changes:
- - rscdel: "The ore redemption machine no longer has 'release all' buttons. Remember to take just what you need and leave some for the other departments."
diff --git a/html/changelogs/AutoChangeLog-pr-5797.yml b/html/changelogs/AutoChangeLog-pr-5797.yml
deleted file mode 100644
index 98f52dd62f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5797.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - rscadd: "Advanced roasting sticks, a product of applied bluespace research can now be built from service protolathes. They can be used to cook sausages on campfires, supermatter engines, tesla balls, singularities and a couple of other things."
diff --git a/html/changelogs/AutoChangeLog-pr-5798.yml b/html/changelogs/AutoChangeLog-pr-5798.yml
deleted file mode 100644
index 095cb00550..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5798.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - admin: "Admins can now grant spells via implants, using the spell implant. Some VV is required."
diff --git a/html/changelogs/AutoChangeLog-pr-5799.yml b/html/changelogs/AutoChangeLog-pr-5799.yml
deleted file mode 100644
index fe57a60a02..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5799.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Dax Dupont"
-delete-after: True
-changes:
- - balance: "Others can now take off your tinfoil hat as seemingly originally intended."
- - balance: "Due to the nature of tinfoil hats, the delay of putting a tinfoil hat on unwilling participants has been increased."
diff --git a/html/changelogs/AutoChangeLog-pr-5801.yml b/html/changelogs/AutoChangeLog-pr-5801.yml
deleted file mode 100644
index 9ff5b68c7a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5801.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Potato Masher"
-delete-after: True
-changes:
- - bugfix: "The Wizard Federation has finally modified their production method for pre-packaged magic tarot cards for better compatibility with time-stopping spells. Guardians Spirits are no longer frozen by their user's time-stops."
diff --git a/html/changelogs/AutoChangeLog-pr-5802.yml b/html/changelogs/AutoChangeLog-pr-5802.yml
deleted file mode 100644
index 22db069ecb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-5802.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CitadelStationBot"
-delete-after: True
-changes:
- - tweak: "Deltastation: Removed a windoor to make the northern chemistry fridge more accessible."
diff --git a/html/changelogs/AutoChangeLog-pr-5803.yml b/html/changelogs/AutoChangeLog-pr-5803.yml
new file mode 100644
index 0000000000..39ecfb7c9d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5803.yml
@@ -0,0 +1,6 @@
+author: "Denton"
+delete-after: True
+changes:
+ - bugfix: "Pubbystation: Added a missing APC to the cargo sorting room, a light fixture to the RnD security checkpoint and removed an overlooked firelock east of the bridge."
+ - rscadd: "Pubbystation: Added a spare RPD to the Atmospherics department. Replaced Engineering's outdated meson goggles with modern engineering scanners. Added a GPS device to the secure storage crate."
+ - tweak: "Moved Pubbystation's drone shell dispenser from the experimentation lab to Robotics maint."
diff --git a/html/changelogs/AutoChangeLog-pr-5806.yml b/html/changelogs/AutoChangeLog-pr-5806.yml
new file mode 100644
index 0000000000..c21932b1cb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5806.yml
@@ -0,0 +1,4 @@
+author: "Jittai / ChuckTheSheep"
+delete-after: True
+changes:
+ - tweak: "Adjusted the space parallax's contrast to be less vibrant."
diff --git a/html/changelogs/AutoChangeLog-pr-5815.yml b/html/changelogs/AutoChangeLog-pr-5815.yml
new file mode 100644
index 0000000000..5054ef2a97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5815.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Added a new mini antagonist, the sentient disease."
diff --git a/html/changelogs/AutoChangeLog-pr-5821.yml b/html/changelogs/AutoChangeLog-pr-5821.yml
new file mode 100644
index 0000000000..86c02f0379
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5821.yml
@@ -0,0 +1,4 @@
+author: "selea"
+delete-after: True
+changes:
+ - bugfix: "After several months of natural selection, hostile mobs started to attack assemblies with combat circuits."
diff --git a/html/changelogs/AutoChangeLog-pr-5822.yml b/html/changelogs/AutoChangeLog-pr-5822.yml
new file mode 100644
index 0000000000..7592b0a1dd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5822.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Widescreen pref works again."
diff --git a/html/changelogs/AutoChangeLog-pr-5825.yml b/html/changelogs/AutoChangeLog-pr-5825.yml
new file mode 100644
index 0000000000..d16ba7b816
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5825.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - admin: "Admins can now easily spawn mobs that look like objects. Googly eyes optional!"
diff --git a/html/changelogs/AutoChangeLog-pr-5828.yml b/html/changelogs/AutoChangeLog-pr-5828.yml
new file mode 100644
index 0000000000..121f22e488
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5828.yml
@@ -0,0 +1,8 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscdel: "Removed old things in .dms we weren't using anymore"
+ - tweak: "subtle messages are now italic'd, so there's better context on whispering"
+ - tweak: "broke apart the cit_gun.dm file, they're decently spaced out now"
+ - tweak: "dogborg_sleeper is now standalone from dogborg_equipment because too lazy to debug why it was breaking backpacks."
+ - tweak: "does that thing I've been meaning to do with Xenobio. additional tools have been provided."
diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi
index a518b2d2fc..181b76007d 100755
Binary files a/icons/effects/parallax.dmi and b/icons/effects/parallax.dmi differ
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
index 4e5806f2fb..20daacd32c 100644
Binary files a/icons/mob/actions/actions_minor_antag.dmi and b/icons/mob/actions/actions_minor_antag.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index c275e66752..c27834de5c 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/obj/citadel/hypospray.dmi b/icons/obj/citadel/hypospray.dmi
new file mode 100644
index 0000000000..f5e89227c7
Binary files /dev/null and b/icons/obj/citadel/hypospray.dmi differ
diff --git a/icons/obj/citadel/vial.dmi b/icons/obj/citadel/vial.dmi
new file mode 100644
index 0000000000..23bceb93b9
Binary files /dev/null and b/icons/obj/citadel/vial.dmi differ
diff --git a/code/citadel/icons/areas.dmi b/modular_citadel/code/game/area/areas.dmi
similarity index 100%
rename from code/citadel/icons/areas.dmi
rename to modular_citadel/code/game/area/areas.dmi
diff --git a/code/citadel/cit_areas.dm b/modular_citadel/code/game/area/cit_areas.dm
similarity index 70%
rename from code/citadel/cit_areas.dm
rename to modular_citadel/code/game/area/cit_areas.dm
index 42879b7408..ae36ed6df5 100644
--- a/code/citadel/cit_areas.dm
+++ b/modular_citadel/code/game/area/cit_areas.dm
@@ -1,6 +1,6 @@
/area/maintenance/bar
name = "Maintenance Bar"
- icon = 'code/citadel/icons/areas.dmi'
+ icon = 'modular_citadel/code/game/area/areas.dmi'
icon_state = "maintbar"
/area/maintenance/bar/cafe
@@ -14,5 +14,5 @@
/area/crew_quarters/cryopod
name = "Cryogenics"
- icon = 'code/citadel/icons/areas.dmi'
+ icon = 'modular_citadel/code/game/area/areas.dmi'
icon_state = "cryo"
\ No newline at end of file
diff --git a/code/citadel/cit_displaycases.dm b/modular_citadel/code/game/machinery/displaycases.dm
similarity index 100%
rename from code/citadel/cit_displaycases.dm
rename to modular_citadel/code/game/machinery/displaycases.dm
diff --git a/code/citadel/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
similarity index 100%
rename from code/citadel/plasmacases.dm
rename to modular_citadel/code/game/machinery/plasmacases.dm
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 130c93d854..6905efd88d 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -1,3 +1,106 @@
/obj/machinery/vending/security
contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/device/ssword_kit = 1)
- premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1)
\ No newline at end of file
+ premium = list(/obj/item/coin/antagtoken = 1, /obj/item/device/ssword_kit = 1)
+
+#define STANDARD_CHARGE 1
+#define CONTRABAND_CHARGE 2
+#define COIN_CHARGE 3
+
+/obj/machinery/vending/kink
+ name = "KinkMate"
+ desc = "A vending machine for all your unmentionable desires."
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "kink"
+ product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
+ vend_reply = "Have fun, you shameless pervert!"
+ products = list(
+ /obj/item/clothing/under/maid = 5,
+ /obj/item/clothing/under/stripper_pink = 5,
+ /obj/item/clothing/under/stripper_green = 5,
+ /obj/item/dildo/custom = 5
+ )
+ contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
+ /obj/item/clothing/neck/petcollar = 5,
+ /obj/item/clothing/under/mankini = 1,
+ /obj/item/dildo/flared/huge = 1
+ )
+ premium = list(/obj/item/device/electropack/shockcollar = 1)
+ refill_canister = /obj/item/vending_refill/kink
+/*
+/obj/machinery/vending/nazivend
+ name = "Nazivend"
+ desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\""
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "nazi"
+ vend_reply = "SIEG HEIL!"
+ product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*"
+ products = list(
+ /obj/item/clothing/head/stalhelm = 20,
+ /obj/item/clothing/head/panzer = 20,
+ /obj/item/clothing/suit/soldiercoat = 20,
+ // /obj/item/clothing/under/soldieruniform = 20,
+ /obj/item/clothing/shoes/jackboots = 20
+ )
+ contraband = list(
+ /obj/item/clothing/head/naziofficer = 10,
+ // /obj/item/clothing/suit/officercoat = 10,
+ // /obj/item/clothing/under/officeruniform = 10,
+ /obj/item/clothing/suit/space/hardsuit/nazi = 3,
+ /obj/item/gun/energy/plasma/MP40k = 4
+ )
+ premium = list()
+
+ refill_canister = /obj/item/vending_refill/nazi
+*/
+/obj/machinery/vending/sovietvend
+ name = "KomradeVendtink"
+ desc = "Rodina-mat' zovyot!"
+ icon = 'icons/obj/citvending.dmi'
+ icon_state = "soviet"
+ vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!"
+ product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!"
+ products = list(
+ /obj/item/clothing/under/soviet = 20,
+ /obj/item/clothing/head/ushanka = 20,
+ /obj/item/clothing/shoes/jackboots = 20,
+ /obj/item/clothing/head/squatter_hat = 20,
+ /obj/item/clothing/under/squatter_outfit = 20,
+ /obj/item/clothing/under/russobluecamooutfit = 20,
+ /obj/item/clothing/head/russobluecamohat = 20
+ )
+ contraband = list(
+ /obj/item/clothing/under/syndicate/tacticool = 4,
+ /obj/item/clothing/mask/balaclava = 4,
+ /obj/item/clothing/suit/russofurcoat = 4,
+ /obj/item/clothing/head/russofurhat = 4,
+ /obj/item/clothing/suit/space/hardsuit/soviet = 3,
+ /obj/item/gun/energy/laser/LaserAK = 4
+ )
+ premium = list()
+
+ refill_canister = /obj/item/vending_refill/soviet
+
+
+#undef STANDARD_CHARGE
+#undef CONTRABAND_CHARGE
+#undef COIN_CHARGE
+
+
+/obj/item/vending_refill/kink
+ machine_name = "KinkMate"
+ icon = 'modular_citadel/icons/vending_restock.dmi'
+ icon_state = "refill_kink"
+ charges = list(8, 5, 0)// of 20 standard, 12 contraband, 0 premium
+ init_charges = list(8, 5, 0)
+
+/obj/item/vending_refill/nazi
+ machine_name = "nazivend"
+ icon_state = "refill_nazi"
+ charges = list(33, 13, 0)
+ init_charges = list(33, 13, 0)
+
+/obj/item/vending_refill/soviet
+ machine_name = "sovietvend"
+ icon_state = "refill_soviet"
+ charges = list(47, 7, 0)
+ init_charges = list(47, 7, 0)
diff --git a/code/citadel/cit_spawners.dm b/modular_citadel/code/game/objects/effects/spawner/spawners.dm
similarity index 100%
rename from code/citadel/cit_spawners.dm
rename to modular_citadel/code/game/objects/effects/spawner/spawners.dm
diff --git a/code/citadel/cit_genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm
similarity index 100%
rename from code/citadel/cit_genemods.dm
rename to modular_citadel/code/game/objects/items/devices/genemods.dm
diff --git a/code/citadel/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
similarity index 100%
rename from code/citadel/cit_crewobjectives.dm
rename to modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
diff --git a/code/citadel/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm
similarity index 100%
rename from code/citadel/cit_miscreants.dm
rename to modular_citadel/code/modules/antagonists/cit_miscreants.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_cargo.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_civilian.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_command.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_engineering.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_medical.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_science.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
diff --git a/code/citadel/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
similarity index 100%
rename from code/citadel/crew_objectives/cit_crewobjectives_security.dm
rename to modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
diff --git a/code/citadel/cit_arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
similarity index 99%
rename from code/citadel/cit_arousal.dm
rename to modular_citadel/code/modules/arousal/arousal.dm
index 077824fe9e..584acc6eb6 100644
--- a/code/citadel/cit_arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -142,7 +142,7 @@
/obj/screen/arousal
name = "arousal"
icon_state = "arousal0"
- icon = 'code/citadel/icons/hud.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/hud.dmi'
screen_loc = ui_arousal
/obj/screen/arousal/Click()
diff --git a/code/citadel/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
similarity index 96%
rename from code/citadel/organs/breasts.dm
rename to modular_citadel/code/modules/arousal/organs/breasts.dm
index 901c546212..ea44c6d671 100644
--- a/code/citadel/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -2,7 +2,7 @@
name = "breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
- icon = 'code/citadel/icons/breasts.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = "chest"
slot = "breasts"
w_class = 3
diff --git a/code/citadel/organs/eggsack.dm b/modular_citadel/code/modules/arousal/organs/eggsack.dm
similarity index 87%
rename from code/citadel/organs/eggsack.dm
rename to modular_citadel/code/modules/arousal/organs/eggsack.dm
index 1486310d61..27104cd36a 100644
--- a/code/citadel/organs/eggsack.dm
+++ b/modular_citadel/code/modules/arousal/organs/eggsack.dm
@@ -2,7 +2,7 @@
name = "Egg sack"
desc = "An egg producing reproductive organ."
icon_state = "egg_sack"
- icon = 'code/citadel/icons/ovipositor.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = "groin"
slot = "testicles"
color = null //don't use the /genital color since it already is colored
diff --git a/code/citadel/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
similarity index 100%
rename from code/citadel/organs/genitals.dm
rename to modular_citadel/code/modules/arousal/organs/genitals.dm
diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
similarity index 83%
rename from code/citadel/organs/genitals_sprite_accessories.dm
rename to modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
index 710bab787c..7c02b1c3a5 100644
--- a/code/citadel/organs/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
@@ -4,7 +4,7 @@
//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis
- icon = 'code/citadel/icons/penis_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
icon_state = null
name = "penis" //the preview name of the accessory
gender_specific = 0 //Might be needed somewhere down the list.
@@ -35,21 +35,21 @@
// Taur cocks go here //
////////////////////////
/datum/sprite_accessory/penis/taur_flared
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "flared"
name = "Taur, Flared"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_knotted
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "knotted"
name = "Taur, Knotted"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_tapered
- icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
+ icon = 'modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi' //Needed larger width
icon_state = "tapered"
name = "Taur, Tapered"
center = TRUE //Center the image 'cause 2-tile wide.
@@ -60,7 +60,7 @@
//Vaginas
/datum/sprite_accessory/vagina
- icon = 'code/citadel/icons/vagina_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi'
icon_state = null
name = "vagina"
gender_specific = 0
@@ -90,7 +90,7 @@
//BREASTS BE HERE
/datum/sprite_accessory/breasts
- icon = 'code/citadel/icons/breasts_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
icon_state = null
name = "breasts"
gender_specific = 0
@@ -104,7 +104,7 @@
//OVIPOSITORS BE HERE
/datum/sprite_accessory/ovipositor
- icon = 'code/citadel/icons/penis_onmob.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis_onmob.dmi'
icon_state = null
name = "Ovipositor" //the preview name of the accessory
gender_specific = 0 //Might be needed somewhere down the list.
diff --git a/code/citadel/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
similarity index 88%
rename from code/citadel/organs/ovipositor.dm
rename to modular_citadel/code/modules/arousal/organs/ovipositor.dm
index 3d684ee387..76bf60d93c 100644
--- a/code/citadel/organs/ovipositor.dm
+++ b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
@@ -2,7 +2,7 @@
name = "Ovipositor"
desc = "An egg laying reproductive organ."
icon_state = "ovi_knotted_2"
- icon = 'code/citadel/icons/ovipositor.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/ovipositor.dmi'
zone = "groin"
slot = "penis"
w_class = 3
diff --git a/code/citadel/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
similarity index 97%
rename from code/citadel/organs/penis.dm
rename to modular_citadel/code/modules/arousal/organs/penis.dm
index 509ed72ef4..ae58aabf51 100644
--- a/code/citadel/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -2,7 +2,7 @@
name = "penis"
desc = "A male reproductive organ."
icon_state = "penis"
- icon = 'code/citadel/icons/penis.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
slot = "penis"
w_class = 3
diff --git a/code/citadel/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
similarity index 96%
rename from code/citadel/organs/testicles.dm
rename to modular_citadel/code/modules/arousal/organs/testicles.dm
index bb3ade6048..815d8034e7 100644
--- a/code/citadel/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -2,7 +2,7 @@
name = "testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
- icon = 'code/citadel/icons/penis.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
slot = "testicles"
w_class = 3
diff --git a/code/citadel/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
similarity index 97%
rename from code/citadel/organs/vagina.dm
rename to modular_citadel/code/modules/arousal/organs/vagina.dm
index 1f19dc7e64..4d9eedb1cf 100644
--- a/code/citadel/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/vagina
name = "vagina"
desc = "A female reproductive organ."
- icon = 'code/citadel/icons/vagina.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
icon_state = "vagina"
zone = "groin"
slot = "vagina"
diff --git a/code/citadel/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm
similarity index 94%
rename from code/citadel/organs/womb.dm
rename to modular_citadel/code/modules/arousal/organs/womb.dm
index 433f005623..c59d74e629 100644
--- a/code/citadel/organs/womb.dm
+++ b/modular_citadel/code/modules/arousal/organs/womb.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital/womb
name = "womb"
desc = "A female reproductive organ."
- icon = 'code/citadel/icons/vagina.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/vagina.dmi'
icon_state = "womb"
zone = "groin"
slot = "womb"
diff --git a/code/citadel/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm
similarity index 98%
rename from code/citadel/toys/dildos.dm
rename to modular_citadel/code/modules/arousal/toys/dildos.dm
index d216ed86ba..45f4f5a64a 100644
--- a/code/citadel/toys/dildos.dm
+++ b/modular_citadel/code/modules/arousal/toys/dildos.dm
@@ -4,7 +4,7 @@
obj/item/dildo
name = "dildo"
desc = "Floppy!"
- icon = 'code/citadel/icons/dildo.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
damtype = BRUTE
force = 0
throwforce = 0
diff --git a/modular_citadel/code/modules/client/preferences_toggles.dm b/modular_citadel/code/modules/client/preferences_toggles.dm
new file mode 100644
index 0000000000..4b92a1e9c3
--- /dev/null
+++ b/modular_citadel/code/modules/client/preferences_toggles.dm
@@ -0,0 +1,22 @@
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleeatingnoise)()
+ set name = "Toggle Eating Noises"
+ set category = "Preferences"
+ set desc = "Hear Eating noises"
+ usr.client.prefs.toggles ^= EATING_NOISES
+ usr.client.prefs.save_preferences()
+ usr.stop_sound_channel(CHANNEL_PRED)
+ to_chat(usr, "You will [(usr.client.prefs.toggles & EATING_NOISES) ? "now" : "no longer"] hear eating noises.")
+/datum/verbs/menu/Settings/Sound/toggleeatingnoise/Get_checked(client/C)
+ return !(C.prefs.toggles & EATING_NOISES)
+
+
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggledigestionnoise)()
+ set name = "Toggle Digestion Noises"
+ set category = "Preferences"
+ set desc = "Hear digestive noises"
+ usr.client.prefs.toggles ^= DIGESTION_NOISES
+ usr.client.prefs.save_preferences()
+ usr.stop_sound_channel(CHANNEL_DIGEST)
+ to_chat(usr, "You will [(usr.client.prefs.toggles & DIGESTION_NOISES) ? "now" : "no longer"] hear digestion noises.")
+/datum/verbs/menu/Settings/Sound/toggledigestionnoise/Get_checked(client/C)
+ return !(C.prefs.toggles & DIGESTION_NOISES)
diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm
new file mode 100644
index 0000000000..776da896bd
--- /dev/null
+++ b/modular_citadel/code/modules/clothing/suits/suits.dm
@@ -0,0 +1,13 @@
+/*/////////////////////////////////////////////////////////////////////////////////
+/////// ///////
+/////// Cit's exclusive suits, armor, etc. go here ///////
+/////// ///////
+*//////////////////////////////////////////////////////////////////////////////////
+
+
+/obj/item/clothing/suit/armor/hos/trenchcoat/cloak
+ name = "armored trenchcloak"
+ desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.."
+ alternate_worn_icon = 'icons/mob/citadel/suit.dmi'
+ icon_state = "hostrench"
+ item_state = "hostrench"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/under.dm b/modular_citadel/code/modules/clothing/under.dm
deleted file mode 100644
index bf77704122..0000000000
--- a/modular_citadel/code/modules/clothing/under.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/obj/item/clothing/under/syndicate/cosmetic
- name = "tactitool turtleneck"
- desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
- icon_state = "tactifool"
- item_state = "bl_suit"
- item_color = "tactifool"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/clothing/under/syndicate.dm b/modular_citadel/code/modules/clothing/under/syndicate.dm
deleted file mode 100644
index 5364d4a0fb..0000000000
--- a/modular_citadel/code/modules/clothing/under/syndicate.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/item/clothing/under/syndicate/tacticool
- has_sensor = TRUE
diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
index 47432d87f7..2f40a08dc3 100644
--- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm
+++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
@@ -19,4 +19,59 @@
/obj/structure/closet/secure_closet/CMO/PopulateContents() //This is placed here because it's a very specific addition for a very specific niche
..()
- new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src)
\ No newline at end of file
+ new /obj/item/clothing/under/rank/chief_medical_officer/turtleneck(src)
+
+/obj/item/clothing/under/syndicate/cosmetic
+ name = "tactitool turtleneck"
+ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
+ icon_state = "tactifool"
+ item_state = "bl_suit"
+ item_color = "tactifool"
+ has_sensor = TRUE
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
+
+/obj/item/clothing/under/syndicate/tacticool
+ has_sensor = TRUE
+
+// Sweaters are good enough for this category too.
+
+/obj/item/clothing/under/bb_sweater
+ name = "cream sweater"
+ desc = "Why trade style for comfort? Now you can go commando down south and still be cozy up north."
+ icon_state = "bb_turtle"
+ item_state = "w_suit"
+ item_color = "bb_turtle"
+ body_parts_covered = CHEST|ARMS
+ can_adjust = 1
+ icon = 'icons/obj/clothing/turtlenecks.dmi'
+ icon_override = 'icons/mob/citadel/uniforms.dmi'
+
+/obj/item/clothing/under/bb_sweater/black
+ name = "black sweater"
+ icon_state = "bb_turtleblk"
+ item_state = "bl_suit"
+ item_color = "bb_turtleblk"
+
+/obj/item/clothing/under/bb_sweater/purple
+ name = "purple sweater"
+ icon_state = "bb_turtlepur"
+ item_state = "p_suit"
+ item_color = "bb_turtlepur"
+
+/obj/item/clothing/under/bb_sweater/green
+ name = "green sweater"
+ icon_state = "bb_turtlegrn"
+ item_state = "g_suit"
+ item_color = "bb_turtlegrn"
+
+/obj/item/clothing/under/bb_sweater/red
+ name = "red sweater"
+ icon_state = "bb_turtlered"
+ item_state = "r_suit"
+ item_color = "bb_turtlered"
+
+/obj/item/clothing/under/bb_sweater/blue
+ name = "blue sweater"
+ icon_state = "bb_turtleblu"
+ item_state = "b_suit"
+ item_color = "bb_turtleblu"
diff --git a/code/citadel/cit_clothes.dm b/modular_citadel/code/modules/clothing/under/under.dm
similarity index 72%
rename from code/citadel/cit_clothes.dm
rename to modular_citadel/code/modules/clothing/under/under.dm
index dd83c6b769..042273ac6a 100644
--- a/code/citadel/cit_clothes.dm
+++ b/modular_citadel/code/modules/clothing/under/under.dm
@@ -21,11 +21,4 @@
icon_state = "hosskirt"
icon_override = 'icons/mob/citadel/uniforms.dmi'
item_state = "gy_suit"
- item_color = "hosskirt"
-
-/obj/item/clothing/suit/armor/hos/trenchcoat/cloak
- name = "armored trenchcloak"
- desc = "A trenchcoat enchanced with a special lightweight kevlar. This one appears to be designed to be draped over one's shoulders rather than worn normally.."
- alternate_worn_icon = 'icons/mob/citadel/suit.dmi'
- icon_state = "hostrench"
- item_state = "hostrench"
\ No newline at end of file
+ item_color = "hosskirt"
\ No newline at end of file
diff --git a/code/citadel/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
similarity index 100%
rename from code/citadel/custom_loadout/custom_items.dm
rename to modular_citadel/code/modules/custom_loadout/custom_items.dm
diff --git a/code/citadel/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm
similarity index 100%
rename from code/citadel/custom_loadout/load_to_mob.dm
rename to modular_citadel/code/modules/custom_loadout/load_to_mob.dm
diff --git a/code/citadel/custom_loadout/read_from_file.dm b/modular_citadel/code/modules/custom_loadout/read_from_file.dm
similarity index 100%
rename from code/citadel/custom_loadout/read_from_file.dm
rename to modular_citadel/code/modules/custom_loadout/read_from_file.dm
diff --git a/code/citadel/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
similarity index 100%
rename from code/citadel/cit_emotes.dm
rename to modular_citadel/code/modules/mob/cit_emotes.dm
diff --git a/code/citadel/dogborgs.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm
similarity index 100%
rename from code/citadel/dogborgs.dm
rename to modular_citadel/code/modules/mob/living/silicon/robot/dogborg archive.dm
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
new file mode 100644
index 0000000000..dceaf9d1c5
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -0,0 +1,401 @@
+/*
+DOG BORG EQUIPMENT HERE
+SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
+*/
+
+/obj/item/dogborg/jaws/big
+ name = "combat jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "jaws"
+ desc = "The jaws of the law."
+ flags_1 = CONDUCT_1
+ force = 12
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ w_class = 3
+ sharpness = IS_SHARP
+
+/obj/item/dogborg/jaws/small
+ name = "puppy jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "smalljaws"
+ desc = "The jaws of a small dog."
+ flags_1 = CONDUCT_1
+ force = 6
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
+ w_class = 3
+ sharpness = IS_SHARP
+
+/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
+ ..()
+ user.do_attack_animation(A, ATTACK_EFFECT_BITE)
+
+/obj/item/dogborg/jaws/small/attack_self(mob/user)
+ var/mob/living/silicon/robot.R = user
+ if(R.emagged)
+ name = "combat jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "jaws"
+ desc = "The jaws of the law."
+ flags_1 = CONDUCT_1
+ force = 12
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ w_class = 3
+ sharpness = IS_SHARP
+ else
+ name = "puppy jaws"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "smalljaws"
+ desc = "The jaws of a small dog."
+ flags_1 = CONDUCT_1
+ force = 5
+ throwforce = 0
+ hitsound = 'sound/weapons/bite.ogg'
+ attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
+ w_class = 3
+ sharpness = IS_SHARP
+ update_icon()
+
+
+//Cuffs
+
+/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
+ if(!C.handcuffed)
+ playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2)
+ C.visible_message("[user] is trying to put zipties on [C]!", \
+ "[user] is trying to put zipties on [C]!")
+ if(do_mob(user, C, 60))
+ if(!C.handcuffed)
+ C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
+ C.update_inv_handcuffed(0)
+ to_chat(user,"You handcuff [C].")
+ playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
+ add_logs(user, C, "handcuffed")
+ else
+ to_chat(user,"You fail to handcuff [C]!")
+
+
+//Boop
+
+/obj/item/device/analyzer/nose
+ name = "boop module"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "nose"
+ desc = "The BOOP module"
+ flags_1 = CONDUCT_1
+ force = 0
+ throwforce = 0
+ attack_verb = list("nuzzled", "nosed", "booped")
+ w_class = 1
+
+/obj/item/device/analyzer/nose/attack_self(mob/user)
+ user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.")
+
+ var/turf/location = user.loc
+ if(!istype(location))
+ return
+
+ var/datum/gas_mixture/environment = location.return_air()
+
+ var/pressure = environment.return_pressure()
+ var/total_moles = environment.total_moles()
+
+ to_chat(user, "Results:")
+ if(abs(pressure - ONE_ATMOSPHERE) < 10)
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
+ else
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
+ if(total_moles)
+ var/list/env_gases = environment.gases
+
+ environment.assert_gases(arglist(GLOB.hardcoded_gases))
+ var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles
+ var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles
+ var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles
+ var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles
+ environment.garbage_collect()
+
+ if(abs(n2_concentration - N2STANDARD) < 20)
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
+ else
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
+
+ if(abs(o2_concentration - O2STANDARD) < 2)
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
+ else
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
+
+ if(co2_concentration > 0.01)
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
+ else
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
+
+ if(plasma_concentration > 0.005)
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
+ else
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
+
+
+ for(var/id in env_gases)
+ if(id in GLOB.hardcoded_gases)
+ continue
+ var/gas_concentration = env_gases[id][MOLES]/total_moles
+ to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %")
+ to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C")
+
+/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens
+ . = ..()
+
+//Delivery
+
+/obj/item/storage/bag/borgdelivery
+ name = "fetching storage"
+ desc = "Fetch the thing!"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "dbag"
+ //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm)
+ w_class = 5
+ max_w_class = 2
+ max_combined_w_class = 2
+ storage_slots = 1
+ collection_mode = 0
+ can_hold = list() // any
+ cant_hold = list(/obj/item/disk/nuclear)
+
+
+//Tongue stuff
+
+/obj/item/soap/tongue
+ name = "synthetic tongue"
+ desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "synthtongue"
+ hitsound = 'sound/effects/attackblob.ogg'
+ cleanspeed = 80
+
+/obj/item/soap/tongue/scrubpup
+ cleanspeed = 25 //slightly faster than a mop.
+
+/obj/item/soap/tongue/New()
+ ..()
+ flags_1 |= NOBLUDGEON_1 //No more attack messages
+
+/obj/item/trash/rkibble
+ name = "robo kibble"
+ desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state= "kibble"
+
+/obj/item/soap/tongue/attack_self(mob/user)
+ var/mob/living/silicon/robot.R = user
+ if(R.emagged)
+ name = "hacked tongue of doom"
+ desc = "Your tongue has been upgraded successfully. Congratulations."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "syndietongue"
+ cleanspeed = 10 //(nerf'd)tator soap stat
+ else
+ name = "synthetic tongue"
+ desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "synthtongue"
+ cleanspeed = initial(cleanspeed)
+ update_icon()
+
+/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
+ var/mob/living/silicon/robot.R = user
+ if(!proximity || !check_allowed_items(target))
+ return
+ if(R.client && (target in R.client.screen))
+ to_chat(R, "You need to take that [target.name] off before cleaning it!")
+ else if(is_cleanable(target))
+ R.visible_message("[R] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish licking off \the [target.name].")
+ qdel(target)
+ R.cell.give(50)
+ else if(isobj(target)) //hoo boy. danger zone man
+ if(istype(target,/obj/item/trash))
+ R.visible_message("[R] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish off \the [target.name].")
+ qdel(target)
+ R.cell.give(250)
+ return
+ if(istype(target,/obj/item/stock_parts/cell))
+ R.visible_message("[R] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...")
+ if(do_after(R, 50, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't eat them.
+ to_chat(R, "You finish off \the [target.name].")
+ var/obj/item/stock_parts/cell.C = target
+ R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
+ qdel(target)
+ return
+ var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT
+ if(!I.anchored && R.emagged)
+ R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...")
+ if(do_after(R, 100, target = I)) //Nerf dat time yo
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
+ return //If they moved away, you can't eat them.
+ visible_message("[R] chews up \the [target.name] and cleans off the debris!")
+ to_chat(R, "You finish off \the [target.name].")
+ qdel(I)
+ R.cell.give(500)
+ return
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R,"You clean \the [target.name].")
+ var/obj/effect/decal/cleanable/C = locate() in target
+ qdel(C)
+ SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ else if(ishuman(target))
+ if(R.emagged)
+ var/mob/living/L = target
+ if(R.cell.charge <= 666)
+ return
+ L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
+ L.Knockdown(80)
+ L.apply_effect(STUTTER, 4)
+ L.visible_message("[R] has shocked [L] with its tongue!", \
+ "[R] has shocked you with its tongue! You can feel the betrayal.")
+ playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
+ R.cell.use(666)
+ else
+ R.visible_message("\the [R] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!")
+ playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ return
+ else if(istype(target, /obj/structure/window))
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R, "You clean \the [target.name].")
+ target.color = initial(target.color)
+ else
+ R.visible_message("[R] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
+ if(do_after(R, src.cleanspeed, target = target))
+ if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
+ return //If they moved away, you can't clean them.
+ to_chat(R, "You clean \the [target.name].")
+ var/obj/effect/decal/cleanable/C = locate() in target
+ qdel(C)
+ SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ return
+
+
+//Defibs
+
+/obj/item/twohanded/shockpaddles/cyborg/hound
+ name = "Paws of Life"
+ desc = "MediHound specific shock paws."
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "defibpaddles0"
+ item_state = "defibpaddles0"
+
+// Pounce stuff for K-9
+
+/obj/item/dogborg/pounce
+ name = "pounce"
+ icon = 'icons/mob/dogborg.dmi'
+ icon_state = "pounce"
+ desc = "Leap at your target to momentarily stun them."
+ force = 0
+ throwforce = 0
+
+/obj/item/dogborg/pounce/New()
+ ..()
+ flags_1 |= NOBLUDGEON_1
+
+/mob/living/silicon/robot
+ var/leaping = 0
+ var/pounce_cooldown = 0
+ var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
+ var/pounce_spoolup = 3
+ var/leap_at
+ var/disabler
+ var/laser
+ var/sleeper_g
+ var/sleeper_r
+
+#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
+
+/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
+ var/mob/living/silicon/robot/R = user
+ if(R && !R.pounce_cooldown)
+ R.pounce_cooldown = !R.pounce_cooldown
+ to_chat(R, "Your targeting systems lock on to [A]...")
+ addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup)
+ spawn(R.pounce_cooldown_time)
+ R.pounce_cooldown = !R.pounce_cooldown
+ else if(R && R.pounce_cooldown)
+ to_chat(R, "Your leg actuators are still recharging!")
+
+/mob/living/silicon/robot/proc/leap_at(atom/A)
+ if(leaping || stat || buckled || lying)
+ return
+
+ if(!has_gravity(src) || !has_gravity(A))
+ to_chat(src,"It is unsafe to leap without gravity!")
+ //It's also extremely buggy visually, so it's balance+bugfix
+ return
+
+ if(cell.charge <= 500)
+ to_chat(src,"Insufficent reserves for jump actuators!")
+ return
+
+ else
+ leaping = 1
+ weather_immunities += "lava"
+ pixel_y = 10
+ update_icons()
+ throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
+ cell.use(500) //Doubled the energy consumption
+ weather_immunities -= "lava"
+
+/mob/living/silicon/robot/throw_impact(atom/A)
+
+ if(!leaping)
+ return ..()
+
+ if(A)
+ if(isliving(A))
+ var/mob/living/L = A
+ var/blocked = 0
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
+ blocked = 1
+ if(!blocked)
+ L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
+ L.Knockdown(45)
+ playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
+ sleep(2)//Runtime prevention (infinite bump() calls on hulks)
+ step_towards(src,L)
+ else
+ Knockdown(45, 1, 1)
+
+ pounce_cooldown = !pounce_cooldown
+ spawn(pounce_cooldown_time) //3s by default
+ pounce_cooldown = !pounce_cooldown
+ else if(A.density && !A.CanPass(src))
+ visible_message("[src] smashes into [A]!", "You smash into [A]!")
+ playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
+ Knockdown(45, 1, 1)
+
+ if(leaping)
+ leaping = 0
+ pixel_y = initial(pixel_y)
+ update_icons()
+ update_canmove()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index af30ff3349..dd7d492575 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -67,6 +67,7 @@
/obj/item/soap/tongue,
/obj/item/device/healthanalyzer,
/obj/item/device/dogborg/sleeper/medihound,
+ /obj/item/reagent_containers/borghypo,
/obj/item/twohanded/shockpaddles/cyborg/hound,
/obj/item/stack/medical/gauze/cyborg,
/obj/item/device/sensor_device)
diff --git a/code/citadel/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
similarity index 100%
rename from code/citadel/pokemon.dm
rename to modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
new file mode 100644
index 0000000000..28dfeb89d6
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
@@ -0,0 +1,117 @@
+//////Flechette Launcher//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/cflechetteap //shreds armor
+ name = "flechette (armor piercing)"
+ damage = 8
+ armour_penetration = 80
+
+/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
+ name = "flechette (serrated)"
+ damage = 15
+ dismemberment = 10
+ armour_penetration = -80
+
+/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.bleed(10)
+ return ..()
+
+///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
+
+/obj/item/ammo_casing/caseless/flechetteap
+ name = "flechette (armor piercing)"
+ desc = "A flechette made with a tungsten alloy."
+ projectile_type = /obj/item/projectile/bullet/cflechetteap
+ caliber = "flechette"
+ throwforce = 1
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/flechettes
+ name = "flechette (serrated)"
+ desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+ caliber = "flechette"
+ throwforce = 2
+ throw_speed = 3
+ embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
+
+///magazine///
+
+/obj/item/ammo_box/magazine/flechette
+ name = "flechette magazine (armor piercing)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettemag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteap
+ caliber = "flechette"
+ max_ammo = 40
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/flechette/s
+ name = "flechette magazine (serrated)"
+ ammo_type = /obj/item/ammo_casing/caseless/flechettes
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/flechette
+ name = "\improper CX Flechette Launcher"
+ desc = "A flechette launching machine pistol with an unconventional bullpup frame."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettegun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = 0
+ /obj/item/device/firing_pin/implant/pindicate
+ mag_type = /obj/item/ammo_box/magazine/flechette/
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 5
+ fire_delay = 1
+ casing_ejector = 0
+ spread = 10
+ recoil = 0.05
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("flechettegun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///unique variant///
+
+/obj/item/projectile/bullet/cflechetteshredder
+ name = "flechette (shredder)"
+ damage = 5
+ dismemberment = 40
+
+/obj/item/ammo_casing/caseless/flechetteshredder
+ name = "flechette (shredder)"
+ desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+
+/obj/item/ammo_box/magazine/flechette/shredder
+ name = "flechette magazine (shredder)"
+ icon_state = "shreddermag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
+
+/obj/item/gun/ballistic/automatic/flechette/shredder
+ name = "\improper CX Shredder"
+ desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/flechette/shredder
+ spread = 15
+ recoil = 0.1
+
+/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("shreddergun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
new file mode 100644
index 0000000000..487d5111fc
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
@@ -0,0 +1,424 @@
+////////////Anti Tank Pistol////////////
+
+/obj/item/gun/ballistic/automatic/pistol/antitank
+ name = "Anti Tank Pistol"
+ desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "atp"
+ item_state = "pistol"
+ recoil = 4
+ mag_type = /obj/item/ammo_box/magazine/sniper_rounds
+ fire_delay = 50
+ burst_size = 1
+ can_suppress = 0
+ w_class = WEIGHT_CLASS_NORMAL
+ actions_types = list()
+ fire_sound = 'sound/weapons/blastcannon.ogg'
+ spread = 20 //damn thing has no rifling.
+
+/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("atp-mag")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate
+ name = "Syndicate Anti Tank Pistol"
+ desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
+ pin = /obj/item/device/firing_pin/implant/pindicate
+
+/* made redundant by reskinnable stetchkins
+//////Stealth Pistol//////
+
+/obj/item/gun/ballistic/automatic/pistol/stealth
+ name = "stealth pistol"
+ desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "stealthpistol"
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/m10mm
+ can_suppress = 0
+ fire_sound = 'sound/weapons/gunshot_silenced.ogg'
+ suppressed = 1
+ burst_size = 1
+
+/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("stealthpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+*/
+
+///foam stealth pistol///
+
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth
+ name = "foam force stealth pistol"
+ desc = "A small, easily concealable toy bullpup handgun. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "foamsp"
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/toy/pistol
+ can_suppress = FALSE
+ fire_sound = 'sound/weapons/gunshot_silenced.ogg'
+ suppressed = TRUE
+ burst_size = 1
+ fire_delay = 0
+ spread = 20
+ actions_types = list()
+
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("foamsp-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+//////10mm soporific bullets//////
+
+obj/item/projectile/bullet/c10mm/soporific
+ name ="10mm soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+
+/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.blur_eyes(6)
+ if(L.getStaminaLoss() >= 60)
+ L.Sleeping(300)
+ else
+ L.adjustStaminaLoss(25)
+ return 1
+
+/obj/item/ammo_casing/c10mm/soporific
+ name = ".10mm soporific bullet casing"
+ desc = "A 10mm soporific bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm/soporific
+
+/obj/item/ammo_box/magazine/m10mm/soporific
+ name = "pistol magazine (10mm soporific)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "9x19pS"
+ desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target."
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+
+/obj/item/ammo_box/c10mm/soporific
+ name = "ammo box (10mm soporific)"
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+ max_ammo = 24
+
+//////modular pistol////// (reskinnable stetchkins)
+
+/obj/item/gun/ballistic/automatic/pistol/modular
+ name = "modular pistol"
+ desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "cde"
+ can_unsuppress = TRUE
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Default" = "cde",
+ "NT-99" = "n99",
+ "Stealth" = "stealthpistol",
+ "HKVP-78" = "vp78",
+ "Luger" = "p08b",
+ "Mk.58" = "secguncomp",
+ "PX4 Storm" = "px4"
+ )
+
+/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
+ ..()
+ if(current_skin)
+ icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ else
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ if(magazine && suppressed)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
+ else if (magazine)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine")
+ else
+ cut_overlays()
+
+/////////RAYGUN MEMES/////////
+
+/obj/item/projectile/beam/lasertag/ray //the projectile, compatible with regular laser tag armor
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "ray"
+ name = "ray bolt"
+ eyeblur = 0
+
+/obj/item/ammo_casing/energy/laser/raytag
+ projectile_type = /obj/item/projectile/beam/lasertag/ray
+ select_name = "raytag"
+ fire_sound = 'sound/weapons/raygun.ogg'
+
+/obj/item/gun/energy/laser/practice/raygun
+ name = "toy ray gun"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "raygun"
+ desc = "A toy laser with a classic, retro feel and look. Compatible with existing laser tag systems."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/raytag)
+ selfcharge = TRUE
+
+/*/////////////////////////////////////////////////////////////////////////////////////////////
+ The Recolourable Gun
+*//////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/item/gun/ballistic/automatic/pistol/p37
+ name = "\improper CX Mk.37P"
+ desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. \
+ This model is coated with a special polychromic material. \
+ Has a small warning on the receiver that boldly states 'WARNING: WILL DETONATE UPON UNAUTHORIZED USE'. \
+ Uses 9mm bullets loaded into proprietary magazines."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "p37"
+ w_class = WEIGHT_CLASS_NORMAL
+ spawnwithmagazine = FALSE
+ mag_type = /obj/item/ammo_box/magazine/m9mm/p37
+ can_suppress = FALSE
+ pin = /obj/item/device/firing_pin/dna/dredd //goes boom if whoever isn't DNA locked to it tries to use it
+ actions_types = list(/datum/action/item_action/pick_color)
+
+ var/frame_color = "#808080" //RGB
+ var/receiver_color = "#808080"
+ var/body_color = "#0098FF"
+ var/barrel_color = "#808080"
+ var/tip_color = "#808080"
+ var/arm_color = "#808080"
+ var/grip_color = "#00FFCB" //Does not actually colour the grip, just the lights surrounding it
+ var/energy_color = "#00FFCB"
+
+///Defining all the colourable bits and displaying them///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/update_icon()
+ var/mutable_appearance/frame_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_frame")
+ var/mutable_appearance/receiver_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_receiver")
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_body")
+ var/mutable_appearance/barrel_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_barrel")
+ var/mutable_appearance/tip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_tip")
+ var/mutable_appearance/grip_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_grip")
+ var/mutable_appearance/energy_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_light")
+ var/mutable_appearance/arm_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm")
+ var/mutable_appearance/arm_overlay_e = mutable_appearance('icons/obj/guns/cit_guns.dmi', "p37_arm-e")
+
+ if(frame_color)
+ frame_overlay.color = frame_color
+ if(receiver_color)
+ receiver_overlay.color = receiver_color
+ if(body_color)
+ body_overlay.color = body_color
+ if(barrel_color)
+ barrel_overlay.color = barrel_color
+ if(tip_color)
+ tip_overlay.color = tip_color
+ if(grip_color)
+ grip_overlay.color = grip_color
+ if(energy_color)
+ energy_overlay.color = energy_color
+ if(arm_color)
+ arm_overlay.color = arm_color
+ if(arm_color)
+ arm_overlay_e.color = arm_color
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(frame_overlay)
+ add_overlay(receiver_overlay)
+ add_overlay(body_overlay)
+ add_overlay(barrel_overlay)
+ add_overlay(tip_overlay)
+ add_overlay(grip_overlay)
+ add_overlay(energy_overlay)
+
+ if(magazine) //does not need a cut_overlays proc call here because it's already called further up
+ add_overlay("p37_mag")
+
+ if(chambered)
+ cut_overlay(arm_overlay_e)
+ add_overlay(arm_overlay)
+ else
+ cut_overlay(arm_overlay)
+ add_overlay(arm_overlay_e)
+
+///letting you actually recolor things///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/ui_action_click(mob/user, var/datum/action/A)
+ if(istype(A, /datum/action/item_action/pick_color))
+
+ var/choice = input(user,"Mk.37P polychrome options", "Gun Recolor") in list("Frame Color","Receiver Color","Body Color",
+ "Barrel Color", "Barrel Tip Color", "Grip Light Color",
+ "Light Color", "Arm Color", "*CANCEL*")
+
+ switch(choice)
+
+ if("Frame Color")
+ var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null
+ if(frame_color_input)
+ frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Receiver Color")
+ var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null
+ if(receiver_color_input)
+ receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Body Color")
+ var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Barrel Color")
+ var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null
+ if(barrel_color_input)
+ barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Barrel Tip Color")
+ var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null
+ if(tip_color_input)
+ tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Grip Light Color")
+ var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null
+ if(grip_color_input)
+ grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Light Color")
+ var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null
+ if(energy_color_input)
+ energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+ if("Arm Color")
+ var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null
+ if(arm_color_input)
+ arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ A.UpdateButtonIcon()
+
+ else
+ ..()
+
+///boolets///
+
+/obj/item/projectile/bullet/c9mm/frangible
+ name = "9mm frangible bullet"
+ damage = 15
+ stamina = 0
+ speed = 1.0
+ range = 20
+ armour_penetration = -25
+
+/obj/item/projectile/bullet/c9mm/rubber
+ name = "9mm rubber bullet"
+ damage = 5
+ stamina = 30
+ speed = 1.2
+ range = 14
+ knockdown = 0
+
+/obj/item/ammo_casing/c9mm/frangible
+ name = "9mm frangible bullet casing"
+ desc = "A 9mm frangible bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c9mm/frangible
+
+/obj/item/ammo_casing/c9mm/rubber
+ name = "9mm rubber bullet casing"
+ desc = "A 9mm rubber bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c9mm/rubber
+
+/obj/item/ammo_box/magazine/m9mm/p37
+ name = "\improper P37 magazine (9mm frangible)"
+ desc = "A gun magazine. Loaded with plastic composite rounds which fragment upon impact to minimize collateral damage."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "11mm" //topkek
+ ammo_type = /obj/item/ammo_casing/c9mm/frangible
+ caliber = "9mm"
+ max_ammo = 11
+ multiple_sprites = 1
+
+/obj/item/ammo_box/magazine/m9mm/p37/fmj
+ name = "\improper P37 magazine (9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ desc = "A gun magazine. Loaded with conventional full metal jacket rounds."
+
+/obj/item/ammo_box/magazine/m9mm/p37/rubber
+ name = "\improper P37 magazine (9mm Non-Lethal Rubbershot)"
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+ desc = "A gun magazine. Loaded with less-than-lethal rubber bullets."
+
+/obj/item/ammo_box/c9mm/frangible
+ name = "ammo box (9mm frangible)"
+ ammo_type = /obj/item/ammo_casing/c9mm/frangible
+
+/obj/item/ammo_box/c9mm/rubber
+ name = "ammo box (9mm non-lethal rubbershot)"
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+
+/datum/design/c9mmfrag
+ name = "Box of 9mm Frangible Bullets"
+ id = "9mm_frag"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 25000)
+ build_path = /obj/item/ammo_box/c9mm/frangible
+ category = list("hacked", "Security")
+
+/datum/design/c9mmrubber
+ name = "Box of 9mm Rubber Bullets"
+ id = "9mm_rubber"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 30000)
+ build_path = /obj/item/ammo_box/c9mm/rubber
+ category = list("initial", "Security")
+
+
+///Security Variant///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/sec
+ name = "\improper CX Mk.37S"
+ desc = "A modern reimagining of an old legendary gun, the Mk.37 is a handgun with a toggle-locking mechanism manufactured by CX Armories. Uses 9mm bullets loaded into proprietary magazines."
+ spawnwithmagazine = FALSE
+ pin = /obj/item/device/firing_pin/implant/mindshield
+ actions_types = list() //so you can't recolor it
+
+ frame_color = "#808080" //RGB
+ receiver_color = "#808080"
+ body_color = "#282828"
+ barrel_color = "#808080"
+ tip_color = "#808080"
+ arm_color = "#800000"
+ grip_color = "#FFFF00" //Does not actually colour the grip, just the lights surrounding it
+ energy_color = "#FFFF00"
+
+///Foam Variant because WE NEED MEMES///
+
+/obj/item/gun/ballistic/automatic/pistol/p37/foam
+ name = "\improper Foam Force Mk.37F"
+ desc = "A licensed foam-firing reproduction of a handgun with a toggle-locking mechanism manufactured by CX Armories. This model is coated with a special polychromic material. Uses standard foam pistol magazines."
+ icon_state = "p37_foam"
+ pin = /obj/item/device/firing_pin
+ spawnwithmagazine = TRUE
+ obj_flags = 0
+ casing_ejector = FALSE
+ mag_type = /obj/item/ammo_box/magazine/toy/pistol
+ can_suppress = FALSE
+ actions_types = list(/datum/action/item_action/pick_color)
+
+/obj/item/ammo_box/magazine/toy/pistol //forcing this might be a bad idea, but it'll fix the foam gun infinite material exploit
+ materials = list(MAT_METAL = 200)
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
new file mode 100644
index 0000000000..cd4ec113de
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -0,0 +1,466 @@
+///////XCOM X9 AR///////
+
+/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
+ name = "\improper X9 Assault Rifle"
+ desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "x9"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
+ fire_delay = 1
+ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
+ recoil = 1
+
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "\improper Foam Force X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+////////XCOM2 Magpistol/////////
+
+//////projectiles//////
+
+/obj/item/projectile/bullet/mags
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile"
+ damage = 15
+ armour_penetration = 10
+ light_range = 2
+ speed = 0.6
+ range = 25
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/nlmags //non-lethal boolets
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-nl"
+ damage = 0
+ knockdown = 0
+ stamina = 25
+ armour_penetration = -10
+ light_range = 2
+ speed = 0.7
+ range = 25
+ light_color = LIGHT_COLOR_BLUE
+
+
+/////actual ammo/////
+
+/obj/item/ammo_casing/caseless/amags
+ desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "mags"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags
+
+/obj/item/ammo_casing/caseless/anlmags
+ desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "mags"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmags
+
+//////magazines/////
+
+/obj/item/ammo_box/magazine/mmag/small
+ name = "magpistol magazine (non-lethal disabler)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "nlmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/anlmags
+ caliber = "mags"
+ max_ammo = 15
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/small/lethal
+ name = "magpistol magazine (lethal)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "smallmagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/amags
+
+//////the gun itself//////
+
+/obj/item/gun/ballistic/automatic/pistol/mag
+ name = "magpistol"
+ desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magpistol"
+ force = 10
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ mag_type = /obj/item/ammo_box/magazine/mmag/small
+ can_suppress = 0
+ casing_ejector = 0
+ fire_delay = 2
+ recoil = 0.2
+
+/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("magpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///research memes///
+
+/obj/item/gun/ballistic/automatic/pistol/mag/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+
+/datum/design/magpistol
+ name = "Magpistol"
+ desc = "A weapon which fires ferromagnetic slugs."
+ id = "magpisol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol
+ name = "Magpistol Magazine"
+ desc = "A 14 round magazine for the Magpistol."
+ id = "mag_magpistol"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magpistol/nl
+ name = "Magpistol Magazine (Non-Lethal)"
+ desc = "A 14 round non-lethal magazine for the Magpistol."
+ id = "mag_magpistol_nl"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
+ build_path = /obj/item/ammo_box/magazine/mmag/small
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+//////toy memes/////
+
+/obj/item/projectile/bullet/reusable/foam_dart/mag
+ name = "magfoam dart"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-toy"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
+
+/obj/item/ammo_casing/caseless/foam_dart/mag
+ name = "magfoam dart"
+ desc = "A foam dart with fun light-up projectiles powered by magnets!"
+ projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag
+
+/obj/item/ammo_box/magazine/internal/shot/toy/mag
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 14
+
+/obj/item/gun/ballistic/shotgun/toy/mag
+ name = "foam force magpistol"
+ desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toymag"
+ item_state = "gun"
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag
+ fire_sound = 'sound/weapons/magpistol.ogg'
+ slot_flags = SLOT_BELT
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/ammo_box/foambox/mag
+ name = "ammo box (Magnetic Foam Darts)"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ max_ammo = 42
+
+//////Magrifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/magrifle
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large"
+ damage = 20
+ armour_penetration = 25
+ light_range = 3
+ speed = 0.7
+ range = 35
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large-nl"
+ damage = 0
+ knockdown = 0
+ stamina = 25
+ armour_penetration = -10
+ light_range = 3
+ speed = 0.65
+ range = 35
+ light_color = LIGHT_COLOR_BLUE
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/amagm
+ desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/magrifle
+
+/obj/item/ammo_casing/caseless/anlmagm
+ desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmagrifle
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mmag/
+ name = "magrifle magazine (non-lethal disabler)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/anlmagm
+ caliber = "magm"
+ max_ammo = 24
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/lethal
+ name = "magrifle magazine (lethal)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ ammo_type = /obj/item/ammo_casing/caseless/amagm
+ max_ammo = 24
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/magrifle
+ name = "\improper Magnetic Rifle"
+ desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magrifle"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/mmag
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ can_suppress = 0
+ burst_size = 3
+ fire_delay = 2
+ spread = 5
+ recoil = 0.15
+ casing_ejector = 0
+
+///research///
+
+/obj/item/gun/ballistic/automatic/magrifle/nopin
+ pin = null
+ spawnwithmagazine = FALSE
+
+/datum/design/magrifle
+ name = "Magrifle"
+ desc = "An upscaled Magpistol in rifle form."
+ id = "magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle
+ name = "Magrifle Magazine (Lethal)"
+ desc = "A 24-round magazine for the Magrifle."
+ id = "mag_magrifle"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
+ build_path = /obj/item/ammo_box/magazine/mmag/lethal
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/mag_magrifle/nl
+ name = "Magrifle Magazine (Non-Lethal)"
+ desc = "A 24- round non-lethal magazine for the Magrifle."
+ id = "mag_magrifle_nl"
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+///foamagrifle///
+
+/obj/item/ammo_box/magazine/toy/foamag
+ name = "foam force magrifle magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "foamagmag"
+ max_ammo = 24
+ multiple_sprites = 2
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/magrifle/toy
+ name = "foamag rifle"
+ desc = "A foam launching magnetic rifle. Ages 8 and up."
+ icon_state = "foamagrifle"
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/foamag
+ casing_ejector = FALSE
+ spread = 60
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+/*
+// TECHWEBS IMPLEMENTATION
+*/
+
+/datum/techweb_node/magnetic_weapons
+ id = "magnetic_weapons"
+ display_name = "Magnetic Weapons"
+ description = "Weapons using magnetic technology"
+ prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
+ design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
+ research_cost = 2500
+ export_price = 5000
+
+
+//////Hyper-Burst Rifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/mags/hyper
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile"
+ damage = 10
+ armour_penetration = 10
+ stamina = 10
+ forcedodge = TRUE
+ range = 6
+ light_range = 1
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/mags/hyper/inferno
+ icon_state = "magjectile-large"
+ stamina = 0
+ forcedodge = FALSE
+ range = 25
+ light_range = 4
+
+/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 1, 2, 4, 5)
+ return 1
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/ahyper
+ desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
+ caliber = "hypermag"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyper-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags/hyper
+ pellets = 12
+ variance = 40
+
+/obj/item/ammo_casing/caseless/ahyper/inferno
+ projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
+ pellets = 1
+ variance = 0
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mhyper
+ name = "hyper-burst rifle magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hypermag-4"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper
+ caliber = "hypermag"
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/mhyper/update_icon()
+ ..()
+ icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
+
+/obj/item/ammo_box/magazine/mhyper/inferno
+ name = "hyper-burst rifle magazine (inferno)"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
+
+///gun itself///
+
+/obj/item/gun/ballistic/automatic/hyperburst
+ name = "\improper Hyper-Burst Rifle"
+ desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyperburst"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/mhyper
+ fire_sound = 'sound/weapons/magburst.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 40
+ recoil = 2
+ casing_ejector = 0
+ weapon_weight = WEAPON_HEAVY
+
+/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
+ ..()
+ icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
+
+///toy memes///
+
+/obj/item/projectile/beam/lasertag/mag //the projectile, compatible with regular laser tag armor
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-toy"
+ name = "lasertag magbolt"
+ forcedodge = TRUE //for penetration memes
+ range = 5 //so it isn't super annoying
+ light_range = 2
+ light_color = LIGHT_COLOR_YELLOW
+ eyeblur = 0
+
+/obj/item/ammo_casing/energy/laser/magtag
+ projectile_type = /obj/item/projectile/beam/lasertag/mag
+ select_name = "magtag"
+ pellets = 3
+ variance = 30
+ e_cost = 1000
+ fire_sound = 'sound/weapons/magburst.ogg'
+
+/obj/item/gun/energy/laser/practice/hyperburst
+ name = "toy hyper-burst launcher"
+ desc = "A toy laser with a unique beam shaping lens that projects harmless bolts capable of going through objects. Compatible with existing laser tag systems."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/magtag)
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toyburst"
+ clumsy_check = FALSE
+ obj_flags = 0
+ fire_delay = 40
+ weapon_weight = WEAPON_HEAVY
+ selfcharge = TRUE
+ charge_delay = 2
+ recoil = 2
+ cell_type = /obj/item/stock_parts/cell/toymagburst
+
+/obj/item/stock_parts/cell/toymagburst
+ name = "toy mag burst rifle power supply"
+ maxcharge = 4000
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
new file mode 100644
index 0000000000..a9824c7d33
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -0,0 +1,234 @@
+
+///////XCOM X9 AR///////
+
+/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them
+ name = "\improper X9 Assault Rifle"
+ desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "x9"
+ item_state = "arg"
+ slot_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine.
+ fire_delay = 1
+ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
+ recoil = 1
+
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "\improper Foam Force X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ obj_flags = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 90 //MAXIMUM XCOM MEMES (actually that'd be 180 spread)
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY
+
+
+//////Flechette Launcher//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/cflechetteap //shreds armor
+ name = "flechette (armor piercing)"
+ damage = 8
+ armour_penetration = 80
+
+/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
+ name = "flechette (serrated)"
+ damage = 15
+ dismemberment = 10
+ armour_penetration = -80
+
+/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.bleed(10)
+ return ..()
+
+///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
+
+/obj/item/ammo_casing/caseless/flechetteap
+ name = "flechette (armor piercing)"
+ desc = "A flechette made with a tungsten alloy."
+ projectile_type = /obj/item/projectile/bullet/cflechetteap
+ caliber = "flechette"
+ throwforce = 1
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/flechettes
+ name = "flechette (serrated)"
+ desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+ caliber = "flechette"
+ throwforce = 2
+ throw_speed = 3
+ embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
+
+///magazine///
+
+/obj/item/ammo_box/magazine/flechette
+ name = "flechette magazine (armor piercing)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettemag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteap
+ caliber = "flechette"
+ max_ammo = 40
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/flechette/s
+ name = "flechette magazine (serrated)"
+ ammo_type = /obj/item/ammo_casing/caseless/flechettes
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/flechette
+ name = "\improper CX Flechette Launcher"
+ desc = "A flechette launching machine pistol with an unconventional bullpup frame."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettegun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = 0
+ /obj/item/device/firing_pin/implant/pindicate
+ mag_type = /obj/item/ammo_box/magazine/flechette/
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 5
+ fire_delay = 1
+ casing_ejector = 0
+ spread = 10
+ recoil = 0.05
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("flechettegun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///unique variant///
+
+/obj/item/projectile/bullet/cflechetteshredder
+ name = "flechette (shredder)"
+ damage = 5
+ dismemberment = 40
+
+/obj/item/ammo_casing/caseless/flechetteshredder
+ name = "flechette (shredder)"
+ desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+
+/obj/item/ammo_box/magazine/flechette/shredder
+ name = "flechette magazine (shredder)"
+ icon_state = "shreddermag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
+
+/obj/item/gun/ballistic/automatic/flechette/shredder
+ name = "\improper CX Shredder"
+ desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/flechette/shredder
+ spread = 15
+ recoil = 0.1
+
+/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("shreddergun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/*/////////////////////////////////////////////////////////////
+//////////////////////// Zero's Meme //////////////////////////
+*//////////////////////////////////////////////////////////////
+/obj/item/ammo_box/magazine/toy/AM4B
+ name = "foam force AM4-B magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4MAG-60"
+ max_ammo = 60
+ multiple_sprites = 0
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/AM4B
+ name = "AM4-B"
+ desc = "A Relic from a bygone age. Nobody quite knows why it's here. Has a polychromic coating."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4"
+ item_state = "arg"
+ mag_type = /obj/item/ammo_box/magazine/toy/AM4B
+ can_suppress = 0
+ item_flags = NEEDS_PERMIT
+ casing_ejector = 0
+ spread = 30 //Assault Rifleeeeeee
+ w_class = WEIGHT_CLASS_NORMAL
+ burst_size = 4 //Shh.
+ fire_delay = 1
+ var/body_color = "#3333aa"
+
+/obj/item/gun/ballistic/automatic/AM4B/update_icon()
+ ..()
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "AM4-Body")
+ if(body_color)
+ body_overlay.color = body_color
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+ add_overlay(body_overlay)
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
+
+/obj/item/ammo_box/magazine/toy/AM4C
+ name = "foam force AM4-C magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4MAG-32"
+ max_ammo = 32
+ multiple_sprites = 0
+ materials = list(MAT_METAL = 200)
+
+/obj/item/gun/ballistic/automatic/AM4C
+ name = "AM4-C"
+ desc = "A Relic from a bygone age. This one seems newer, yet less effective."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "AM4C"
+ item_state = "arg"
+ mag_type = /obj/item/ammo_box/magazine/toy/AM4C
+ can_suppress = 0
+ item_flags = NEEDS_PERMIT
+ casing_ejector = 0
+ spread = 45 //Assault Rifleeeeeee
+ w_class = WEIGHT_CLASS_NORMAL
+ burst_size = 4 //Shh.
+ fire_delay = 1
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
new file mode 100644
index 0000000000..5b42f9686a
--- /dev/null
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
@@ -0,0 +1,90 @@
+/////////////spinfusor stuff////////////////
+
+/obj/item/projectile/bullet/spinfusor
+ name ="spinfusor disk"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state= "spinner"
+ damage = 30
+ dismemberment = 25
+
+/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE
+ ..()
+ explosion(target, -1, -1, 2, 0, -1)
+ return 1
+
+/obj/item/ammo_casing/caseless/spinfusor
+ name = "spinfusor disk"
+ desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!"
+ projectile_type = /obj/item/projectile/bullet/spinfusor
+ caliber = "spinfusor"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "disk"
+ throwforce = 15 //still deadly when thrown
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown
+ if(!..()) // not caught in mid-air
+ visible_message("[src] detonates!")
+ playsound(src.loc, "sparks", 50, 1)
+ explosion(target, -1, -1, 1, 1, -1)
+ qdel(src)
+ return 1
+
+/obj/item/ammo_box/magazine/internal/spinfusor
+ name = "spinfusor internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/spinfusor
+ caliber = "spinfusor"
+ max_ammo = 1
+
+/obj/item/gun/ballistic/automatic/spinfusor
+ name = "Stormhammer Magnetic Cannon"
+ desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "spinfusor"
+ item_state = "spinfusor"
+ mag_type = /obj/item/ammo_box/magazine/internal/spinfusor
+ fire_sound = 'sound/weapons/rocketlaunch.ogg'
+ w_class = WEIGHT_CLASS_BULKY
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 40
+ select = 0
+ actions_types = list()
+ casing_ejector = 0
+
+/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params)
+ var/num_loaded = magazine.attackby(A, user, params, 1)
+ if(num_loaded)
+ to_chat(user, "You load [num_loaded] disk\s into \the [src].")
+ update_icon()
+ chamber_round()
+
+/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user)
+ return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor
+
+/obj/item/gun/ballistic/automatic/spinfusor/update_icon()
+ ..()
+ icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]"
+
+/obj/item/ammo_box/aspinfusor
+ name = "ammo box (spinfusor disks)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "spinfusorbox"
+ ammo_type = /obj/item/ammo_casing/caseless/spinfusor
+ max_ammo = 8
+
+/datum/supply_pack/security/armory/spinfusor
+ name = "Stormhammer Spinfusor Crate"
+ cost = 14000
+ contains = list(/obj/item/gun/ballistic/automatic/spinfusor,
+ /obj/item/gun/ballistic/automatic/spinfusor)
+ crate_name = "spinfusor crate"
+
+/datum/supply_pack/security/armory/spinfusorammo
+ name = "Spinfusor Disk Crate"
+ cost = 7000
+ contains = list(/obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor,
+ /obj/item/ammo_box/aspinfusor)
+ crate_name = "spinfusor disk crate"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index e054e65ac5..fb488fcca4 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -1,7 +1,56 @@
/obj/item/gun/energy/e_gun
+ name = "blaster carbine"
+ desc = "A high powered particle blaster carbine with varitable setting for stunning or lethal applications."
icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
ammo_x_offset = 2
flight_x_offset = 17
- flight_y_offset = 11
\ No newline at end of file
+ flight_y_offset = 11
+
+
+/*/////////////////////////////////////////////////////////////////////////////////////////////
+ The Recolourable Energy Gun
+*//////////////////////////////////////////////////////////////////////////////////////////////
+
+obj/item/gun/energy/e_gun/cx
+ name = "\improper CX Model D Energy Gun"
+ desc = "An overpriced hybrid energy gun with two settings: disable, and kill. Manufactured by CX Armories. Has a polychromic coating."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "cxe"
+ lefthand_file = 'icons/mob/citadel/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/citadel/guns_righthand.dmi'
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
+ flight_x_offset = 15
+ flight_y_offset = 10
+ var/body_color = "#252528"
+
+obj/item/gun/energy/e_gun/cx/update_icon()
+ ..()
+ var/mutable_appearance/body_overlay = mutable_appearance('icons/obj/guns/cit_guns.dmi', "cxegun_body")
+ if(body_color)
+ body_overlay.color = body_color
+ add_overlay(body_overlay)
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+
+obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
+ if(body_color_input)
+ body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+
+obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
+ . = ..()
+ if(isinhands)
+ var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body")
+ body_inhand.color = body_color
+ . += body_inhand
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
index 316c976f6a..25ae98e72a 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
@@ -1,4 +1,6 @@
/obj/item/gun/energy/laser
+ name = "blaster rifle"
+ desc = "a high energy particle blaster, efficient and deadly."
icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
ammo_x_offset = 1
shaded_charge = 1
@@ -14,4 +16,31 @@
/obj/item/gun/energy/laser/redtag
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
\ No newline at end of file
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+
+/obj/item/gun/energy/laser/carbine
+ name = "VGS blaster carbine"
+ desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "lasernew"
+ item_state = "laser"
+ force = 10
+ throwforce = 10
+ ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
+ cell_type = /obj/item/stock_parts/cell/lascarbine
+
+/obj/item/gun/energy/laser/carbine/nopin
+ pin = null
+
+/obj/item/stock_parts/cell/lascarbine
+ name = "laser carbine power supply"
+ maxcharge = 2500
+
+/datum/design/lasercarbine
+ name = "VGS Blaster Carbine"
+ desc = "Beefed up version of a normal blaster carbine."
+ id = "lasercarbine"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
+ build_path = /obj/item/gun/energy/laser/carbine/nopin
+ category = list("Weapons")
\ No newline at end of file
diff --git a/code/citadel/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
similarity index 93%
rename from code/citadel/cit_kegs.dm
rename to modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
index d7e4ac03b9..d40dba8a3f 100644
--- a/code/citadel/cit_kegs.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
@@ -1,7 +1,7 @@
/obj/structure/reagent_dispensers/keg
name = "keg"
desc = "A keg."
- icon = 'code/citadel/icons/objects.dmi'
+ icon = 'modular_citadel/icons/obj/objects.dmi'
icon_state = "keg"
reagent_id = "water"
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
new file mode 100644
index 0000000000..e89068c95f
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
@@ -0,0 +1,223 @@
+#define HYPO_SPRAY 0
+#define HYPO_INJECT 1
+
+//A vial-loaded hypospray. Cartridge-based!
+/obj/item/reagent_containers/hypospray/mkii
+ name = "hypospray mk.II"
+ icon = 'modular_citadel/icons/obj/hypospraymkii.dmi'
+ icon_state = "hypo2"
+ var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small)
+ desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping."
+ volume = 0
+ amount_per_transfer_from_this = 5
+ possible_transfer_amounts = list(5,10,15)
+ var/mode = HYPO_INJECT
+ var/obj/item/reagent_containers/glass/bottle/vial/vial
+ var/loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/small
+ var/spawnwithvial = TRUE
+ var/start_vial = null
+
+/obj/item/reagent_containers/hypospray/mkii/CMO
+ name = "hypospray mk.II deluxe"
+ allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large)
+ icon_state = "cmo2"
+ ignore_flags = 1
+ desc = "The Chief Medical Officer's hypospray is identically functional to the base model, excepting that it can take larger vials in addition to regular sized. It is also able to penetrate harder materials and deliver more reagents per spray."
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ loaded_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
+ possible_transfer_amounts = list(5,10,15,30,60) //cmo hypo should be able to dump lots into it
+
+/obj/item/reagent_containers/hypospray/mkii/Initialize()
+ . = ..()
+ if(!spawnwithvial)
+ update_icon()
+ return
+ if (!start_vial)
+ start_vial = new loaded_vial(src)
+ vial = start_vial
+ update_icon()
+
+/obj/item/reagent_containers/hypospray/mkii/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][vial ? "" : "-e"]"
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/examine(mob/user)
+ . = ..()
+ to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
+
+/obj/item/reagent_containers/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ reagents.trans_to(V, reagents.total_volume)
+ reagents.maximum_volume = 0
+ V.forceMove(user.loc)
+ user.put_in_hands(V)
+ to_chat(user, "You remove the vial from the [src].")
+ vial = null
+ update_icon()
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
+ else
+ to_chat(user, "This hypo isn't loaded!")
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/attackby(obj/item/I, mob/living/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null))
+ to_chat(user, "[src] can not hold more than one vial!")
+ return FALSE
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ if(!is_type_in_list(V, allowed_containers))
+ to_chat(user, "\The [src] doesn't accept this vial.")
+ return
+ vial = V
+ reagents.maximum_volume = V.volume
+ V.reagents.trans_to(src, V.reagents.total_volume)
+ if(!user.transferItemToLoc(V,src))
+ return
+ user.visible_message("[user] has loads vial into \the [src].","You have loaded [vial] into \the [src].")
+ update_icon()
+ playsound(loc, 'sound/weapons/autoguninsert.ogg', 50, 1)
+ return TRUE
+ else
+ to_chat(user, "This doesn't fit in \the [src].")
+ return FALSE
+ return FALSE
+
+/obj/item/reagent_containers/hypospray/mkii/attack(obj/item/I, mob/user, params)
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+
+ if(!ismob(target))
+ return
+
+ var/mob/living/L
+ if(isliving(target))
+ L = target
+ if(!L.can_inject(user, 1))
+ return
+
+ if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles
+ to_chat(user, "You cannot directly fill [target]!")
+ return
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "[target] is full.")
+ return
+
+ if(ishuman(L))
+ var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
+ if(!affecting)
+ to_chat(user, "The limb is missing!")
+ return
+ if(affecting.status != BODYPART_ORGANIC)
+ to_chat(user, "Medicine won't work on a robotic limb!")
+ return
+
+ var/contained = reagents.log_list()
+ add_logs(user, L, "attemped to inject", src, addition="which had [contained]")
+//Always log attemped injections for admins
+ if(vial != null)
+ switch(mode)
+ if(HYPO_INJECT)
+ if(L) //living mob
+ if(!L.can_inject(user, TRUE))
+ return
+ if(L != user)
+ L.visible_message("[user] is trying to inject [L] with [src]!", \
+ "[user] is trying to inject [L] with the [src]!")
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]!", \
+ "[user] uses the [src] on [L]!")
+ else
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
+ L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
+
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(L, INJECT, fraction)
+ reagents.trans_to(target, amount_per_transfer_from_this)
+ if(amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.")
+
+ if(HYPO_SPRAY)
+ if(L) //living mob
+ if(!L.can_inject(user, TRUE))
+ return
+ if(L != user)
+ L.visible_message("[user] is trying to inject [L] with [src]!", \
+ "[user] is trying to inject [L] with the [src]!")
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]!", \
+ "[user] uses the [src] on [L]!")
+ else
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject,user,1)))
+ return
+ if(!reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
+ L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(L, PATCH, fraction)
+ reagents.trans_to(target, amount_per_transfer_from_this)
+ if(amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You spray [amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [reagents.total_volume] units.")
+ else
+ to_chat(user, "[src] doesn't work here!")
+ return
+
+/obj/item/reagent_containers/hypospray/mkii/AltClick(mob/living/user)
+ if(user)
+ if(user.incapacitated())
+ return
+ else if(!contents)
+ to_chat(user, "This Hypo needs to be loaded first!")
+ return
+ else
+ for(var/obj/item/I in contents)
+ unload_hypo(I,user)
+
+/obj/item/reagent_containers/hypospray/mkii/verb/modes()
+ set name = "Change Application Method"
+ set category = "Object"
+ set src in usr
+ var/mob/M = usr
+ var/choice = alert(M, "Which application mode should this be? Current mode is: [mode ? "Spray" : "Inject"]", "", "Spray", "Cancel", "Inject")
+ switch(choice)
+ if("Cancel")
+ return
+ if("Inject")
+ mode = HYPO_INJECT
+ to_chat(M, "[src] is now set to inject contents on application.")
+ if("Spray")
+ mode = HYPO_SPRAY
+ to_chat(M, "[src] is now set to spray contents on application.")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
new file mode 100644
index 0000000000..e3e82e22a7
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
@@ -0,0 +1,116 @@
+/obj/item/reagent_containers/glass/bottle/vial
+ name = "hypospray vial"
+ desc = "This is a vial suitable for loading into mk II hyposprays."
+ icon = 'modular_citadel/icons/obj/vial.dmi'
+ icon_state = "hypovial"
+ spillable = FALSE
+ var/comes_with = list() //Easy way of doing this.
+ volume = 10
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Hypospray vial" = "hypovial",
+ "Red hypospray vial" = "hypovial-b",
+ "Blue hypospray vial" = "hypovial-d",
+ "Green hypospray vial" = "hypovial-a",
+ "Orange hypospray vial" = "hypovial-k",
+ "Purple hypospray vial" = "hypovial-p",
+ "Black hypospray vial" = "hypovial-t"
+ )
+
+/obj/item/reagent_containers/glass/bottle/vial/Initialize()
+ . = ..()
+ if(!icon_state)
+ icon_state = "hypovial"
+ update_icon()
+ for(var/R in comes_with)
+ reagents.add_reagent(R,comes_with[R])
+
+/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change()
+ update_icon()
+
+/obj/item/reagent_containers/glass/bottle/vial/update_icon()
+ cut_overlays()
+ if(reagents.total_volume)
+ var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "[icon_state]10")
+
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 9)
+ filling.icon_state = "[icon_state]10"
+ if(10 to 29)
+ filling.icon_state = "[icon_state]25"
+ if(30 to 49)
+ filling.icon_state = "[icon_state]50"
+ if(50 to 69)
+ filling.icon_state = "[icon_state]75"
+ if(70 to INFINITY)
+ filling.icon_state = "[icon_state]100"
+
+ filling.color = mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(filling)
+
+/obj/item/reagent_containers/glass/bottle/vial/small
+ volume = 30
+
+/obj/item/reagent_containers/glass/bottle/vial/large
+ name = "large hypospray vial"
+ desc = "This is a vial suitable for loading into the Chief Medical Officer's Hypospray mk II."
+ icon_state = "hypoviallarge"
+ volume = 60
+ unique_reskin = list("Large hypospray vial" = "hypoviallarge",
+ "Red hypospray vial" = "hypoviallarge-b",
+ "Blue hypospray vial" = "hypoviallarge-d",
+ "Green hypospray vial" = "hypoviallarge-a",
+ "Orange hypospray vial" = "hypoviallarge-k",
+ "Purple hypospray vial" = "hypoviallarge-p",
+ "Black hypospray vial" = "hypoviallarge-t"
+ )
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
+ name = "vial (bicaridine)"
+ icon_state = "hypovial-b"
+ comes_with = list("bicaridine" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
+ name = "vial (Anti-Tox)"
+ icon_state = "hypovial-a"
+ comes_with = list("antitoxin" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
+ name = "vial (kelotane)"
+ icon_state = "hypovial-k"
+ comes_with = list("kelotane" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
+ name = "vial (dexalin)"
+ icon_state = "hypovial-d"
+ comes_with = list("dexalin" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricordrazine
+ name = "vial (tricordrazine)"
+ icon_state = "hypovial"
+ comes_with = list("tricordrazine" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
+ name = "large vial (CMO Special)"
+ icon_state = "hypoviallarge-cmos"
+ comes_with = list("epinephrine" = 15, "kelotane" = 15, "charcoal" = 15, "bicaridine" = 15)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine
+ name = "large vial (bicaridine)"
+ icon_state = "hypoviallarge-b"
+ comes_with = list("bicaridine" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin
+ name = "large vial (Anti-Tox)"
+ icon_state = "hypoviallarge-a"
+ comes_with = list("antitoxin" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane
+ name = "large vial (kelotane)"
+ icon_state = "hypoviallarge-k"
+ comes_with = list("kelotane" = 60)
+
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin
+ name = "large vial (dexalin)"
+ icon_state = "hypoviallarge-d"
+ comes_with = list("dexalin" = 60)
diff --git a/code/citadel/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
similarity index 98%
rename from code/citadel/cit_reagents.dm
rename to modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index df4af10faa..01c5e005a3 100644
--- a/code/citadel/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -29,7 +29,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'code/citadel/icons/effects.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
icon_state = "semen1"
random_icon_states = list("semen1", "semen2", "semen3", "semen4")
@@ -59,7 +59,7 @@
gender = PLURAL
density = 0
layer = ABOVE_NORMAL_TURF_LAYER
- icon = 'code/citadel/icons/effects.dmi'
+ icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
icon_state = "fem1"
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
blood_state = null
@@ -260,7 +260,7 @@
/obj/item/reagent_containers/food/drinks/bottle/sake
name = "Traditional Sake"
desc = "Sweet as can be, and burns like foxfire going down."
- icon = 'code/citadel/icons/drinks.dmi'
+ icon = 'modular_citadel/icons/obj/drinks.dmi'
icon_state = "sakebottle"
list_reagents = list("sake" = 100)
diff --git a/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm
new file mode 100644
index 0000000000..3886eb14cf
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/belly_dat_vr.dm
@@ -0,0 +1,162 @@
+// THIS IS NOW MERELY LEGACY, because memes. hopefully it won't be dumb.
+
+//
+// The belly object is what holds onto a mob while they're inside a predator.
+// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
+//
+
+// If you change what variables are on this, then you need to update the copy() proc.
+
+//
+// Parent type of all the various "belly" varieties.
+//
+/datum/belly
+ var/name // Name of this location
+ var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
+ var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
+ var/vore_verb = "ingest" // Verb for eating with this in messages
+ var/human_prey_swallow_time = 10 SECONDS // Time in deciseconds to swallow /mob/living/carbon/human
+ var/nonhuman_prey_swallow_time = 5 SECONDS // Time in deciseconds to swallow anything else
+ var/emoteTime = 30 SECONDS // How long between stomach emotes at prey
+ var/digest_brute = 0 // Brute damage per tick in digestion mode
+ var/digest_burn = 1 // Burn damage per tick in digestion mode
+ var/digest_tickrate = 9 // Modulus this of air controller tick number to iterate gurgles on
+ var/immutable = FALSE // Prevents this belly from being deleted
+ var/escapable = FALSE // Belly can be resisted out of at any time
+ var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
+ var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
+// var/silenced = FALSE // Will the heartbeat/fleshy internal loop play?
+ var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
+
+ var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
+ var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
+ var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
+ var/autotransferwait = 10 // Time between trying to transfer.
+ var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
+
+ var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
+ var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
+ var/tmp/mob/living/owner // The mob whose belly this is.
+ var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
+ var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
+ var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
+ var/swallow_time = 10 SECONDS // for mob transfering automation
+ var/vore_capacity = 1 // The capacity (in people) this person can hold
+
+ // Don't forget to watch your commas at the end of each line if you change these.
+ var/list/struggle_messages_outside = list(
+ "%pred's %belly wobbles with a squirming meal.",
+ "%pred's %belly jostles with movement.",
+ "%pred's %belly briefly swells outward as someone pushes from inside.",
+ "%pred's %belly fidgets with a trapped victim.",
+ "%pred's %belly jiggles with motion from inside.",
+ "%pred's %belly sloshes around.",
+ "%pred's %belly gushes softly.",
+ "%pred's %belly lets out a wet squelch.")
+
+ var/list/struggle_messages_inside = list(
+ "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
+ "Your struggles only cause %pred's %belly to gush softly around you.",
+ "Your movement only causes %pred's %belly to slosh around you.",
+ "Your motion causes %pred's %belly to jiggle.",
+ "You fidget around inside of %pred's %belly.",
+ "You shove against the walls of %pred's %belly, making it briefly swell outward.",
+ "You jostle %pred's %belly with movement.",
+ "You squirm inside of %pred's %belly, making it wobble around.")
+
+ var/list/digest_messages_owner = list(
+ "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
+ "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
+ "Your %belly lets out a rumble as it melts %prey into sludge.",
+ "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
+ "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
+ "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
+ "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
+
+ var/list/digest_messages_prey = list(
+ "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
+ "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
+ "%pred's %belly lets out a rumble as it melts you into sludge.",
+ "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
+ "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
+ "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
+ "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
+
+ var/list/examine_messages = list(
+ "They have something solid in their %belly!",
+ "It looks like they have something in their %belly!")
+
+ //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
+ //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
+ //List has indexes that are the digestion mode strings, and keys that are lists of strings.
+ var/list/emote_lists = list()
+
+//OLD: This only exists for legacy conversion purposes
+//It's called whenever an old datum-style belly is loaded
+/datum/belly/proc/copy(obj/belly/new_belly)
+
+ //// Non-object variables
+ new_belly.name = name
+ new_belly.desc = inside_flavor
+ new_belly.vore_sound = vore_sound
+ new_belly.vore_verb = vore_verb
+ new_belly.human_prey_swallow_time = human_prey_swallow_time
+ new_belly.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
+ new_belly.emote_time = emoteTime
+ new_belly.digest_brute = digest_brute
+ new_belly.digest_burn = digest_burn
+ new_belly.immutable = immutable
+ new_belly.can_taste = can_taste
+ new_belly.escapable = escapable
+ new_belly.escapetime = escapetime
+ new_belly.digestchance = digestchance
+ new_belly.escapechance = escapechance
+ new_belly.transferchance = transferchance
+ new_belly.transferlocation = transferlocation
+
+ //// Object-holding variables
+ //struggle_messages_outside - strings
+ new_belly.struggle_messages_outside.Cut()
+ for(var/I in struggle_messages_outside)
+ new_belly.struggle_messages_outside += I
+
+ //struggle_messages_inside - strings
+ new_belly.struggle_messages_inside.Cut()
+ for(var/I in struggle_messages_inside)
+ new_belly.struggle_messages_inside += I
+
+ //digest_messages_owner - strings
+ new_belly.digest_messages_owner.Cut()
+ for(var/I in digest_messages_owner)
+ new_belly.digest_messages_owner += I
+
+ //digest_messages_prey - strings
+ new_belly.digest_messages_prey.Cut()
+ for(var/I in digest_messages_prey)
+ new_belly.digest_messages_prey += I
+
+ //examine_messages - strings
+ new_belly.examine_messages.Cut()
+ for(var/I in examine_messages)
+ new_belly.examine_messages += I
+
+ //emote_lists - index: digest mode, key: list of strings
+ new_belly.emote_lists.Cut()
+ for(var/K in emote_lists)
+ new_belly.emote_lists[K] = list()
+ for(var/I in emote_lists[K])
+ new_belly.emote_lists[K] += I
+
+ return new_belly
+
+// // // // // // // // // // // //
+// // // LEGACY USE ONLY!! // // //
+// // // // // // // // // // // //
+// See top of file! //
+// // // // // // // // // // // //
diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
new file mode 100644
index 0000000000..14ded0b7cc
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
@@ -0,0 +1,655 @@
+//#define VORE_SOUND_FALLOFF 0.05
+
+//
+// Belly system 2.0, now using objects instead of datums because EH at datums.
+// How many times have I rewritten bellies and vore now? -Aro
+//
+
+// If you change what variables are on this, then you need to update the copy() proc.
+
+//
+// Parent type of all the various "belly" varieties.
+//
+/obj/belly
+ name = "belly" // Name of this location
+ desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
+ var/vore_sound = 'sound/vore/pred/swallow_01.ogg' // Sound when ingesting someone
+ var/vore_verb = "ingest" // Verb for eating with this in messages
+ var/release_sound = 'sound/effects/splat.ogg'
+ var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
+ var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
+ var/emote_time = 60 SECONDS // How long between stomach emotes at prey
+ var/digest_brute = 2 // Brute damage per tick in digestion mode
+ var/digest_burn = 2 // Burn damage per tick in digestion mode
+ var/immutable = FALSE // Prevents this belly from being deleted
+ var/escapable = TRUE // Belly can be resisted out of at any time
+ var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
+ var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
+ var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
+ var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles.
+ var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
+ var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
+// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
+ var/silent = FALSE
+
+ var/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
+ var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
+ var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
+ var/autotransferwait = 10 // Time between trying to transfer.
+ var/swallow_time = 10 SECONDS // for mob transfering automation
+ var/vore_capacity = 1 // simple animal nom capacity
+
+ //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
+ var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY) // Possible digest modes
+
+ var/tmp/mob/living/owner // The mob whose belly this is.
+ var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
+ var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again.
+ var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
+ var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
+ var/tmp/recent_sound = FALSE // Prevent audio spam
+
+ // Don't forget to watch your commas at the end of each line if you change these.
+ var/list/struggle_messages_outside = list(
+ "%pred's %belly wobbles with a squirming meal.",
+ "%pred's %belly jostles with movement.",
+ "%pred's %belly briefly swells outward as someone pushes from inside.",
+ "%pred's %belly fidgets with a trapped victim.",
+ "%pred's %belly jiggles with motion from inside.",
+ "%pred's %belly sloshes around.",
+ "%pred's %belly gushes softly.",
+ "%pred's %belly lets out a wet squelch.")
+
+ var/list/struggle_messages_inside = list(
+ "Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
+ "Your struggles only cause %pred's %belly to gush softly around you.",
+ "Your movement only causes %pred's %belly to slosh around you.",
+ "Your motion causes %pred's %belly to jiggle.",
+ "You fidget around inside of %pred's %belly.",
+ "You shove against the walls of %pred's %belly, making it briefly swell outward.",
+ "You jostle %pred's %belly with movement.",
+ "You squirm inside of %pred's %belly, making it wobble around.")
+
+ var/list/digest_messages_owner = list(
+ "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
+ "You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
+ "Your %belly lets out a rumble as it melts %prey into sludge.",
+ "You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
+ "Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
+ "Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
+ "Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
+ "Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
+
+ var/list/digest_messages_prey = list(
+ "Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
+ "%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
+ "%pred's %belly lets out a rumble as it melts you into sludge.",
+ "%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
+ "%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
+ "%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
+ "%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
+ "%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
+
+ var/list/examine_messages = list(
+ "They have something solid in their %belly!",
+ "It looks like they have something in their %belly!")
+
+ //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
+ //a carbon's belly if someone really wanted. No UI for carbons to adjust this.
+ //List has indexes that are the digestion mode strings, and keys that are lists of strings.
+ var/tmp/list/emote_lists = list()
+
+//For serialization, keep this updated, required for bellies to save correctly.
+/obj/belly/vars_to_save()
+ return ..() + list(
+ "name",
+ "desc",
+ "vore_sound",
+ "vore_verb",
+ "release_sound",
+ "human_prey_swallow_time",
+ "nonhuman_prey_swallow_time",
+ "emote_time",
+ "digest_brute",
+ "digest_burn",
+ "immutable",
+ "can_taste",
+ "escapable",
+ "escapetime",
+ "digestchance",
+ "absorbchance",
+ "escapechance",
+ "transferchance",
+ "transferlocation",
+ "bulge_size",
+ "struggle_messages_outside",
+ "struggle_messages_inside",
+ "digest_messages_owner",
+ "digest_messages_prey",
+ "examine_messages",
+ "emote_lists",
+ "silent"
+ )
+
+ //ommitted list
+ // "shrink_grow_size",
+/obj/belly/New(var/newloc)
+ . = ..(newloc)
+ //If not, we're probably just in a prefs list or something.
+ if(isliving(newloc))
+ owner = loc
+ owner.vore_organs |= src
+ SSbellies.belly_list += src
+
+/obj/belly/Destroy()
+ SSbellies.belly_list -= src
+ if(owner)
+ owner.vore_organs -= src
+ owner = null
+ . = ..()
+
+// Called whenever an atom enters this belly
+/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
+ if(OldLoc in contents)
+ return //Someone dropping something (or being stripdigested)
+
+ //Generic entered message
+ to_chat(owner,"[thing] slides into your [lowertext(name)].")
+
+ //Sound w/ antispam flag setting
+ if(!silent && !recent_sound)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ recent_sound = TRUE
+
+ //Messages if it's a mob
+ if(isliving(thing))
+ var/mob/living/M = thing
+ if(desc)
+ to_chat(M, "[desc]")
+ var/taste
+ if(can_taste && (taste = M.get_taste_message(FALSE)))
+ to_chat(owner, "[M] tastes of [taste].")
+
+// Release all contents of this belly into the owning mob's location.
+// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
+// Returns the number of mobs so released.
+/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
+ var/atom/destination = drop_location()
+ var/count = 0
+ for(var/thing in contents)
+ var/atom/movable/AM = thing
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.absorbed && !include_absorbed)
+ continue
+ L.absorbed = FALSE
+ for(var/mob/living/W in AM)
+ W.stop_sound_channel(CHANNEL_PREYLOOP)
+ AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
+ count++
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ items_preserved.Cut()
+ owner.visible_message("[owner] expels everything from their [lowertext(name)]!")
+ owner.update_icons()
+
+ return count
+
+// Release a specific atom from the contents of this belly into the owning mob's location.
+// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
+// Returns the number of atoms so released.
+/obj/belly/proc/release_specific_contents(var/atom/movable/M)
+ if (!(M in contents))
+ return FALSE // They weren't in this belly anyway
+
+ M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
+ items_preserved -= M
+ for(var/mob/living/P in M)
+ P.stop_sound_channel(CHANNEL_PREYLOOP)
+ if(release_sound)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+
+ if(istype(M,/mob/living))
+ var/mob/living/ML = M
+ var/mob/living/OW = owner
+ if(ML.absorbed)
+ ML.absorbed = FALSE
+ if(ishuman(M) && ishuman(OW))
+ var/mob/living/carbon/human/Prey = M
+ var/mob/living/carbon/human/Pred = OW
+ var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
+ for(var/mob/living/P in contents)
+ if(P.absorbed)
+ absorbed_count++
+ Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
+
+ owner.visible_message("[owner] expels [M] from their [lowertext(name)]!")
+ owner.update_icons()
+ return TRUE
+
+// Actually perform the mechanics of devouring the tasty prey.
+// The purpose of this method is to avoid duplicate code, and ensure that all necessary
+// steps are taken.
+/obj/belly/proc/nom_mob(var/mob/prey, var/mob/user)
+ var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
+ if(owner.stat == DEAD)
+ return
+ if (prey.buckled)
+ prey.buckled.unbuckle_mob(prey,TRUE)
+
+ prey.forceMove(src)
+ prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP)
+ owner.updateVRPanel()
+
+ for(var/mob/living/M in contents)
+ M.updateVRPanel()
+
+ // Setup the autotransfer checks if needed
+ if(transferlocation && autotransferchance > 0)
+ addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait)
+
+/obj/belly/proc/check_autotransfer(var/mob/prey)
+ // Some sanity checks
+ if(transferlocation && (autotransferchance > 0) && (prey in contents))
+ if(prob(autotransferchance))
+ // Double check transferlocation isn't insane
+ if(verify_transferlocation())
+ transfer_contents(prey, transferlocation)
+ else
+ // Didn't transfer, so wait before retrying
+ addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, prey), autotransferwait)
+
+/obj/belly/proc/verify_transferlocation()
+ for(var/I in owner.vore_organs)
+ var/obj/belly/B = owner.vore_organs[I]
+ if(B == transferlocation)
+ return TRUE
+
+ for(var/I in owner.vore_organs)
+ var/obj/belly/B = owner.vore_organs[I]
+ if(B == transferlocation)
+ transferlocation = B
+ return TRUE
+ return FALSE
+
+
+// Get the line that should show up in Examine message if the owner of this belly
+// is examined. By making this a proc, we not only take advantage of polymorphism,
+// but can easily make the message vary based on how many people are inside, etc.
+// Returns a string which shoul be appended to the Examine output.
+/obj/belly/proc/get_examine_msg()
+ if(contents.len && examine_messages.len)
+ var/formatted_message
+ var/raw_message = pick(examine_messages)
+ var/total_bulge = 0
+
+ formatted_message = replacetext(raw_message,"%belly",lowertext(name))
+ formatted_message = replacetext(formatted_message,"%pred",owner)
+ formatted_message = replacetext(formatted_message,"%prey",english_list(contents))
+ for(var/mob/living/P in contents)
+ if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
+ total_bulge += P.mob_size
+ if(total_bulge >= bulge_size && bulge_size != 0)
+ return("[formatted_message]
")
+ else
+ return ""
+
+// The next function gets the messages set on the belly, in human-readable format.
+// This is useful in customization boxes and such. The delimiter right now is \n\n so
+// in message boxes, this looks nice and is easily delimited.
+/obj/belly/proc/get_messages(var/type, var/delim = "\n\n")
+ ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
+ var/list/raw_messages
+
+ switch(type)
+ if("smo")
+ raw_messages = struggle_messages_outside
+ if("smi")
+ raw_messages = struggle_messages_inside
+ if("dmo")
+ raw_messages = digest_messages_owner
+ if("dmp")
+ raw_messages = digest_messages_prey
+ if("em")
+ raw_messages = examine_messages
+
+ var/messages = list2text(raw_messages,delim)
+ return messages
+
+// The next function sets the messages on the belly, from human-readable var
+// replacement strings and linebreaks as delimiters (two \n\n by default).
+// They also sanitize the messages.
+/obj/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
+ ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
+
+ var/list/raw_list = text2list(html_encode(raw_text),delim)
+ if(raw_list.len > 10)
+ raw_list.Cut(11)
+ testing("[owner] tried to set [lowertext(name)] with 11+ messages")
+
+ for(var/i = 1, i <= raw_list.len, i++)
+ if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
+ raw_list.Cut(i,i)
+ testing("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
+ else
+ raw_list[i] = readd_quotes(raw_list[i])
+ //Also fix % sign for var replacement
+ raw_list[i] = replacetext(raw_list[i],"%","%")
+
+ ASSERT(raw_list.len <= 10) //Sanity
+
+ switch(type)
+ if("smo")
+ struggle_messages_outside = raw_list
+ if("smi")
+ struggle_messages_inside = raw_list
+ if("dmo")
+ digest_messages_owner = raw_list
+ if("dmp")
+ digest_messages_prey = raw_list
+ if("em")
+ examine_messages = raw_list
+
+ return
+
+// Handle the death of a mob via digestion.
+// Called from the process_Life() methods of bellies that digest prey.
+// Default implementation calls M.death() and removes from internal contents.
+// Indigestable items are removed, and M is deleted.
+/obj/belly/proc/digestion_death(var/mob/living/M)
+ //M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses.
+ if(M.ckey)
+ message_admins("[key_name(owner)] has digested [key_name(M)] in their [lowertext(name)] ([owner ? "JMP" : "null"])")
+ log_attack("[key_name(owner)] digested [key_name(M)].")
+
+ // If digested prey is also a pred... anyone inside their bellies gets moved up.
+ if(is_vore_predator(M))
+ for(var/belly in M.vore_organs)
+ var/obj/belly/B = belly
+ for(var/thing in B)
+ var/atom/movable/AM = thing
+ AM.forceMove(owner.loc)
+ if(isliving(AM))
+ to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]")
+
+ //Drop all items into the belly
+ for(var/obj/item/W in M)
+ if(!M.dropItemToGround(W))
+ qdel(W)
+
+/* //Reagent transfer //maybe someday
+ if(ishuman(owner))
+ var/mob/living/carbon/human/Pred = owner
+ if(ishuman(M))
+ var/mob/living/carbon/human/Prey = M
+ Prey.bloodstr.del_reagent("numbenzyme")
+ Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, 0.5, TRUE) // Copy=TRUE because we're deleted anyway
+ Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, 0.5, TRUE) // Therefore don't bother spending cpu
+ Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, 0.5, TRUE) // On updating the prey's reagents
+ else if(M.reagents)
+ M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) */
+
+ // Delete the digested mob
+ qdel(M)
+
+// Handle a mob being absorbed
+/obj/belly/proc/absorb_living(var/mob/living/M)
+ M.absorbed = TRUE
+ to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.")
+ to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.")
+
+// Reagent sharing is neat, but eh. I'll figure it out later
+/* if(ishuman(M) && ishuman(owner))
+ var/mob/living/carbon/human/Prey = M
+ var/mob/living/carbon/human/Pred = owner
+ //Reagent sharing for absorbed with pred - Copy so both pred and prey have these reagents.
+ Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, copy = TRUE)
+ Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, copy = TRUE)
+ Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, copy = TRUE)
+ // TODO - Find a way to make the absorbed prey share the effects with the pred.
+ // Currently this is infeasible because reagent containers are designed to have a single my_atom, and we get
+ // problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container.
+*/
+ //This is probably already the case, but for sub-prey, it won't be.
+ if(M.loc != src)
+ M.forceMove(src)
+
+ //Seek out absorbed prey of the prey, absorb them too.
+ //This in particular will recurse oddly because if there is absorbed prey of prey of prey...
+ //it will just move them up one belly. This should never happen though since... when they were
+ //absobred, they should have been absorbed as well!
+ for(var/belly in M.vore_organs)
+ var/obj/belly/B = belly
+ for(var/mob/living/Mm in B)
+ if(Mm.absorbed)
+ absorb_living(Mm)
+
+ //Update owner
+ owner.updateVRPanel()
+
+//Digest a single item
+//Receives a return value from digest_act that's how much nutrition
+//the item should be worth
+/obj/belly/proc/digest_item(var/obj/item/item)
+ var/digested = item.digest_act(src, owner)
+ if(!digested)
+ items_preserved |= item
+ else
+// owner.nutrition += (5 * digested) // haha no.
+ if(iscyborg(owner))
+ var/mob/living/silicon/robot/R = owner
+ R.cell.charge += (50 * digested)
+
+//Determine where items should fall out of us into.
+//Typically just to the owner's location.
+/obj/belly/drop_location()
+ //Should be the case 99.99% of the time
+ if(owner)
+ return owner.loc
+ //Sketchy fallback for safety, put them somewhere safe.
+ else if(ismob(src))
+ testing("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!")
+ SSjob.SendToLateJoin(src)
+ // wew lad. let's see if this never gets used, hopefully
+ else
+ qdel(src) //final option, I guess.
+ testing("[src] (\ref[src]) was QDEL'd for not having a drop_location!")
+
+//Handle a mob struggling
+// Called from /mob/living/carbon/relaymove()
+/obj/belly/proc/relay_resist(var/mob/living/R)
+ if (!(R in contents))
+ return // User is not in this belly
+
+ R.setClickCooldown(50)
+
+ if(owner.stat || !owner.client && R.a_intent != INTENT_HELP) //If owner is stat (dead, KO) we can actually escape
+ to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
+
+ if(do_after(R, 50, owner))
+ if(owner.stat && (R in contents) && R.a_intent != INTENT_HELP) //Can still escape and want to?
+ release_specific_contents(R)
+ return
+ else if(!(R in contents)) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable or mob revived
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed!")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!")
+ return
+ return
+ var/struggle_outer_message = pick(struggle_messages_outside)
+ var/struggle_user_message = pick(struggle_messages_inside)
+
+ struggle_outer_message = replacetext(struggle_outer_message,"%pred",owner)
+ struggle_outer_message = replacetext(struggle_outer_message,"%prey",R)
+ struggle_outer_message = replacetext(struggle_outer_message,"%belly",lowertext(name))
+
+ struggle_user_message = replacetext(struggle_user_message,"%pred",owner)
+ struggle_user_message = replacetext(struggle_user_message,"%prey",R)
+ struggle_user_message = replacetext(struggle_user_message,"%belly",lowertext(name))
+
+ struggle_outer_message = "" + struggle_outer_message + ""
+ struggle_user_message = "" + struggle_user_message + ""
+
+ for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
+ M.show_message(struggle_outer_message, 2) // hearable
+ to_chat(R,struggle_user_message)
+
+ if(!silent)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ R.stop_sound_channel(CHANNEL_PRED)
+ var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
+ R.playsound_local(get_turf(R),prey_struggle,45,0)
+
+ if(R.a_intent != INTENT_HELP) //If on non help intent
+ to_chat(R,"You start to climb out of \the [lowertext(name)].")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
+ if(do_after(R, escapetime, owner))
+ if((owner.stat || !owner.client || escapable) && (R in contents))
+ release_specific_contents(R)
+ to_chat(R,"You climb out of \the [lowertext(name)].")
+ to_chat(owner,"[R] climbs out of your [lowertext(name)]!")
+ for(var/mob/M in hearers(4, owner))
+ M.show_message("[R] climbs out of [owner]'s [lowertext(name)]!", 2)
+ return
+ else if(!istype(loc, /obj/belly)) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable.
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed!")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!")
+ return
+
+ else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
+ var/obj/belly/dest_belly
+ for(var/belly in owner.vore_organs)
+ var/obj/belly/B = belly
+ if(B.name == transferlocation)
+ dest_belly = B
+ break
+ if(!dest_belly)
+ to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.")
+ transferchance = 0
+ transferlocation = null
+ return
+
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!")
+ to_chat(owner,"Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!")
+ transfer_contents(R, dest_belly)
+ return
+/*
+ else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to cling more tightly...")
+ to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents...")
+ digest_mode = DM_ABSORB
+ return
+
+ else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...")
+ to_chat(owner,"You feel your [lowertext(name)] beginning to become active!")
+ digest_mode = DM_ITEMWEAK
+ return
+
+ else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
+ to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!")
+ to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!")
+ digest_mode = DM_DIGEST
+ return */
+ else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
+ to_chat(R, "In response to your struggling, \the [name] begins to get more active...")
+ to_chat(owner, "You feel your [name] beginning to become active!")
+ digest_mode = DM_DIGEST
+ return
+
+ else //Nothing interesting happened.
+ to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].")
+ to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].")
+ return
+
+//Transfers contents from one belly to another
+/obj/belly/proc/transfer_contents(var/atom/movable/content, var/obj/belly/target, silent = FALSE)
+ if(!(content in src) || !istype(target))
+ return
+ target.nom_mob(content, target.owner)
+ if(!silent)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ owner.updateVRPanel()
+ for(var/mob/living/M in contents)
+ M.updateVRPanel()
+
+// Belly copies and then returns the copy
+// Needs to be updated for any var changes
+/obj/belly/proc/copy(mob/new_owner)
+ var/obj/belly/dupe = new /obj/belly(new_owner)
+
+ //// Non-object variables
+ dupe.name = name
+ dupe.desc = desc
+ dupe.vore_sound = vore_sound
+ dupe.vore_verb = vore_verb
+ dupe.release_sound = release_sound
+ dupe.human_prey_swallow_time = human_prey_swallow_time
+ dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
+ dupe.emote_time = emote_time
+ dupe.digest_brute = digest_brute
+ dupe.digest_burn = digest_burn
+ dupe.immutable = immutable
+ dupe.can_taste = can_taste
+ dupe.escapable = escapable
+ dupe.escapetime = escapetime
+ dupe.digestchance = digestchance
+ dupe.absorbchance = absorbchance
+ dupe.escapechance = escapechance
+ dupe.transferchance = transferchance
+ dupe.transferlocation = transferlocation
+ dupe.bulge_size = bulge_size
+// dupe.shrink_grow_size = shrink_grow_size
+
+ //// Object-holding variables
+ //struggle_messages_outside - strings
+ dupe.struggle_messages_outside.Cut()
+ for(var/I in struggle_messages_outside)
+ dupe.struggle_messages_outside += I
+
+ //struggle_messages_inside - strings
+ dupe.struggle_messages_inside.Cut()
+ for(var/I in struggle_messages_inside)
+ dupe.struggle_messages_inside += I
+
+ //digest_messages_owner - strings
+ dupe.digest_messages_owner.Cut()
+ for(var/I in digest_messages_owner)
+ dupe.digest_messages_owner += I
+
+ //digest_messages_prey - strings
+ dupe.digest_messages_prey.Cut()
+ for(var/I in digest_messages_prey)
+ dupe.digest_messages_prey += I
+
+ //examine_messages - strings
+ dupe.examine_messages.Cut()
+ for(var/I in examine_messages)
+ dupe.examine_messages += I
+
+ //emote_lists - index: digest mode, key: list of strings
+ dupe.emote_lists.Cut()
+ for(var/K in emote_lists)
+ dupe.emote_lists[K] = list()
+ for(var/I in emote_lists[K])
+ dupe.emote_lists[K] += I
+ dupe.silent = silent
+
+ return dupe
diff --git a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
new file mode 100644
index 0000000000..3260e2ae99
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
@@ -0,0 +1,186 @@
+// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
+/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller
+ if((times_fired < next_process) || !contents.len)
+ recent_sound = FALSE
+ return SSBELLIES_IGNORED
+
+ if(loc != owner)
+ if(istype(owner))
+ loc = owner
+ else
+ qdel(src)
+ return SSBELLIES_PROCESSED
+
+ next_process = times_fired + (6 SECONDS/wait) //Set up our next process time.
+
+/////////////////////////// Auto-Emotes ///////////////////////////
+ if(contents.len && next_emote <= times_fired)
+ next_emote = times_fired + round(emote_time/wait,1)
+ var/list/EL = emote_lists[digest_mode]
+ for(var/mob/living/M in contents)
+ if(M.digestable || !(digest_mode == DM_DIGEST)) // don't give digesty messages to indigestible people
+ to_chat(M,"[pick(EL)]")
+
+/////////////////////////// Exit Early ////////////////////////////
+ var/list/touchable_items = contents - items_preserved
+ if(!length(touchable_items))
+ return SSBELLIES_PROCESSED
+
+////////////////////////// Sound vars /////////////////////////////
+ var/sound/prey_digest = sound(get_sfx("digest_prey"))
+ var/sound/prey_death = sound(get_sfx("death_prey"))
+
+
+///////////////////////////// DM_HOLD /////////////////////////////
+ if(digest_mode == DM_HOLD)
+ return SSBELLIES_PROCESSED
+
+//////////////////////////// DM_DIGEST ////////////////////////////
+ else if(digest_mode == DM_DIGEST)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 45)
+
+ //Pref protection!
+ if (!M.digestable || M.absorbed)
+ continue
+
+ //Person just died in guts!
+ if(M.stat == DEAD)
+ var/digest_alert_owner = pick(digest_messages_owner)
+ var/digest_alert_prey = pick(digest_messages_prey)
+
+ //Replace placeholder vars
+ digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
+ digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
+ digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
+
+ digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
+ digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
+ digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
+
+ //Send messages
+ to_chat(owner, "[digest_alert_owner]")
+ to_chat(M, "[digest_alert_prey]")
+ M.visible_message("You watch as [owner]'s form loses its additions.")
+
+ owner.nutrition += 400 // so eating dead mobs gives you *something*.
+ M.stop_sound_channel(DIGESTION_NOISES)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(DIGESTION_NOISES)
+ M.stop_sound_channel(CHANNEL_PREYLOOP)
+ M.playsound_local(get_turf(M), prey_death, 65)
+ digestion_death(M)
+ owner.update_icons()
+ continue
+
+
+ // Deal digestion damage (and feed the pred)
+ if(!(M.status_flags & GODMODE))
+ M.adjustFireLoss(digest_burn)
+ owner.nutrition += 1
+
+ //Contaminate or gurgle items
+ var/obj/item/T = pick(touchable_items)
+ if(istype(T))
+ if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ))
+ digest_item(T)
+
+ owner.updateVRPanel()
+
+///////////////////////////// DM_HEAL /////////////////////////////
+ if(digest_mode == DM_HEAL)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+ if(M.stat != DEAD)
+ if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
+ M.adjustBruteLoss(-3)
+ M.adjustFireLoss(-3)
+ owner.nutrition -= 5
+ return
+
+////////////////////////// DM_NOISY /////////////////////////////////
+//for when you just want people to squelch around
+ if(digest_mode == DM_NOISY)
+ for (var/mob/living/M in contents)
+ if(prob(35))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_PRED)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+
+//////////////////////////DM_DRAGON /////////////////////////////////////
+//because dragons need snowflake guts
+ if(digest_mode == DM_DRAGON)
+ for (var/mob/living/M in contents)
+ if(prob(25))
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"digest_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_digest, 65)
+
+ //No digestion protection for megafauna.
+
+ //Person just died in guts!
+ if(M.stat == DEAD)
+ var/digest_alert_owner = pick(digest_messages_owner)
+ var/digest_alert_prey = pick(digest_messages_prey)
+
+ //Replace placeholder vars
+ digest_alert_owner = replacetext(digest_alert_owner,"%pred",owner)
+ digest_alert_owner = replacetext(digest_alert_owner,"%prey",M)
+ digest_alert_owner = replacetext(digest_alert_owner,"%belly",lowertext(name))
+
+ digest_alert_prey = replacetext(digest_alert_prey,"%pred",owner)
+ digest_alert_prey = replacetext(digest_alert_prey,"%prey",M)
+ digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
+
+ //Send messages
+ to_chat(owner, "[digest_alert_owner]")
+ to_chat(M, "[digest_alert_prey]")
+ M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.")
+
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
+ if(H.client && H.client.prefs.toggles & DIGESTION_NOISES)
+ playsound(get_turf(owner),"death_pred",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_DIGEST)
+ M.stop_sound_channel(CHANNEL_DIGEST)
+ M.playsound_local(get_turf(M), prey_death, 65)
+ M.spill_organs(FALSE,TRUE,TRUE)
+ M.stop_sound_channel(CHANNEL_PREYLOOP)
+ digestion_death(M)
+ owner.update_icons()
+ continue
+
+
+ // Deal digestion damage (and feed the pred)
+ if(!(M.status_flags & GODMODE))
+ M.adjustFireLoss(digest_burn)
+ M.adjustToxLoss(2) // something something plasma based acids
+ M.adjustCloneLoss(1) // eventually this'll kill you if you're healing everything else, you nerds.
+ //Contaminate or gurgle items
+ var/obj/item/T = pick(touchable_items)
+ if(istype(T))
+ if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ))
+ digest_item(T)
+
+ owner.updateVRPanel()
\ No newline at end of file
diff --git a/modular_citadel/code/modules/vore/eating/digest_act_vr.dm b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm
new file mode 100644
index 0000000000..faa458ad56
--- /dev/null
+++ b/modular_citadel/code/modules/vore/eating/digest_act_vr.dm
@@ -0,0 +1,119 @@
+//Please make sure to:
+//return FALSE: You are not going away, stop asking me to digest.
+//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
+
+// Ye default implementation.
+/obj/item/proc/digest_act(var/atom/movable/item_storage = null)
+ for(var/obj/item/O in contents)
+ if(istype(O,/obj/item/storage/internal)) //Dump contents from dummy pockets.
+ for(var/obj/item/SO in O)
+ if(item_storage)
+ SO.forceMove(item_storage)
+ qdel(O)
+ else if(item_storage)
+ O.forceMove(item_storage)
+
+ qdel(src)
+ return w_class
+
+/////////////
+// Some indigestible stuff
+/////////////
+/obj/item/hand_tele/digest_act(...)
+ return FALSE
+/obj/item/card/id/digest_act(...)
+ return FALSE
+/obj/item/aicard/digest_act(...)
+ return FALSE
+/obj/item/paicard/digest_act(...)
+ return FALSE
+/obj/item/pinpointer/digest_act(...)
+ return FALSE
+/obj/item/disk/nuclear/digest_act(...)
+ return FALSE
+/obj/item/device/perfect_tele_beacon/digest_act(...)
+ return FALSE //Sorta important to not digest your own beacons.
+/obj/item/device/pda/digest_act(...)
+ return FALSE
+/obj/item/gun/digest_act(...)
+ return FALSE
+/obj/item/clothing/shoes/magboots/digest_act(...)
+ return FALSE
+/obj/item/clothing/head/helmet/space/digest_act(...)
+ return FALSE
+/obj/item/clothing/suit/space/digest_act(...)
+ return FALSE
+/obj/item/reagent_containers/hypospray/CMO/digest_act(...)
+ return FALSE
+/obj/item/tank/jetpack/oxygen/captain/digest_act(...)
+ return FALSE
+/obj/item/clothing/accessory/medal/gold/captain/digest_act(...)
+ return FALSE
+/obj/item/clothing/suit/armor/digest_act(...)
+ return FALSE
+/obj/item/documents/digest_act(...)
+ return FALSE
+/obj/item/nuke_core/digest_act(...)
+ return FALSE
+/obj/item/nuke_core_container/digest_act(...)
+ return FALSE
+/obj/item/areaeditor/blueprints/digest_act(...)
+ return FALSE
+/obj/item/documents/syndicate/digest_act(...)
+ return FALSE
+/obj/item/bombcore/digest_act(...)
+ return FALSE
+/obj/item/grenade/digest_act(...)
+ return FALSE
+/obj/item/storage/digest_act(...)
+ return FALSE
+
+/////////////
+// Some special treatment
+/////////////
+/*
+//PDAs need to lose their ID to not take it with them, so we can get a digested ID
+/obj/item/device/pda/digest_act(var/atom/movable/item_storage = null)
+ if(id)
+ id = null
+
+ . = ..()
+*/
+
+/obj/item/reagent_containers/food/digest_act(var/atom/movable/item_storage = null)
+ if(isbelly(item_storage))
+ var/obj/belly/B = item_storage
+ if(ishuman(B.owner))
+ var/mob/living/carbon/human/H = B.owner
+ reagents.trans_to(H, (reagents.total_volume * 0.3), 1, 0)
+ else if(iscyborg(B.owner))
+ var/mob/living/silicon/robot/R = B.owner
+ R.cell.charge += 150
+
+ . = ..()
+
+/*
+/obj/item/holder/digest_act(var/atom/movable/item_storage = null)
+ for(var/mob/living/M in contents)
+ if(item_storage)
+ M.forceMove(item_storage)
+ held_mob = null
+
+ . = ..() */
+
+/obj/item/organ/digest_act(var/atom/movable/item_storage = null)
+ if((. = ..()))
+ . += 70 //Organs give a little more
+
+/obj/item/storage/digest_act(var/atom/movable/item_storage = null)
+ for(var/obj/item/I in contents)
+ I.screen_loc = null
+
+ . = ..()
+
+/////////////
+// Some more complicated stuff
+/////////////
+/obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null)
+ //Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim
+ return FALSE
diff --git a/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm
similarity index 71%
rename from code/modules/vore/eating/living_vr.dm
rename to modular_citadel/code/modules/vore/eating/living_vr.dm
index 16a63c40ac..5b2ad312ab 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/living_vr.dm
@@ -1,23 +1,24 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = TRUE // Can the mob be digested inside a belly?
- var/datum/belly/vore_selected // Default to no vore capability.
+ var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/devourable = FALSE // Can the mob be vored at all?
// var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
var/no_vore = FALSE // If the character/mob can vore.
var/openpanel = 0 // Is the vore panel open?
+ var/noisy = FALSE // tummies are rumbly?
+ var/absorbed = FALSE //are we absorbed?
//
// Hook for generic creation of stuff on new creatures
//
/hook/living_new/proc/vore_setup(mob/living/M)
- M.verbs += /mob/living/proc/lick
M.verbs += /mob/living/proc/preyloop_refresh
- if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
- M << "The creature that you are can not eat others."
- return TRUE
+ M.verbs += /mob/living/proc/lick
+ if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
+ return 1
M.verbs += /mob/living/proc/insidePanel
//Tries to load prefs if a client is present otherwise gives freebie stomach
@@ -27,44 +28,36 @@
if(M.client && M.client.prefs_vr)
if(!M.copy_from_prefs_vr())
- M << "ERROR: You seem to have saved vore prefs, but they couldn't be loaded."
- return FALSE
+ to_chat(M,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.")
+ return 0
if(M.vore_organs && M.vore_organs.len)
M.vore_selected = M.vore_organs[1]
if(!M.vore_organs || !M.vore_organs.len)
if(!M.vore_organs)
M.vore_organs = list()
- var/datum/belly/B = new /datum/belly(M)
+ var/obj/belly/B = new /obj/belly(M)
+ M.vore_selected = B
B.immutable = TRUE
B.name = "Stomach"
- B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]"
- B.can_taste = TRUE
- M.vore_organs[B.name] = B
- M.vore_selected = B.name
-
- //Simple_animal gets emotes. move this to that hook instead?
- if(istype(src,/mob/living/simple_animal))
- B.emote_lists[DM_HOLD] = list(
- "The insides knead at you gently for a moment.",
- "The guts glorp wetly around you as some air shifts.",
- "Your predator takes a deep breath and sighs, shifting you somewhat.",
- "The stomach squeezes you tight for a moment, then relaxes.",
- "During a moment of quiet, breathing becomes the most audible thing.",
- "The warm slickness surrounds and kneads on you.")
-
- B.emote_lists[DM_DIGEST] = list(
- "The caustic acids eat away at your form.",
- "The acrid air burns at your lungs.",
- "Without a thought for you, the stomach grinds inwards painfully.",
- "The guts treat you like food, squeezing to press more acids against you.",
- "The onslaught against your body doesn't seem to be letting up; you're food now.",
- "The insides work on you like they would any other food.")
+ B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
+ B.can_taste = FALSE
//Return 1 to hook-caller
return 1
+/*
+// Hide vore organs in contents
//
+/datum/proc/view_variables_filter_contents(list/L)
+ return 0
+
+/mob/living/view_variables_filter_contents(list/L)
+ . = ..()
+ var/len_before = L.len
+ L -= vore_organs
+ . += len_before - L.len*/
+
// Handle being clicked, perhaps with something to devour
//
@@ -126,33 +119,37 @@
var/belly = user.vore_selected
return perform_dragon(user, prey, user, belly)
-/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 20)
+/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20)
//Sanity
- if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
+ testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
// The belly selected at the time of noms
- var/datum/belly/belly_target = pred.vore_organs[belly]
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */
+
// Prepare messages
if(user == pred) //Feeding someone to yourself
- attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
// Announce that we start the attempt!
user.visible_message(attempt_msg)
- if(!do_mob(src, user, swallow_time)) // one second should be good enough, right?
+ if(!do_mob(src, user, swallow_time))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
- playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0)
+ playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0)
// Actually shove prey into the belly.
- belly_target.nom_mob(prey, user)
+ belly.nom_mob(prey, user)
if (pred == user)
message_admins("[key_name(pred)] ate [key_name(prey)].")
log_attack("[key_name(pred)] ate [key_name(prey)]")
@@ -161,43 +158,55 @@
// Master vore proc that actually does vore procedures
//
-/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly, swallow_time = 100)
+/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
//Sanity
- if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
+ testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return
if (!prey.devourable)
to_chat(user, "This can't be eaten!")
return
// The belly selected at the time of noms
- var/datum/belly/belly_target = pred.vore_organs[belly]
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+/* //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) */
+
// Prepare messages
if(user == pred) //Feeding someone to yourself
- attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] is attemping to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
else //Feeding someone to another person
- attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
- success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
+ success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
// Announce that we start the attempt!
user.visible_message(attempt_msg)
// Now give the prey time to escape... return if they did
+ var/swallow_time = delay || ishuman(prey) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time
+
if(!do_mob(src, user, swallow_time))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
- playsound(get_turf(user), belly_target.vore_sound,75,0,-6,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),"[belly.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
// Actually shove prey into the belly.
- belly_target.nom_mob(prey, user)
+ belly.nom_mob(prey, user)
// user.update_icons()
stop_pulling()
+ // Flavor handling
+ if(belly.can_taste && prey.get_taste_message(FALSE))
+ to_chat(belly.owner, "[prey] tastes of [prey.get_taste_message(FALSE)].")
+
// Inform Admins
var/prey_braindead
var/prey_stat
@@ -250,50 +259,38 @@
return 0
*/
+
+//
+// Release everything in every vore organ
+//
+/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE)
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.release_all_contents(include_absorbed)
+
//
// Custom resist catches for /mob/living
//
/mob/living/proc/vore_process_resist()
//Are we resisting from inside a belly?
- var/datum/belly/B = check_belly(src)
- if(B)
- spawn() B.relay_resist(src)
+ if(isbelly(loc))
+ var/obj/belly/B = loc
+ B.relay_resist(src)
return TRUE //resist() on living does this TRUE thing.
//Other overridden resists go here
-
return FALSE
-//
-// Proc for updating vore organs and digestion/healing/absorbing
-//
-/mob/living/proc/handle_internal_contents()
- if(SSmobs.times_fired%6==1)
- return //The accursed timer
-
- for (var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- if(B.internal_contents.len)
- B.process_Life() //AKA 'do bellymodes_vr.dm'
-
- for (var/I in vore_organs)
- var/datum/belly/B = vore_organs[I]
- if(B.internal_contents.len)
- listclearnulls(B.internal_contents)
- for(var/atom/movable/M in B.internal_contents)
- if(M.loc != src)
- B.internal_contents.Remove(M)
-
// internal slimy button in case the loop stops playing but the player wants to hear it
/mob/living/proc/preyloop_refresh()
set name = "Internal loop refresh"
set category = "Vore"
- if(ismob(src.loc))
+ if(istype(src.loc, /obj/belly))
src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
- src.playsound_local(get_turf(src),preyloop,40,0, channel = CHANNEL_PREYLOOP)
+ src.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP)
else
to_chat(src, "You aren't inside anything, you clod.")
@@ -309,7 +306,7 @@
var/confirm = alert(src, "You're in a mob. Use this as a trick to get out of hostile animals. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel")
if(confirm == "Okay")
for(var/I in pred.vore_organs)
- var/datum/belly/B = pred.vore_organs[I]
+ var/obj/belly/B = pred.vore_organs[I]
B.release_specific_contents(src)
for(var/mob/living/simple_animal/SA in range(10))
@@ -355,9 +352,15 @@
P.digestable = src.digestable
P.devourable = src.devourable
- P.belly_prefs = src.vore_organs
P.vore_taste = src.vore_taste
+ var/list/serialized = list()
+ for(var/belly in src.vore_organs)
+ var/obj/belly/B = belly
+ serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
+
+ P.belly_prefs = serialized
+
return TRUE
//
@@ -370,16 +373,52 @@
var/datum/vore_preferences/P = client.prefs_vr
- src.digestable = P.digestable
- src.devourable = P.devourable
- src.vore_organs = list()
- src.vore_taste = P.vore_taste
+ digestable = P.digestable
+ devourable = P.devourable
+ vore_taste = P.vore_taste
- for(var/I in P.belly_prefs)
- var/datum/belly/Bp = P.belly_prefs[I]
- src.vore_organs[Bp.name] = Bp.copy(src)
+ vore_organs.Cut()
+ for(var/entry in P.belly_prefs)
+ list_to_object(entry,src)
return TRUE
+
+//
+// Returns examine messages for bellies
+//
+/mob/living/proc/examine_bellies()
+ if(!show_pudge()) //Some clothing or equipment can hide this.
+ return ""
+
+ var/message = ""
+ for (var/belly in vore_organs)
+ var/obj/belly/B = belly
+ message += B.get_examine_msg()
+
+ return message
+
+//
+// Whether or not people can see our belly messages
+//
+/mob/living/proc/show_pudge()
+ return TRUE //Can override if you want.
+
+/mob/living/carbon/human/show_pudge()
+ //A uniform could hide it.
+ if(istype(w_uniform,/obj/item/clothing))
+ var/obj/item/clothing/under = w_uniform
+ if(under.hides_bulges)
+ return FALSE
+
+ //We return as soon as we find one, no need for 'else' really.
+ if(istype(wear_suit,/obj/item/clothing))
+ var/obj/item/clothing/suit = wear_suit
+ if(suit.hides_bulges)
+ return FALSE
+
+
+ return ..()
+
//
// Clearly super important. Obviously.
//
diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
similarity index 94%
rename from code/modules/vore/eating/simple_animal_vr.dm
rename to modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
index 4e7c453371..a93eb2fcf4 100644
--- a/code/modules/vore/eating/simple_animal_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm
@@ -31,7 +31,7 @@
//
// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs.
//
-/mob/living/proc/animal_nom(var/mob/living/T in oview(1))
+/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1))
set name = "Animal Nom"
set category = "Vore"
set desc = "Since you can't grab, you get a verb!"
diff --git a/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm
similarity index 56%
rename from code/modules/vore/eating/vore_vr.dm
rename to modular_citadel/code/modules/vore/eating/vore_vr.dm
index f6d886e93f..f0ceb97e31 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm
@@ -23,6 +23,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
//
+
//
// The datum type bolted onto normal preferences datums for storing Vore stuff
//
@@ -40,21 +41,23 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Actual preferences
var/digestable = TRUE
var/devourable = FALSE
+// var/allowmobvore = TRUE
var/list/belly_prefs = list()
- var/vore_taste
+ var/vore_taste = "nothing in particular"
+// var/can_be_drop_prey = FALSE
+// var/can_be_drop_pred = FALSE
//Mechanically required
var/path
var/slot
var/client/client
var/client_ckey
- var/client/parent
/datum/vore_preferences/New(client/C)
if(istype(C))
client = C
client_ckey = C.ckey
- load_vore(C)
+ load_vore()
//
// Check if an object is capable of eating things, based on vore_organs
@@ -68,46 +71,60 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//
// Belly searching for simplifying other procs
+// Mostly redundant now with belly-objects and isbelly(loc)
//
/proc/check_belly(atom/movable/A)
- if(istype(A.loc,/mob/living))
- var/mob/living/M = A.loc
- for(var/I in M.vore_organs)
- var/datum/belly/B = M.vore_organs[I]
- if(A in B.internal_contents)
- return(B)
-
- return FALSE
+ return isbelly(A.loc)
//
// Save/Load Vore Preferences
//
+/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json")
+ if(!ckey || !slot) return
+ path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/vore/[filename][slot].[ext]"
+
+
/datum/vore_preferences/proc/load_vore()
- if(!client || !client_ckey) return FALSE //No client, how can we save?
+ if(!client || !client_ckey)
+ return FALSE //No client, how can we save?
+ if(!client.prefs || !client.prefs.default_slot)
+ return FALSE //Need to know what character to load!
slot = client.prefs.default_slot
- path = client.prefs.path
+ load_path(client_ckey,slot)
if(!path) return FALSE //Path couldn't be set?
if(!fexists(path)) //Never saved before
save_vore() //Make the file first
return TRUE
- var/savefile/S = new /savefile(path)
- if(!S) return FALSE //Savefile object couldn't be created?
+ var/list/json_from_file = json_decode(file2text(path))
+ if(!json_from_file)
+ return FALSE //My concern grows
- S.cd = "/character[slot]"
+ var/version = json_from_file["version"]
+ json_from_file = patch_version(json_from_file,version)
- S["digestable"] >> digestable
- S["devourable"] >> devourable
- S["belly_prefs"] >> belly_prefs
- S["vore_taste"] >> vore_taste
+ digestable = json_from_file["digestable"]
+ devourable = json_from_file["devourable"]
+// allowmobvore = json_from_file["allowmobvore"]
+ vore_taste = json_from_file["vore_taste"]
+// can_be_drop_prey = json_from_file["can_be_drop_prey"]
+// can_be_drop_prey = json_from_file["can_be_drop_pred"]
+ belly_prefs = json_from_file["belly_prefs"]
+ //Quick sanitize
if(isnull(digestable))
digestable = TRUE
if(isnull(devourable))
devourable = FALSE
+/* if(isnull(allowmobvore))
+ allowmobvore = TRUE
+ if(isnull(can_be_drop_prey))
+ allowmobvore = FALSE
+ if(isnull(can_be_drop_pred))
+ allowmobvore = FALSE */
if(isnull(belly_prefs))
belly_prefs = list()
@@ -115,28 +132,37 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences/proc/save_vore()
if(!path) return FALSE
- if(!slot) return FALSE
- var/savefile/S = new /savefile(path)
- if(!S) return FALSE
- S.cd = "/character[slot]"
- WRITE_FILE(S["digestable"], digestable)
- WRITE_FILE(S["devourable"], devourable)
- WRITE_FILE(S["belly_prefs"], belly_prefs)
- WRITE_FILE(S["vore_taste"], vore_taste)
+ var/version = 1 //For "good times" use in the future
+ var/list/settings_list = list(
+ "version" = version,
+ "digestable" = digestable,
+ "devourable" = devourable,
+ "vore_taste" = vore_taste,
+ "belly_prefs" = belly_prefs,
+ )
+
+ /* commented out list things
+ "allowmobvore" = allowmobvore,
+ "can_be_drop_prey" = can_be_drop_prey,
+ "can_be_drop_pred" = can_be_drop_pred, */
+
+ //List to JSON
+ var/json_to_file = json_encode(settings_list)
+ if(!json_to_file)
+ testing("Saving: [path] failed jsonencode")
+ return FALSE
+
+ //Write it out
+ if(fexists(path))
+ fdel(path) //Byond only supports APPENDING to files, not replacing.
+ text2file(json_to_file,path)
+ if(!fexists(path))
+ testing("Saving: [path] failed file write")
+ return FALSE
return TRUE
-#ifdef TESTING
-//DEBUG
-//Some crude tools for testing savefiles
-//path is the savefile path
-/client/verb/vore_savefile_export(path as text)
- var/savefile/S = new /savefile(path)
- S.ExportText("/",file("[path].txt"))
-//path is the savefile path
-/client/verb/vore_savefile_import(path as text)
- var/savefile/S = new /savefile(path)
- S.ImportText("/",file("[path].txt"))
-
-#endif
\ No newline at end of file
+//Can do conversions here
+/datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version)
+ return json_from_file
\ No newline at end of file
diff --git a/code/modules/vore/eating/voreitems.dm b/modular_citadel/code/modules/vore/eating/voreitems.dm
similarity index 93%
rename from code/modules/vore/eating/voreitems.dm
rename to modular_citadel/code/modules/vore/eating/voreitems.dm
index 5d157c39fe..741782545a 100644
--- a/code/modules/vore/eating/voreitems.dm
+++ b/modular_citadel/code/modules/vore/eating/voreitems.dm
@@ -16,7 +16,7 @@
/obj/item/projectile/sickshot
name = "sickshot pulse"
icon_state = "e_netting"
- damage = 1
+ damage = 0
damage_type = STAMINA
range = 2
@@ -25,8 +25,7 @@
var/mob/living/carbon/H = target
if(prob(5))
for(var/X in H.vore_organs)
- var/datum/belly/B = H.vore_organs[X]
- B.release_all_contents()
+ H.release_vore_contents()
H.visible_message("[H] contracts strangely, spewing out contents on the floor!", \
"You spew out everything inside you on the floor!")
return
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
similarity index 59%
rename from code/modules/vore/eating/vorepanel_vr.dm
rename to modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
index e9bb44765f..7d7a48ed28 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
@@ -14,7 +14,7 @@
var/datum/vore_look/picker_holder = new()
picker_holder.loop = picker_holder
- picker_holder.selected = vore_organs[vore_selected]
+ picker_holder.selected = vore_selected
var/dat = picker_holder.gen_vui(src)
@@ -22,11 +22,23 @@
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
+/mob/living/proc/updateVRPanel() //Panel popup update call from belly events.
+ if(src.openpanel == 1)
+ var/datum/vore_look/picker_holder = new()
+ picker_holder.loop = picker_holder
+ picker_holder.selected = vore_selected
+
+ var/dat = picker_holder.gen_vui(src)
+
+ picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder)
+ picker_holder.popup.set_content(dat)
+ picker_holder.popup.open()
+
//
// Callback Handler for the Inside form
//
/datum/vore_look
- var/datum/belly/selected
+ var/obj/belly/selected
var/show_interacts = TRUE
var/datum/browser/popup
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
@@ -44,29 +56,38 @@
/datum/vore_look/proc/gen_vui(var/mob/living/user)
var/dat
- if (is_vore_predator(user.loc))
- var/mob/living/eater = user.loc
- var/datum/belly/inside_belly
-
- //This big block here figures out where the prey is
- inside_belly = check_belly(user)
+ var/atom/userloc = user.loc
+ if (isbelly(userloc))
+ var/obj/belly/inside_belly = userloc
+ var/mob/living/eater = inside_belly.owner
+ //Don't display this part if we couldn't find the belly since could be held in hand.
if(inside_belly)
- dat += "You are currently inside [eater]'s [inside_belly]!
"
+ dat += "You are currently [user.absorbed ? "absorbed into " : "inside "] [eater]'s [inside_belly]!
"
- if(inside_belly.inside_flavor)
- dat += "[inside_belly.inside_flavor]
"
+ if(inside_belly.desc)
+ dat += "[inside_belly.desc]
"
- if (inside_belly.internal_contents.len > 1)
+ if (inside_belly.contents.len > 1)
dat += "You can see the following around you:
"
- for (var/atom/movable/O in inside_belly.internal_contents)
+ for (var/atom/movable/O in inside_belly)
if(istype(O,/mob/living))
var/mob/living/M = O
//That's just you
if(M == user)
continue
+
+ //That's an absorbed person you're checking
+ if(M.absorbed)
+ if(user.absorbed)
+ dat += "[O]"
+ continue
+ else
+ continue
+
//Anything else
- dat += "[O]"
+ dat += "[O]"
+
//Zero-width space, for wrapping
dat += ""
else
@@ -75,8 +96,8 @@
dat += "
"
dat += ""
- for(var/K in user.vore_organs) //Fuggin can't iterate over values
- var/datum/belly/B = user.vore_organs[K]
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
if(B == selected)
dat += "- [B.name]"
else
@@ -90,8 +111,10 @@
spanstyle = "color:red;"
if(DM_HEAL)
spanstyle = "color:green;"
+ if(DM_NOISY)
+ spanstyle = "color:purple;"
- dat += " ([B.internal_contents.len])
"
+ dat += " ([B.contents.len])"
if(user.vore_organs.len < BELLIES_MAX)
dat += "- New+
"
@@ -102,15 +125,27 @@
if(!selected)
dat += "No belly selected. Click one to select it."
else
- if(selected.internal_contents.len > 0)
+ if(selected.contents.len)
dat += "Contents: "
- for(var/O in selected.internal_contents)
+ for(var/O in selected)
+
+ //Mobs can be absorbed, so treat them separately from everything else
+ if(istype(O,/mob/living))
+ var/mob/living/M = O
+
+ //Absorbed gets special color OOoOOOOoooo
+ if(M.absorbed)
+ dat += "[O]"
+ continue
+
+ //Anything else
dat += "[O]"
//Zero-width space, for wrapping
dat += ""
+
//If there's more than one thing, add an [All] button
- if(selected.internal_contents.len > 1)
+ if(selected.contents.len > 1)
dat += "\[All\]"
dat += "
"
@@ -129,14 +164,15 @@
//Inside flavortext
dat += "
Flavor Text:"
- dat += " '[selected.inside_flavor]'"
+ dat += " '[selected.desc]'"
//Belly sound
dat += "
Set Vore Sound"
dat += "Test"
- // //Belly silence
- // dat += "
Belly Silence ([selected.silenced ? "Silenced" : "Noisy"])"
+ //Release sound
+ dat += "
Set Release Sound"
+ dat += "Test"
//Belly messages
dat += "
Belly Messages"
@@ -145,6 +181,10 @@
dat += "
Can Taste:"
dat += " [selected.can_taste ? "Yes" : "No"]"
+ //Minimum size prey must be to show up.
+ dat += "
Required examine size:"
+ dat += " [selected.bulge_size*100]%"
+
//Belly escapability
dat += "
Belly Interactions ([selected.escapable ? "On" : "Off"])"
if(selected.escapable)
@@ -173,15 +213,21 @@
dat += " [selected.digestchance]%"
dat += "
"
+ // Belly Silence
+ dat += "
Belly Silence (for not belly bellies):"
+ dat += " [selected.silent ? "Yes" : "No"]"
+
//Delete button
dat += "
Delete Belly"
+ dat += "Set Flavor"
+ dat += "Toggle Hunger Noises"
+
dat += "
"
//Under the last HR, save and stuff.
dat += "Save Prefs"
dat += "Refresh"
- dat += "Set Flavor"
dat += "
"
switch(user.digestable)
@@ -221,8 +267,8 @@
if(href_list["outsidepick"])
var/atom/movable/tgt = locate(href_list["outsidepick"])
- var/datum/belly/OB = locate(href_list["outsidebelly"])
- if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu.
+ var/obj/belly/OB = locate(href_list["outsidebelly"])
+ if(!(tgt in OB)) //Aren't here anymore, need to update menu.
return TRUE
var/intent = "Examine"
@@ -234,42 +280,49 @@
M.examine(user)
if("Help Out") //Help the inside-mob out
- to_chat(user, "You begin to push [M] to freedom!")
- to_chat(M, "[usr] begins to push you to freedom!")
- M.loc << "Someone is trying to escape from inside you!"
+ if(user.stat || user.absorbed || M.absorbed)
+ to_chat(user,"You can't do that in your state!")
+ return 1
+
+ to_chat(user,"You begin to push [M] to freedom!")
+ to_chat(M,"[usr] begins to push you to freedom!")
+ to_chat(M.loc,"Someone is trying to escape from inside you!")
sleep(50)
if(prob(33))
OB.release_specific_contents(M)
- to_chat(usr, "You manage to help [M] to safety!")
- to_chat(M, "[user] pushes you free!")
- M.loc << "[M] forces free of the confines of your body!"
+ to_chat(usr,"You manage to help [M] to safety!")
+ to_chat(M,"[user] pushes you free!")
+ to_chat(OB.owner,"[M] forces free of the confines of your body!")
else
- to_chat(user, "[M] slips back down inside despite your efforts.")
- to_chat(M, " Even with [user]'s help, you slip back inside again.")
- M.loc << "Your body efficiently shoves [M] back where they belong."
+ to_chat(user,"[M] slips back down inside despite your efforts.")
+ to_chat(M," Even with [user]'s help, you slip back inside again.")
+ to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.")
+
if("Devour") //Eat the inside mob
+ if(user.absorbed || user.stat)
+ to_chat(user,"You can't do that in your state!")
+ return 1
+
if(!user.vore_selected)
- to_chat(user, "Pick a belly on yourself first!")
- return
+ to_chat(user,"Pick a belly on yourself first!")
+ return 1
- var/datum/belly/TB = user.vore_organs[user.vore_selected]
- to_chat(user, "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!")
- to_chat(M, "[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!")
- M.loc << "Someone inside you is eating someone else!"
+ var/obj/belly/TB = user.vore_selected
+ to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!")
+ to_chat(M,"[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!")
+ to_chat(OB.owner,"Someone inside you is eating someone else!")
- sleep(TB.nonhuman_prey_swallow_time)
- if((user in OB.internal_contents) && (M in OB.internal_contents))
- to_chat(user, "You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!")
- to_chat(M, "[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!")
- M.loc << "Someone inside you has eaten someone else!"
- M.loc = user
+ sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound.
+ if((user in OB) && (M in OB)) //Make sure they're still here.
+ to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!")
+ to_chat(M,"[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!")
+ to_chat(OB.owner,"Someone inside you has eaten someone else!")
TB.nom_mob(M)
- OB.internal_contents -= M
else if(istype(tgt,/obj/item))
var/obj/item/T = tgt
- if(!(tgt in OB.internal_contents))
+ if(!(tgt in OB.contents))
//Doesn't exist anymore, update.
return TRUE
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
@@ -301,27 +354,29 @@
return
selected.release_all_contents()
- playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
to_chat(user.loc,"Everything is released from [user]!")
if("Move all")
if(user.stat)
to_chat(user, "You can't do that in your state!")
- return
+ return FALSE
- var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
+ var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs
+ if(!choice)
+ return FALSE
- if(choice == "Cancel - Don't Move")
- return
- else
- var/datum/belly/B = user.vore_organs[choice]
- for(var/atom/movable/tgt in selected.internal_contents)
- to_chat(tgt, "You're squished from [user]'s [selected] to their [B]!")
- selected.transfer_contents(tgt, B, 1)
- playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/atom/movable/tgt in selected)
+ selected.transfer_contents(tgt, choice, 1)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!")
var/atom/movable/tgt = locate(href_list["insidepick"])
- if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there.
+ if(!(tgt in selected)) //Old menu, needs updating because they aren't really there.
return TRUE//Forces update
intent = "Examine"
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
@@ -335,48 +390,54 @@
return FALSE
selected.release_specific_contents(tgt)
- playsound(get_turf(user),'sound/effects/splat.ogg',50,0,-5,0,ignore_walls = FALSE)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/escape.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
user.loc << "[tgt] is released from [user]!"
if("Move")
if(user.stat)
- to_chat(user, "You can't do that in your state!")
- return FALSE
+ to_chat(user,"You can't do that in your state!")
+ return 0
- var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
+ var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs
+ if(!choice || !(tgt in selected))
+ return 0
- if(choice == "Cancel - Don't Move")
- return
- else
- var/datum/belly/B = user.vore_organs[choice]
- if (!(tgt in selected.internal_contents))
- return FALSE
- to_chat(tgt, "You're moved from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!")
- playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE)
- selected.transfer_contents(tgt, B)
+ to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!")
+ selected.transfer_contents(tgt, choice)
+ for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+ if(M.client && M.client.prefs.toggles & EATING_NOISES)
+ playsound(get_turf(user),'sound/vore/pred/stomachmove.ogg',50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
if(href_list["newbelly"])
if(user.vore_organs.len >= BELLIES_MAX)
- return TRUE
+ return 0
var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
+ var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered belly name is too long.")
- return FALSE
- if(new_name in user.vore_organs)
- to_chat(usr, "No duplicate belly names, please.")
- return FALSE
+ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
+ // else if(whatever) //Next test here.
+ else
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
+ if(lowertext(new_name) == lowertext(B.name))
+ failure_msg = "No duplicate belly names, please."
+ break
- var/datum/belly/NB = new(user)
+ if(failure_msg) //Something went wrong.
+ alert(user,failure_msg,"Error!")
+ return 0
+
+ var/obj/belly/NB = new(user)
NB.name = new_name
- NB.owner = user //might be the thing we all needed.
- user.vore_organs[new_name] = NB
selected = NB
if(href_list["bellypick"])
selected = locate(href_list["bellypick"])
- user.vore_selected = selected.name
+ user.vore_selected = selected
////
//Please keep these the same order they are on the panel UI for ease of coding
@@ -384,41 +445,40 @@
if(href_list["b_name"])
var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
+ var/failure_msg
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered belly name length invalid (must be longer than 2, shorter than 12).")
- return FALSE
- if(new_name in user.vore_organs)
- to_chat(usr, "No duplicate belly names, please.")
- return FALSE
+ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
+ // else if(whatever) //Next test here.
+ else
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
+ if(lowertext(new_name) == lowertext(B.name))
+ failure_msg = "No duplicate belly names, please."
+ break
+
+ if(failure_msg) //Something went wrong.
+ alert(user,failure_msg,"Error!")
+ return 0
- user.vore_organs[new_name] = selected
- user.vore_organs -= selected.name
selected.name = new_name
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes
- if(selected.digest_modes.len == 1) // Don't do anything
- return 1
- if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this...
- var/index = selected.digest_modes.Find(selected.digest_mode)
- switch(index)
- if(1)
- selected.digest_mode = selected.digest_modes[2]
- if(2)
- selected.digest_mode = selected.digest_modes[1]
- else
- selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list
+ var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list
+ if(!new_mode)
+ return 0
+ selected.digest_mode = new_mode
if(href_list["b_desc"])
- var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null)
+ var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null)
+
if(new_desc)
new_desc = readd_quotes(new_desc)
if(length(new_desc) > BELLIES_DESC_MAX)
- to_chat(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit.")
+ alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error")
return FALSE
-
- selected.inside_flavor = new_desc
+ selected.desc = new_desc
else //Returned null
return FALSE
@@ -429,12 +489,11 @@
"Struggle Message (outside)",
"Struggle Message (inside)",
"Examine Message (when full)",
- "Reset All To Default",
- "Cancel - No Changes"
+ "Reset All To Default"
)
alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.")
- var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages
+ var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") as null|anything in messages
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name."
switch(choice)
@@ -459,7 +518,7 @@
selected.set_messages(new_message,"smi")
if("Examine Message (when full)")
- var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). "+help,"Examine Message (when full)",selected.get_messages("em")) as message
+ var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message
if(new_message)
selected.set_messages(new_message,"em")
@@ -471,40 +530,57 @@
selected.struggle_messages_outside = initial(selected.struggle_messages_outside)
selected.struggle_messages_inside = initial(selected.struggle_messages_inside)
- if("Cancel - No Changes")
- return
-
if(href_list["b_verb"])
var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null)
if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN)
- to_chat(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).")
- return FALSE
+ alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error")
+ return 0
selected.vore_verb = new_verb
- if(href_list["b_sound"])
- var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in GLOB.pred_vore_sounds + "Cancel - No Changes"
+ if(href_list["b_release"])
+ var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.release_sound
- if(choice == "Cancel")
+ if(!choice)
+ return
+
+ selected.release_sound = GLOB.release_sound[choice]
+
+ if(href_list["b_releasesoundtest"])
+ var/soundfile = GLOB.release_sound[selected.release_sound]
+ if(soundfile)
+ user << soundfile
+
+ if(href_list["b_sound"])
+ var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds
+
+ if(!choice)
return
selected.vore_sound = GLOB.pred_vore_sounds[choice]
if(href_list["b_soundtest"])
- user << selected.vore_sound
-/*
- if(href_list["silenced"])
- if(selected.silenced == FALSE)
- selected.silenced = TRUE
- to_chat(usr,"The [selected.name] is now silenced, it will not play the internal loop to prey within it.")
- else if(selected.silenced == TRUE)
- selected.silenced = FALSE
- to_chat(usr,"The [selected.name] will play the internal loop to prey within it.")
-*/
+ var/soundfile = GLOB.pred_vore_sounds[selected.vore_sound]
+ if(soundfile)
+ user << soundfile
+
if(href_list["b_tastes"])
selected.can_taste = !selected.can_taste
+ if(href_list["b_bulge_size"])
+ var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null
+ if(new_bulge == null)
+ return
+ if(new_bulge == 0) //Disable.
+ selected.bulge_size = 0
+ to_chat(user,"Your stomach will not be seen on examine.")
+ else if (!IsInRange(new_bulge,25,200))
+ selected.bulge_size = 0.25 //Set it to the default.
+ to_chat(user,"Invalid size.")
+ else if(new_bulge)
+ selected.bulge_size = (new_bulge/100)
+
if(href_list["b_escapable"])
if(selected.escapable == FALSE) //Possibly escapable and special interactions.
selected.escapable = TRUE
@@ -515,7 +591,7 @@
show_interacts = FALSE //Force the hiding of the panel
else
to_chat(usr,"Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1
- selected.escapable = FALSE
+ selected.escapable = TRUE
show_interacts = FALSE //Force the hiding of the panel
if(href_list["b_escapechance"])
@@ -537,68 +613,73 @@
var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name)
if(!choice) //They cancelled, no changes
- return
+ return FALSE
else if(choice == "None - Remove")
selected.transferlocation = null
else
selected.transferlocation = user.vore_organs[choice]
+ if(href_list["b_absorbchance"])
+ var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
+ if(!isnull(absorb_chance_input))
+ selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(selected.absorbchance))
+
if(href_list["b_digestchance"])
var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null
if(!isnull(digest_chance_input))
selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance))
+ if(href_list["b_silent"])
+ selected.silent = !selected.silent
+
if(href_list["b_del"])
- var/dest_for = FALSE //Check to see if it's the destination of another vore organ.
- for(var/I in user.vore_organs)
- var/datum/belly/B = user.vore_organs[I]
+ var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel")
+ if(!alert == "Delete")
+ return FALSE
+
+ var/failure_msg = ""
+
+ var/dest_for //Check to see if it's the destination of another vore organ.
+ for(var/belly in user.vore_organs)
+ var/obj/belly/B = belly
if(B.transferlocation == selected)
dest_for = B.name
+ failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. "
break
- if(dest_for)
- alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error")
- return TRUE
- else if(selected.internal_contents.len)
- alert("Can't delete bellies with contents!","Error")
- return TRUE
- if(selected.internal_contents.len)
- to_chat(usr, "Can't delete bellies with contents!")
- return
- else if(selected.immutable)
- to_chat(usr, "This belly is marked as undeletable.")
- return
- else if(user.vore_organs.len == 1)
- to_chat(usr, "You must have at least one belly.")
- return
- else
- var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel")
- if(alert == "Delete" && !selected.internal_contents.len)
- user.vore_organs -= selected.name
- user.vore_organs.Remove(selected)
- selected = user.vore_organs[1]
- user.vore_selected = user.vore_organs[1]
- to_chat(usr,"Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach.")
+ if(selected.contents.len)
+ failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same.
+ if(selected.immutable)
+ failure_msg += "This belly is marked as undeletable. "
+ if(user.vore_organs.len == 1)
+ failure_msg += "You must have at least one belly. "
+
+ if(failure_msg)
+ alert(user,failure_msg,"Error!")
+ return FALSE
+
+ qdel(selected)
+ selected = user.vore_organs[1]
+ user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
- if(user.save_vore_prefs())
- to_chat(user, "Belly Preferences saved!")
+ if(!user.save_vore_prefs())
+ to_chat(user, "Belly Preferences not saved!")
else
- to_chat(user, "ERROR: Belly Preferences were not saved!")
+ to_chat(user, "Belly Preferences were saved!")
log_admin("Could not save vore prefs on USER: [user].")
if(href_list["setflavor"])
var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null)
+ if(!new_flavor)
+ return 0
- if(new_flavor)
- new_flavor = readd_quotes(new_flavor)
- if(length(new_flavor) > FLAVOR_MAX)
- alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error")
- return FALSE
- user.vore_taste = new_flavor
- else //Returned null
- return FALSE
+ new_flavor = readd_quotes(new_flavor)
+ if(length(new_flavor) > FLAVOR_MAX)
+ alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
+ return 0
+ user.vore_taste = new_flavor
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
@@ -626,5 +707,15 @@
if(user.client.prefs_vr)
user.client.prefs_vr.devourable = user.devourable
+ if(href_list["togglenoisy"])
+ var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Enable audible hunger")
+ user.noisy = TRUE
+ if("Disable audible hunger")
+ user.noisy = FALSE
+
//Refresh when interacted with, returning 1 makes vore_look.Topic update
- return TRUE
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/hook-defs_vr.dm b/modular_citadel/code/modules/vore/hook-defs_vr.dm
similarity index 100%
rename from code/modules/vore/hook-defs_vr.dm
rename to modular_citadel/code/modules/vore/hook-defs_vr.dm
diff --git a/modular_citadel/code/modules/vore/persistence.dm b/modular_citadel/code/modules/vore/persistence.dm
new file mode 100644
index 0000000000..078a3f48ee
--- /dev/null
+++ b/modular_citadel/code/modules/vore/persistence.dm
@@ -0,0 +1,90 @@
+/*
+* Returns a byond list that can be passed to the "deserialize" proc
+* to bring a new instance of this atom to its original state
+*
+* If we want to store this info, we can pass it to `json_encode` or some other
+* interface that suits our fancy, to make it into an easily-handled string
+*/
+/datum/proc/serialize()
+ var/data = list("type" = "[type]")
+ return data
+
+/*
+* This is given the byond list from above, to bring this atom to the state
+* described in the list.
+* This will be called after `New` but before `initialize`, so linking and stuff
+* would probably be handled in `initialize`
+*
+* Also, this should only be called by `list_to_object` in persistence.dm - at least
+* with current plans - that way it can actually initialize the type from the list
+*/
+/datum/proc/deserialize(var/list/data)
+ return
+
+/atom
+ // This var isn't actually used for anything, but is present so that
+ // DM's map reader doesn't forfeit on reading a JSON-serialized map
+ var/map_json_data
+
+// This is so specific atoms can override these, and ignore certain ones
+/atom/proc/vars_to_save()
+ return list("color","dir","icon","icon_state","name","pixel_x","pixel_y")
+
+/atom/proc/map_important_vars()
+ // A list of important things to save in the map editor
+ return list("color","dir","icon","icon_state","layer","name","pixel_x","pixel_y")
+
+/area/map_important_vars()
+ // Keep the area default icons, to keep things nice and legible
+ return list("name")
+
+// No need to save any state of an area by default
+/area/vars_to_save()
+ return list("name")
+
+/atom/serialize()
+ var/list/data = ..()
+ for(var/thing in vars_to_save())
+ if(vars[thing] != initial(vars[thing]))
+ data[thing] = vars[thing]
+ return data
+
+
+/atom/deserialize(var/list/data)
+ for(var/thing in vars_to_save())
+ if(thing in data)
+ vars[thing] = data[thing]
+ ..()
+
+
+/*
+Whoops, forgot to put documentation here.
+What this does, is take a JSON string produced by running
+BYOND's native `json_encode` on a list from `serialize` above, and
+turns that string into a new instance of that object.
+
+You can also easily get an instance of this string by calling "Serialize Marked Datum"
+in the "Debug" tab.
+
+If you're clever, you can do neat things with SDQL and this, though be careful -
+some objects, like humans, are dependent that certain extra things are defined
+in their list
+*/
+/proc/object_to_json(var/atom/movable/thing)
+ return json_encode(thing.serialize())
+
+/proc/json_to_object(var/json_data, var/loc)
+ return list_to_object(json_decode(json_data), loc)
+
+/proc/list_to_object(var/list/data, var/loc)
+ if(!islist(data))
+ throw EXCEPTION("You didn't give me a list, bucko")
+ if(!("type" in data))
+ throw EXCEPTION("No 'type' field in the data")
+ var/path = text2path(data["type"])
+ if(!path)
+ throw EXCEPTION("Path not found: [path]")
+
+ var/atom/movable/thing = new path(loc)
+ thing.deserialize(data)
+ return thing
\ No newline at end of file
diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/grav_pull_vr.dm
rename to modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm
diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/holder_micro_vr.dm
rename to modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm
diff --git a/code/modules/vore/resizing/resize_vr.dm b/modular_citadel/code/modules/vore/resizing/resize_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/resize_vr.dm
rename to modular_citadel/code/modules/vore/resizing/resize_vr.dm
diff --git a/code/modules/vore/resizing/sizechemicals.dm b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm
similarity index 98%
rename from code/modules/vore/resizing/sizechemicals.dm
rename to modular_citadel/code/modules/vore/resizing/sizechemicals.dm
index 78b4bd71ca..1164bf65d6 100644
--- a/code/modules/vore/resizing/sizechemicals.dm
+++ b/modular_citadel/code/modules/vore/resizing/sizechemicals.dm
@@ -110,6 +110,6 @@
for(var/atom/movable/A in B.internal_contents)
if(prob(55))
playsound(M, 'sound/effects/splat.ogg', 50, 1)
- B.release_specific_contents(A)
+ B.release_vore_contents(A)
..()
. = 1
\ No newline at end of file
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/modular_citadel/code/modules/vore/resizing/sizegun_vr.dm
similarity index 100%
rename from code/modules/vore/resizing/sizegun_vr.dm
rename to modular_citadel/code/modules/vore/resizing/sizegun_vr.dm
diff --git a/code/modules/vore/trycatch_vr.dm b/modular_citadel/code/modules/vore/trycatch_vr.dm
similarity index 100%
rename from code/modules/vore/trycatch_vr.dm
rename to modular_citadel/code/modules/vore/trycatch_vr.dm
diff --git a/code/citadel/icons/misc.dmi b/modular_citadel/icons/misc/misc.dmi
similarity index 100%
rename from code/citadel/icons/misc.dmi
rename to modular_citadel/icons/misc/misc.dmi
diff --git a/code/citadel/icons/robot_transformations.dmi b/modular_citadel/icons/mob/legacy robo transforms.dmi
similarity index 100%
rename from code/citadel/icons/robot_transformations.dmi
rename to modular_citadel/icons/mob/legacy robo transforms.dmi
diff --git a/code/citadel/icons/mobs.dmi b/modular_citadel/icons/mob/mobs.dmi
similarity index 100%
rename from code/citadel/icons/mobs.dmi
rename to modular_citadel/icons/mob/mobs.dmi
diff --git a/code/citadel/icons/drinks.dmi b/modular_citadel/icons/obj/drinks.dmi
similarity index 100%
rename from code/citadel/icons/drinks.dmi
rename to modular_citadel/icons/obj/drinks.dmi
diff --git a/code/citadel/icons/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi
similarity index 100%
rename from code/citadel/icons/breasts.dmi
rename to modular_citadel/icons/obj/genitals/breasts.dmi
diff --git a/code/citadel/icons/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
similarity index 100%
rename from code/citadel/icons/breasts_onmob.dmi
rename to modular_citadel/icons/obj/genitals/breasts_onmob.dmi
diff --git a/code/citadel/icons/dildo.dmi b/modular_citadel/icons/obj/genitals/dildo.dmi
similarity index 100%
rename from code/citadel/icons/dildo.dmi
rename to modular_citadel/icons/obj/genitals/dildo.dmi
diff --git a/code/citadel/icons/effects.dmi b/modular_citadel/icons/obj/genitals/effects.dmi
similarity index 100%
rename from code/citadel/icons/effects.dmi
rename to modular_citadel/icons/obj/genitals/effects.dmi
diff --git a/code/citadel/icons/hud.dmi b/modular_citadel/icons/obj/genitals/hud.dmi
similarity index 100%
rename from code/citadel/icons/hud.dmi
rename to modular_citadel/icons/obj/genitals/hud.dmi
diff --git a/code/citadel/icons/onahole.dmi b/modular_citadel/icons/obj/genitals/onahole.dmi
similarity index 100%
rename from code/citadel/icons/onahole.dmi
rename to modular_citadel/icons/obj/genitals/onahole.dmi
diff --git a/code/citadel/icons/ovipositor.dmi b/modular_citadel/icons/obj/genitals/ovipositor.dmi
similarity index 100%
rename from code/citadel/icons/ovipositor.dmi
rename to modular_citadel/icons/obj/genitals/ovipositor.dmi
diff --git a/code/citadel/icons/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi
similarity index 100%
rename from code/citadel/icons/penis.dmi
rename to modular_citadel/icons/obj/genitals/penis.dmi
diff --git a/code/citadel/icons/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi
similarity index 100%
rename from code/citadel/icons/penis_onmob.dmi
rename to modular_citadel/icons/obj/genitals/penis_onmob.dmi
diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
similarity index 100%
rename from code/citadel/icons/taur_penis_onmob.dmi
rename to modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
diff --git a/code/citadel/icons/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi
similarity index 100%
rename from code/citadel/icons/vagina.dmi
rename to modular_citadel/icons/obj/genitals/vagina.dmi
diff --git a/code/citadel/icons/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi
similarity index 100%
rename from code/citadel/icons/vagina_onmob.dmi
rename to modular_citadel/icons/obj/genitals/vagina_onmob.dmi
diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi
new file mode 100644
index 0000000000..f5e89227c7
Binary files /dev/null and b/modular_citadel/icons/obj/hypospraymkii.dmi differ
diff --git a/code/citadel/icons/objects.dmi b/modular_citadel/icons/obj/objects.dmi
similarity index 100%
rename from code/citadel/icons/objects.dmi
rename to modular_citadel/icons/obj/objects.dmi
diff --git a/code/citadel/icons/structures.dmi b/modular_citadel/icons/obj/structures.dmi
similarity index 100%
rename from code/citadel/icons/structures.dmi
rename to modular_citadel/icons/obj/structures.dmi
diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi
new file mode 100644
index 0000000000..694cc1741b
Binary files /dev/null and b/modular_citadel/icons/obj/vial.dmi differ
diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg
new file mode 100644
index 0000000000..b70d3fd5b5
Binary files /dev/null and b/sound/items/hypospray.ogg differ
diff --git a/sound/items/hypospray2.ogg b/sound/items/hypospray2.ogg
new file mode 100644
index 0000000000..14835e9bb6
Binary files /dev/null and b/sound/items/hypospray2.ogg differ
diff --git a/sound/items/hypospray_long.ogg b/sound/items/hypospray_long.ogg
new file mode 100644
index 0000000000..d7da6c839f
Binary files /dev/null and b/sound/items/hypospray_long.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index f297222201..2129228566 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -92,6 +92,7 @@
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\wall_dents.dm"
#include "code\__DEFINES\wires.dm"
+#include "code\__HELPERS\_cit_helpers.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
#include "code\__HELPERS\_string_lists.dm"
@@ -182,42 +183,6 @@
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\swarmer.dm"
-#include "code\citadel\_cit_helpers.dm"
-#include "code\citadel\cit_areas.dm"
-#include "code\citadel\cit_arousal.dm"
-#include "code\citadel\cit_clothes.dm"
-#include "code\citadel\cit_crewobjectives.dm"
-#include "code\citadel\cit_displaycases.dm"
-#include "code\citadel\cit_emotes.dm"
-#include "code\citadel\cit_guns.dm"
-#include "code\citadel\cit_kegs.dm"
-#include "code\citadel\cit_miscreants.dm"
-#include "code\citadel\cit_reagents.dm"
-#include "code\citadel\cit_spawners.dm"
-#include "code\citadel\cit_uniforms.dm"
-#include "code\citadel\cit_vendors.dm"
-#include "code\citadel\dogborgstuff.dm"
-#include "code\citadel\plasmacases.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_cargo.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_civilian.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_command.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_engineering.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_medical.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_science.dm"
-#include "code\citadel\crew_objectives\cit_crewobjectives_security.dm"
-#include "code\citadel\custom_loadout\custom_items.dm"
-#include "code\citadel\custom_loadout\load_to_mob.dm"
-#include "code\citadel\custom_loadout\read_from_file.dm"
-#include "code\citadel\organs\breasts.dm"
-#include "code\citadel\organs\eggsack.dm"
-#include "code\citadel\organs\genitals.dm"
-#include "code\citadel\organs\genitals_sprite_accessories.dm"
-#include "code\citadel\organs\ovipositor.dm"
-#include "code\citadel\organs\penis.dm"
-#include "code\citadel\organs\testicles.dm"
-#include "code\citadel\organs\vagina.dm"
-#include "code\citadel\organs\womb.dm"
-#include "code\citadel\toys\dildos.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\configuration_citadel.dm"
#include "code\controllers\controller.dm"
@@ -282,6 +247,7 @@
#include "code\controllers\subsystem\timer.dm"
#include "code\controllers\subsystem\title.dm"
#include "code\controllers\subsystem\traumas.dm"
+#include "code\controllers\subsystem\vore.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
#include "code\controllers\subsystem\processing\circuit.dm"
@@ -400,7 +366,6 @@
#include "code\datums\diseases\advance\symptoms\fever.dm"
#include "code\datums\diseases\advance\symptoms\fire.dm"
#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
-#include "code\datums\diseases\advance\symptoms\genetics.dm"
#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
#include "code\datums\diseases\advance\symptoms\headache.dm"
#include "code\datums\diseases\advance\symptoms\heal.dm"
@@ -474,7 +439,6 @@
#include "code\datums\wires\robot.dm"
#include "code\datums\wires\suit_storage_unit.dm"
#include "code\datums\wires\syndicatebomb.dm"
-#include "code\datums\wires\tesla_coil.dm"
#include "code\datums\wires\vending.dm"
#include "code\datums\wires\wires.dm"
#include "code\game\alternate_appearance.dm"
@@ -542,6 +506,7 @@
#include "code\game\machinery\dna_scanner.dm"
#include "code\game\machinery\doppler_array.dm"
#include "code\game\machinery\droneDispenser.dm"
+#include "code\game\machinery\exp_cloner.dm"
#include "code\game\machinery\firealarm.dm"
#include "code\game\machinery\flasher.dm"
#include "code\game\machinery\gulag_item_reclaimer.dm"
@@ -805,6 +770,7 @@
#include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\dogborg_sleeper.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
#include "code\game\objects\items\devices\flashlight.dm"
@@ -1093,6 +1059,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
+#include "code\modules\admin\verbs\spawnobjasmob.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
@@ -1219,6 +1186,11 @@
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
#include "code\modules\antagonists\devil\true_devil\inventory.dm"
+#include "code\modules\antagonists\disease\disease_abilities.dm"
+#include "code\modules\antagonists\disease\disease_datum.dm"
+#include "code\modules\antagonists\disease\disease_disease.dm"
+#include "code\modules\antagonists\disease\disease_event.dm"
+#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\highlander\highlander.dm"
@@ -2198,29 +2170,57 @@
#include "code\modules\procedural_mapping\mapGenerators\repair.dm"
#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
-#include "code\modules\projectiles\ammunition.dm"
-#include "code\modules\projectiles\box_magazine.dm"
-#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\pins.dm"
#include "code\modules\projectiles\projectile.dm"
-#include "code\modules\projectiles\ammunition\ammo_casings.dm"
-#include "code\modules\projectiles\ammunition\caseless.dm"
-#include "code\modules\projectiles\ammunition\energy.dm"
-#include "code\modules\projectiles\ammunition\plasma.dm"
-#include "code\modules\projectiles\ammunition\special.dm"
+#include "code\modules\projectiles\ammunition\_ammunition.dm"
+#include "code\modules\projectiles\ammunition\_firing.dm"
+#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
+#include "code\modules\projectiles\ammunition\ballistic\revolver.dm"
+#include "code\modules\projectiles\ammunition\ballistic\rifle.dm"
+#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm"
+#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
+#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
+#include "code\modules\projectiles\ammunition\caseless\foam.dm"
+#include "code\modules\projectiles\ammunition\caseless\misc.dm"
+#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
+#include "code\modules\projectiles\ammunition\energy\_energy.dm"
+#include "code\modules\projectiles\ammunition\energy\chameleon.dm"
+#include "code\modules\projectiles\ammunition\energy\ebow.dm"
+#include "code\modules\projectiles\ammunition\energy\gravity.dm"
+#include "code\modules\projectiles\ammunition\energy\laser.dm"
+#include "code\modules\projectiles\ammunition\energy\lmg.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm"
+#include "code\modules\projectiles\ammunition\energy\portal.dm"
+#include "code\modules\projectiles\ammunition\energy\special.dm"
+#include "code\modules\projectiles\ammunition\energy\stun.dm"
+#include "code\modules\projectiles\ammunition\special\magic.dm"
+#include "code\modules\projectiles\ammunition\special\syringe.dm"
+#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "code\modules\projectiles\boxes_magazines\external_mag.dm"
-#include "code\modules\projectiles\boxes_magazines\internal_mag.dm"
+#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\external\smg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\sniper.dm"
+#include "code\modules\projectiles\boxes_magazines\external\toy.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\misc.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\toy.dm"
#include "code\modules\projectiles\guns\ballistic.dm"
-#include "code\modules\projectiles\guns\beam_rifle.dm"
-#include "code\modules\projectiles\guns\chem_gun.dm"
#include "code\modules\projectiles\guns\energy.dm"
-#include "code\modules\projectiles\guns\grenade_launcher.dm"
#include "code\modules\projectiles\guns\magic.dm"
-#include "code\modules\projectiles\guns\medbeam.dm"
-#include "code\modules\projectiles\guns\mounted.dm"
-#include "code\modules\projectiles\guns\syringe_gun.dm"
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
#include "code\modules\projectiles\guns\ballistic\launchers.dm"
@@ -2232,21 +2232,58 @@
#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\megabuster.dm"
-#include "code\modules\projectiles\guns\energy\plasma.dm"
+#include "code\modules\projectiles\guns\energy\mounted.dm"
+#include "code\modules\projectiles\guns\energy\plasma_cit.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
+#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
+#include "code\modules\projectiles\guns\misc\chem_gun.dm"
+#include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
+#include "code\modules\projectiles\guns\misc\medbeam.dm"
+#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\magic.dm"
#include "code\modules\projectiles\projectile\megabuster.dm"
#include "code\modules\projectiles\projectile\plasma.dm"
-#include "code\modules\projectiles\projectile\reusable.dm"
-#include "code\modules\projectiles\projectile\special.dm"
+#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
+#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
+#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
+#include "code\modules\projectiles\projectile\bullets\grenade.dm"
+#include "code\modules\projectiles\projectile\bullets\lmg.dm"
+#include "code\modules\projectiles\projectile\bullets\pistol.dm"
+#include "code\modules\projectiles\projectile\bullets\revolver.dm"
+#include "code\modules\projectiles\projectile\bullets\rifle.dm"
+#include "code\modules\projectiles\projectile\bullets\shotgun.dm"
+#include "code\modules\projectiles\projectile\bullets\smg.dm"
+#include "code\modules\projectiles\projectile\bullets\sniper.dm"
+#include "code\modules\projectiles\projectile\bullets\special.dm"
+#include "code\modules\projectiles\projectile\energy\_energy.dm"
+#include "code\modules\projectiles\projectile\energy\chameleon.dm"
+#include "code\modules\projectiles\projectile\energy\ebow.dm"
+#include "code\modules\projectiles\projectile\energy\misc.dm"
+#include "code\modules\projectiles\projectile\energy\net_snare.dm"
+#include "code\modules\projectiles\projectile\energy\stun.dm"
+#include "code\modules\projectiles\projectile\energy\tesla.dm"
+#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
+#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
+#include "code\modules\projectiles\projectile\reusable\magspear.dm"
+#include "code\modules\projectiles\projectile\special\curse.dm"
+#include "code\modules\projectiles\projectile\special\floral.dm"
+#include "code\modules\projectiles\projectile\special\gravity.dm"
+#include "code\modules\projectiles\projectile\special\hallucination.dm"
+#include "code\modules\projectiles\projectile\special\ion.dm"
+#include "code\modules\projectiles\projectile\special\meteor.dm"
+#include "code\modules\projectiles\projectile\special\mindflayer.dm"
+#include "code\modules\projectiles\projectile\special\neurotoxin.dm"
+#include "code\modules\projectiles\projectile\special\plasma.dm"
+#include "code\modules\projectiles\projectile\special\rocket.dm"
+#include "code\modules\projectiles\projectile\special\temperature.dm"
+#include "code\modules\projectiles\projectile\special\wormhole.dm"
#include "code\modules\reagents\chem_splash.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
@@ -2343,6 +2380,7 @@
#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
+#include "code\modules\ruins\spaceruin_code\cloning_lab.dm"
#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
#include "code\modules\ruins\spaceruin_code\crashedship.dm"
#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
@@ -2514,15 +2552,6 @@
#include "code\modules\vehicles\speedbike.dm"
#include "code\modules\vehicles\vehicle_actions.dm"
#include "code\modules\vehicles\vehicle_key.dm"
-#include "code\modules\vore\hook-defs_vr.dm"
-#include "code\modules\vore\trycatch_vr.dm"
-#include "code\modules\vore\eating\belly_vr.dm"
-#include "code\modules\vore\eating\bellymodes_vr.dm"
-#include "code\modules\vore\eating\living_vr.dm"
-#include "code\modules\vore\eating\simple_animal_vr.dm"
-#include "code\modules\vore\eating\vore_vr.dm"
-#include "code\modules\vore\eating\voreitems.dm"
-#include "code\modules\vore\eating\vorepanel_vr.dm"
#include "code\modules\VR\vr_human.dm"
#include "code\modules\VR\vr_sleeper.dm"
#include "code\modules\zombie\items.dm"
@@ -2550,15 +2579,18 @@
#include "modular_citadel\code\datums\mutations\hulk.dm"
#include "modular_citadel\code\datums\wires\airlock.dm"
#include "modular_citadel\code\datums\wires\autoylathe.dm"
+#include "modular_citadel\code\game\area\cit_areas.dm"
#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm"
#include "modular_citadel\code\game\machinery\cryopod.dm"
+#include "modular_citadel\code\game\machinery\displaycases.dm"
#include "modular_citadel\code\game\machinery\Sleeper.dm"
#include "modular_citadel\code\game\machinery\toylathe.dm"
#include "modular_citadel\code\game\machinery\vending.dm"
#include "modular_citadel\code\game\machinery\computer\card.dm"
#include "modular_citadel\code\game\objects\ids.dm"
#include "modular_citadel\code\game\objects\tools.dm"
+#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
@@ -2581,12 +2613,33 @@
#include "modular_citadel\code\modules\admin\holder2.dm"
#include "modular_citadel\code\modules\admin\secrets.dm"
#include "modular_citadel\code\modules\admin\topic.dm"
+#include "modular_citadel\code\modules\antagonists\cit_crewobjectives.dm"
+#include "modular_citadel\code\modules\antagonists\cit_miscreants.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_cargo.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_civilian.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_command.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_engineering.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_medical.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_science.dm"
+#include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_security.dm"
+#include "modular_citadel\code\modules\arousal\arousal.dm"
+#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
+#include "modular_citadel\code\modules\arousal\organs\eggsack.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm"
+#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm"
+#include "modular_citadel\code\modules\arousal\organs\penis.dm"
+#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
+#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
+#include "modular_citadel\code\modules\arousal\organs\womb.dm"
+#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
#include "modular_citadel\code\modules\cargo\console.dm"
#include "modular_citadel\code\modules\cargo\packs.dm"
#include "modular_citadel\code\modules\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
#include "modular_citadel\code\modules\client\preferences.dm"
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
+#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
@@ -2603,12 +2656,15 @@
#include "modular_citadel\code\modules\client\loadout\suit.dm"
#include "modular_citadel\code\modules\client\loadout\uniform.dm"
#include "modular_citadel\code\modules\client\verbs\who.dm"
-#include "modular_citadel\code\modules\clothing\under.dm"
#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm"
+#include "modular_citadel\code\modules\clothing\suits\suits.dm"
#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm"
-#include "modular_citadel\code\modules\clothing\under\syndicate.dm"
#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
+#include "modular_citadel\code\modules\clothing\under\under.dm"
#include "modular_citadel\code\modules\crafting\recipes.dm"
+#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
+#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
+#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
#include "modular_citadel\code\modules\events\blob.dm"
#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm"
#include "modular_citadel\code\modules\jobs\jobs.dm"
@@ -2624,9 +2680,11 @@
#include "modular_citadel\code\modules\mentor\mentorpm.dm"
#include "modular_citadel\code\modules\mentor\mentorsay.dm"
#include "modular_citadel\code\modules\mining\mine_items.dm"
+#include "modular_citadel\code\modules\mob\cit_emotes.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
@@ -2634,13 +2692,34 @@
#include "modular_citadel\code\modules\power\lighting.dm"
#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm"
+#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm"
+#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
#include "modular_citadel\code\modules\research\techweb\all_nodes.dm"
#include "modular_citadel\code\modules\uplink\uplink_items.dm"
+#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
+#include "modular_citadel\code\modules\vore\persistence.dm"
+#include "modular_citadel\code\modules\vore\trycatch_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\simple_animal_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
+#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
#include "modular_citadel\interface\skin.dmf"
// END_INCLUDE
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index ffe61666b9..256b53c106 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1 @@
-@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
+@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file