diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 48054115e6..aac84a1989 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -19118,6 +19118,10 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/navbeacon{
+ codes_txt = "patrol;next_patrol=14-Starboard-Central";
+ location = "13.2-Tcommstore"
+ },
/turf/open/floor/plasteel/dark/corner,
/area/hallway/primary/starboard)
"bxn" = (
@@ -21190,10 +21194,6 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=14-Starboard-Central";
- location = "13.2-Tcommstore"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index d0bc17a426..5178dbdc8e 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -5389,7 +5389,9 @@
/turf/open/floor/plasteel,
/area/security/brig)
"ajX" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 5
+ },
/turf/open/floor/plating,
/area/engineering/atmos)
"ajY" = (
@@ -5935,6 +5937,9 @@
/obj/item/chair,
/obj/item/stack/ore/silver,
/obj/item/stack/ore/iron,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/engineering/atmos)
"akN" = (
@@ -5948,6 +5953,8 @@
dir = 4
},
/obj/structure/lattice,
+/obj/item/broken_bottle,
+/obj/item/pickaxe,
/turf/open/floor/plating/asteroid/airless,
/area/asteroid/nearstation)
"akP" = (
@@ -6356,6 +6363,9 @@
network = list("ss13","engine")
},
/mob/living/simple_animal/parrot/Poly,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 10
+ },
/turf/open/floor/plasteel/dark,
/area/command/heads_quarters/ce)
"alF" = (
@@ -7262,11 +7272,17 @@
/turf/open/floor/plating,
/area/cargo/miningdock)
"anu" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
},
-/turf/closed/wall/r_wall,
-/area/command/heads_quarters/ce)
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark/corner{
+ dir = 4
+ },
+/area/engineering/atmos)
"anv" = (
/obj/effect/turf_decal/stripes/end{
dir = 8
@@ -7275,9 +7291,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/yellow,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
- },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/command/heads_quarters/ce)
"anw" = (
@@ -9656,7 +9670,7 @@
/obj/structure/sign/poster/random{
pixel_y = 32
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engineering/atmos)
"arB" = (
/obj/effect/turf_decal/tile/red{
@@ -10244,10 +10258,10 @@
/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel/dark/corner{
- dir = 1
+ dir = 4
},
/area/engineering/atmos)
"asx" = (
@@ -10313,10 +10327,10 @@
/obj/machinery/meter,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel/dark/corner{
- dir = 1
+ dir = 4
},
/area/engineering/atmos)
"asD" = (
@@ -10334,20 +10348,20 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel/dark/corner{
- dir = 1
+ dir = 4
},
/area/engineering/atmos)
"asG" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold4w/supply/visible,
/obj/effect/turf_decal/tile/yellow{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel/dark/corner{
- dir = 1
+ dir = 4
},
/area/engineering/atmos)
"asH" = (
@@ -10948,10 +10962,10 @@
/obj/item/clothing/suit/hazardvest,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
-/obj/effect/turf_decal/tile/yellow{
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"atJ" = (
/turf/open/floor/wood,
@@ -11478,10 +11492,10 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/yellow{
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"auC" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -12019,10 +12033,10 @@
/obj/structure/closet/secure_closet/atmospherics,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/yellow{
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"avH" = (
/obj/structure/table/wood,
@@ -12576,10 +12590,10 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/vending/wardrobe/atmos_wardrobe,
-/obj/effect/turf_decal/tile/yellow{
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"awL" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
@@ -12837,10 +12851,9 @@
icon_state = "1-2"
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/yellow{
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"axq" = (
/obj/machinery/light{
@@ -12855,9 +12868,11 @@
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"axr" = (
/obj/structure/cable/white{
@@ -12867,9 +12882,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"axs" = (
/obj/structure/reagent_dispensers/fueltank,
@@ -12881,9 +12898,12 @@
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
/area/engineering/atmos)
"axt" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -13849,10 +13869,10 @@
/obj/machinery/meter,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/yellow{
- dir = 4
+ dir = 1
},
/turf/open/floor/plasteel/dark/corner{
- dir = 1
+ dir = 4
},
/area/engineering/atmos)
"azn" = (
@@ -13887,7 +13907,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/supply/visible{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plasteel,
@@ -16339,6 +16359,13 @@
/area/hallway/secondary/exit)
"aEg" = (
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse{
+ dir = 4;
+ name = "air mixer"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engineering/atmos)
"aEh" = (
@@ -17486,7 +17513,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side,
/area/engineering/main)
"aGi" = (
/obj/structure/sign/warning/securearea,
@@ -17518,7 +17545,7 @@
name = "Power Monitoring";
req_access_txt = "32"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side,
/area/engineering/main)
"aGl" = (
/obj/machinery/door/firedoor,
@@ -17562,7 +17589,7 @@
name = "Engineering Access";
req_access_txt = "10"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side,
/area/engineering/main)
"aGo" = (
/obj/structure/sign/warning/fire,
@@ -18063,15 +18090,6 @@
},
/turf/open/floor/plating,
/area/medical/genetics)
-"aHg" = (
-/obj/machinery/camera{
- c_tag = "Gravity Generator Room";
- dir = 6;
- network = list("ss13","engine")
- },
-/obj/effect/turf_decal/bot_white/left,
-/turf/open/floor/plasteel/dark,
-/area/engineering/gravity_generator)
"aHh" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -18631,19 +18649,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
-"aIb" = (
-/obj/structure/sign/warning/radiation{
- pixel_x = -32
- },
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/plasteel/dark,
-/area/engineering/gravity_generator)
"aIc" = (
/turf/open/floor/circuit/green,
/area/engineering/gravity_generator)
"aId" = (
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
"aIe" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -19217,16 +19228,13 @@
},
/area/medical/genetics)
"aJh" = (
-/obj/machinery/light{
- dir = 8
- },
/obj/effect/turf_decal/bot_white/left,
/turf/open/floor/plasteel/dark,
/area/engineering/gravity_generator)
"aJi" = (
/obj/machinery/gravity_generator/main/station,
-/obj/effect/turf_decal/bot_white,
-/turf/open/floor/plasteel/dark,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
"aJj" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -19897,10 +19905,6 @@
/turf/open/floor/plating/asteroid/airless,
/area/asteroid/nearstation)
"aKp" = (
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -19910,7 +19914,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
"aKr" = (
/obj/machinery/power/solar{
@@ -20007,7 +20011,9 @@
name = "Engineering Access";
req_access_txt = "10"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side{
+ dir = 4
+ },
/area/engineering/gravity_generator)
"aKy" = (
/obj/structure/cable/white{
@@ -20110,7 +20116,9 @@
name = "Engineering Access";
req_access_txt = "10"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side{
+ dir = 8
+ },
/area/engineering/main)
"aKI" = (
/obj/structure/cable/white{
@@ -20604,7 +20612,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
"aLF" = (
/obj/structure/table/reinforced,
@@ -21194,7 +21202,7 @@
name = "Telecommunications";
req_access_txt = "61"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side,
/area/tcommsat/server)
"aMM" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -23458,7 +23466,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/structure/closet/secure_closet/engineering_electrical,
/turf/open/floor/engine,
/area/engineering/main)
"aQU" = (
@@ -24301,9 +24308,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
- },
+/obj/structure/closet/secure_closet/engineering_electrical,
/turf/open/floor/engine,
/area/engineering/main)
"aSQ" = (
@@ -24674,16 +24679,6 @@
/area/science/lab)
"aTI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/science/lab)
"aTJ" = (
@@ -29764,9 +29759,12 @@
network = list("ss13","engine")
},
/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow,
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/checker,
/area/engineering/atmos)
"bdw" = (
/obj/machinery/holopad,
@@ -31944,7 +31942,6 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
@@ -32250,21 +32247,17 @@
icon_state = "1-2"
},
/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"bhS" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
},
-/obj/structure/disposaloutlet{
+/turf/open/floor/plasteel/dark/corner{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/science/xenobiology)
+/area/engineering/atmos)
"bhX" = (
/obj/machinery/pool/filter{
pixel_y = 16
@@ -32981,7 +32974,7 @@
name = "Xenobiology Kill Room";
req_access_txt = "47"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/telecomms,
/area/science/xenobiology)
"bjw" = (
/obj/machinery/atmospherics/pipe/manifold/general/hidden,
@@ -33659,6 +33652,15 @@
dir = 8
},
/area/hallway/secondary/exit)
+"bnS" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/disposaloutlet{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/xenobiology)
"boD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -34575,6 +34577,9 @@
/obj/machinery/light/small{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -34697,8 +34702,11 @@
/turf/open/floor/plasteel,
/area/service/hydroponics)
"cpn" = (
-/turf/closed/wall,
-/area/space/station_ruins)
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/command/heads_quarters/ce)
"csX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/white{
@@ -34737,6 +34745,40 @@
},
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
+"cCv" = (
+/obj/machinery/door/window/brigdoor{
+ dir = 4;
+ name = "Creature Pen";
+ req_access_txt = "47"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "xeno5";
+ name = "Creature Cell #5"
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark/side{
+ dir = 4
+ },
+/area/science/xenobiology)
"cGA" = (
/obj/machinery/pool/controller,
/turf/open/floor/wood,
@@ -34959,6 +35001,16 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"dZL" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/science/xenobiology)
"eaf" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/structure/cable{
@@ -35415,7 +35467,7 @@
/area/asteroid/nearstation)
"fTp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall/rust,
+/turf/open/floor/plasteel/dark,
/area/engineering/gravity_generator)
"fWh" = (
/turf/open/floor/wood{
@@ -35518,6 +35570,20 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"gkP" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/science/xenobiology)
"glC" = (
/turf/closed/wall/r_wall,
/area/maintenance/starboard/aft)
@@ -35525,7 +35591,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/turf/closed/wall/r_wall,
+/obj/structure/sign/warning/radiation{
+ pixel_x = -32
+ },
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -25
+ },
+/turf/open/floor/plasteel/dark,
/area/engineering/gravity_generator)
"guM" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
@@ -35550,6 +35623,12 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
+"gBW" = (
+/obj/structure/sign/poster/random{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/xenobiology)
"gGq" = (
/obj/machinery/mass_driver{
dir = 4;
@@ -35805,8 +35884,15 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"hIF" = (
-/turf/closed/wall,
-/area/space)
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = -32
+ },
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"hNO" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 5
@@ -36087,10 +36173,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"iVy" = (
@@ -36332,10 +36414,6 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"jCi" = (
@@ -37202,6 +37280,7 @@
/obj/machinery/light/small{
dir = 1
},
+/obj/effect/turf_decal/caution,
/turf/open/floor/plating,
/area/engineering/atmos)
"nIf" = (
@@ -37607,11 +37686,12 @@
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
"psq" = (
-/obj/structure/sign/poster/random{
- pixel_y = 32
+/obj/machinery/camera{
+ c_tag = "Gravity Generator Room";
+ network = list("ss13","engine")
},
/turf/open/floor/plasteel/dark,
-/area/science/xenobiology)
+/area/engineering/gravity_generator)
"puc" = (
/obj/structure/bed,
/turf/open/floor/wood,
@@ -37802,12 +37882,8 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"qdY" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/obj/structure/closet/emcloset/anchored,
-/turf/open/floor/plating,
-/area/engineering/atmos)
+/turf/open/floor/plasteel,
+/area/engineering/gravity_generator)
"qeO" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -37857,13 +37933,8 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"qpG" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
- },
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/engineering/atmos)
+/turf/open/floor/plasteel/dark,
+/area/engineering/gravity_generator)
"qsc" = (
/obj/machinery/air_sensor/atmos/air_tank,
/turf/open/floor/engine/air,
@@ -38052,33 +38123,17 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"rCw" = (
-/obj/machinery/door/window/brigdoor{
- dir = 4;
- name = "Creature Pen";
- req_access_txt = "47"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xeno4";
- name = "Creature Cell #4"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"rEx" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
@@ -40819,13 +40874,12 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"uBJ" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/light{
+ dir = 8
},
-/obj/item/broken_bottle,
-/obj/item/pickaxe,
-/turf/open/floor/plating,
-/area/engineering/atmos)
+/turf/open/floor/plasteel,
+/area/engineering/gravity_generator)
"uBW" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -41026,8 +41080,12 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"vsf" = (
-/obj/effect/decal/cleanable/blood/gibs/xeno,
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/l3closet/scientist,
+/obj/effect/turf_decal/stripes/line,
+/obj/item/extinguisher/mini,
+/turf/open/floor/plasteel/dark/side{
+ dir = 1
+ },
/area/science/xenobiology)
"vsL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -41157,6 +41215,20 @@
"vMb" = (
/turf/open/floor/engine/n2o,
/area/engineering/atmos)
+"vMG" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/science/xenobiology)
"vPH" = (
/obj/effect/turf_decal/box,
/obj/machinery/power/tracker,
@@ -41276,8 +41348,8 @@
/area/command/bridge)
"wiJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
-/area/engineering/atmos)
+/turf/closed/wall/r_wall,
+/area/engineering/gravity_generator)
"wkn" = (
/obj/machinery/hydroponics/soil,
/obj/item/shovel/spade,
@@ -41287,7 +41359,7 @@
/area/maintenance/port/aft)
"wkG" = (
/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless,
+/turf/open/space/basic,
/area/space/nearstation)
"wkO" = (
/obj/structure/cable/white{
@@ -41353,7 +41425,10 @@
/area/service/bar/atrium)
"wDb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall/r_wall,
+/obj/structure/sign/warning/radiation{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/dark,
/area/engineering/gravity_generator)
"wOe" = (
/obj/machinery/door/firedoor/heavy,
@@ -41632,13 +41707,36 @@
/turf/closed/wall/r_wall,
/area/engineering/atmos)
"xKp" = (
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
+/obj/machinery/door/window/brigdoor{
+ dir = 4;
+ name = "Creature Pen";
+ req_access_txt = "47"
},
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/engineering/main)
+/obj/machinery/door/poddoor/preopen{
+ id = "xeno4";
+ name = "Creature Cell #4"
+ },
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark/side{
+ dir = 4
+ },
+/area/science/xenobiology)
"xMv" = (
/obj/structure/lattice,
/obj/structure/fluff/broken_flooring{
@@ -41651,9 +41749,6 @@
/turf/closed/wall,
/area/command/gateway)
"xPz" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = -32
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 9
},
@@ -41750,36 +41845,17 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"yeE" = (
-/obj/machinery/door/window/brigdoor{
- dir = 4;
- name = "Creature Pen";
- req_access_txt = "47"
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xeno5";
- name = "Creature Cell #5"
- },
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/effect/turf_decal/tile/purple,
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"yeO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -41811,6 +41887,7 @@
/turf/open/floor/plasteel,
/area/service/bar/atrium)
"yhg" = (
+/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -66119,7 +66196,7 @@ aaa
aaa
aaa
aaa
-cpn
+jFP
jFP
jFP
jFP
@@ -66376,7 +66453,7 @@ aaa
aaa
aaa
aaa
-hIF
+aaa
aaa
jFP
jFP
@@ -66633,7 +66710,7 @@ aaa
aaa
aaa
aaa
-hIF
+aaa
aaa
jFP
jFP
@@ -66890,7 +66967,7 @@ aaa
aaa
aaa
aaa
-hIF
+aaa
aaa
aaa
aaa
@@ -68429,7 +68506,7 @@ dMl
uhz
gNH
kas
-aad
+kas
aad
aad
aad
@@ -68685,13 +68762,13 @@ gSv
xtL
uhz
nHD
+hIF
kas
aad
aad
aad
aad
aad
-aad
bxd
aad
aac
@@ -68942,13 +69019,13 @@ kiw
nUk
ezP
xPz
-kas
-aad
-aad
-aad
-aad
-aad
-aad
+aGe
+aGe
+aGe
+aGe
+aGe
+aGe
+aGe
bxd
aad
aad
@@ -69202,8 +69279,8 @@ twh
wiJ
wDb
fTp
-wDb
-wDb
+uBJ
+fTp
gre
sIu
bwY
@@ -69456,10 +69533,10 @@ dgV
fYx
iIj
ajX
-qpG
-sIu
+aGe
+psq
aHe
-aIb
+aId
aJh
aKp
aLD
@@ -69713,8 +69790,8 @@ orI
xyo
hNO
bOy
-uBJ
aGe
+qdY
aId
aIc
aJi
@@ -69970,9 +70047,9 @@ anx
anx
uok
akM
-qdY
aGe
-aHg
+qpG
+aJh
aId
aHe
pbT
@@ -70226,8 +70303,8 @@ xIm
rVj
aAg
akN
+cpn
alI
-anu
aGe
aGe
sIu
@@ -71756,7 +71833,7 @@ vMb
srR
tac
arr
-bKQ
+anu
fFw
auq
qEl
@@ -71783,7 +71860,7 @@ aPI
bwV
aRF
aSP
-xKp
+aEt
yhg
aad
bvo
@@ -72013,7 +72090,7 @@ gap
fnp
aqA
viy
-bKQ
+anu
qIp
mae
eOs
@@ -73041,7 +73118,7 @@ aor
apv
aqA
arw
-oiL
+bhS
jxc
mae
hqX
@@ -85686,7 +85763,7 @@ bgZ
bhM
ibv
bgm
-bgZ
+bhg
bhM
sKZ
aad
@@ -86962,13 +87039,13 @@ baa
aZl
dfP
bfP
-bgo
+vsf
rCw
-bhN
+vMG
ibv
-bgo
+dZL
yeE
-bhN
+gkP
nTi
biZ
bjs
@@ -87219,13 +87296,13 @@ bem
beO
sOV
bfP
-bgm
-bgm
-bhS
+bgo
+xKp
+bhN
ibv
-bgm
-bgm
-bhS
+bgo
+cCv
+bhN
ibv
bja
bjt
@@ -87476,13 +87553,13 @@ ben
beP
bfn
bfP
-vsf
-bhg
bgm
+bgm
+bnS
ibv
-psq
-bgZ
bgm
+bgm
+bnS
xFw
bjb
bju
@@ -87737,8 +87814,8 @@ bgm
bhg
bgm
ibv
-bgm
-bhg
+gBW
+bgZ
bgm
bfP
bjc
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index cf98755a36..a5b5cf6dc0 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -182,7 +182,7 @@
////organ defines
#define STANDARD_ORGAN_THRESHOLD 100
-#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS)))
+#define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS))) / 3 //Base organ healing can be amped by a factor of up to x5 via satiety. This assumes it to be somewhat in the upper center of positive satiety as base.
#define STANDARD_ORGAN_DECAY (1/(15 MINUTES / (2 SECONDS))) //designed to fail organs when left to decay for ~15 minutes. 2 SECOND is SSmobs tickrate.
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index f6e2002e65..2b0f51f230 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -63,6 +63,9 @@
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
+#define SYNTHTISSUE_BORROW_CAP 250 //The cap for synthtissue's borrowed health value when used on someone dead or already having borrowed health.
+#define SYNTHTISSUE_DAMAGE_FLIP_CYCLES 45 //After how many cycles the damage will be pure toxdamage as opposed to clonedamage like initially. Gradually changes during its cycles.
+
//reagent bitflags, used for altering how they works
#define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body
#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing
diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm
index 88e70b884e..bbe6ddf2b7 100644
--- a/code/__DEFINES/vote.dm
+++ b/code/__DEFINES/vote.dm
@@ -5,6 +5,9 @@
#define HIGHEST_MEDIAN_VOTING "HIGHEST_MEDIAN"
#define INSTANT_RUNOFF_VOTING "IRV"
+#define VOTE_TRANSFER "Initiate Crew Transfer"
+#define VOTE_CONTINUE "Continue Playing"
+
#define SHOW_RESULTS (1<<0)
#define SHOW_VOTES (1<<1)
#define SHOW_WINNER (1<<2)
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 4bc9ccaacd..25b5334a2b 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -109,6 +109,10 @@
if (CONFIG_GET(flag/log_attack))
WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]")
+/proc/log_victim(text)
+ if (CONFIG_GET(flag/log_victim))
+ WRITE_LOG(GLOB.world_victim_log, "VICTIM: [text]")
+
/proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE)
if (CONFIG_GET(flag/log_manifest))
WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]")
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 843eab6fb0..f445843364 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -11,6 +11,8 @@ GLOBAL_VAR(world_qdel_log)
GLOBAL_PROTECT(world_qdel_log)
GLOBAL_VAR(world_attack_log)
GLOBAL_PROTECT(world_attack_log)
+GLOBAL_VAR(world_victim_log)
+GLOBAL_PROTECT(world_victim_log)
// GLOBAL_VAR(world_econ_log)
// GLOBAL_PROTECT(world_econ_log)
GLOBAL_VAR(world_href_log)
diff --git a/code/_rendering/parallax/types/space.dm b/code/_rendering/parallax/types/space.dm
index 38ad62aede..1a6cf191cb 100644
--- a/code/_rendering/parallax/types/space.dm
+++ b/code/_rendering/parallax/types/space.dm
@@ -17,7 +17,7 @@
P.pixel_x = planet_offset_x
P.pixel_y = planet_offset_y
. += P
- if(random_layer)
+ if(ispath(random_layer, /atom/movable/screen/parallax_layer))
. += new random_layer
if(ispath(random_layer, /atom/movable/screen/parallax_layer/space/random/space_gas))
var/atom/movable/screen/parallax_layer/space/random/space_gas/SG = locate(random_layer) in objects
diff --git a/code/controllers/configuration/entries/logging.dm b/code/controllers/configuration/entries/logging.dm
index 54bd5cb713..e9fe04f2d4 100644
--- a/code/controllers/configuration/entries/logging.dm
+++ b/code/controllers/configuration/entries/logging.dm
@@ -1,88 +1,119 @@
-/datum/config_entry/flag/log_ooc // log OOC channel
+/// log OOC channel
+/datum/config_entry/flag/log_ooc
config_entry_value = TRUE
-/datum/config_entry/flag/log_access // log login/logout
+/// log login/logout
+/datum/config_entry/flag/log_access
config_entry_value = TRUE
/// Config entry which special logging of failed logins under suspicious circumstances.
/datum/config_entry/flag/log_suspicious_login
config_entry_value = TRUE
-/datum/config_entry/flag/log_say // log client say
+/// log client say
+/datum/config_entry/flag/log_say
config_entry_value = TRUE
-/datum/config_entry/flag/log_admin // log admin actions
+/// log admin actions
+/datum/config_entry/flag/log_admin
protection = CONFIG_ENTRY_LOCKED
config_entry_value = TRUE
-/datum/config_entry/flag/log_prayer // log prayers
+/// log prayers
+/datum/config_entry/flag/log_prayer
config_entry_value = TRUE
-/datum/config_entry/flag/log_law // log lawchanges
+/// log lawchanges
+/datum/config_entry/flag/log_law
config_entry_value = TRUE
-/datum/config_entry/flag/log_game // log game events
+/// log game events
+/datum/config_entry/flag/log_game
config_entry_value = TRUE
-/datum/config_entry/flag/log_virus // log virology data
+/// log virology data
+/datum/config_entry/flag/log_virus
config_entry_value = TRUE
-/datum/config_entry/flag/log_vote // log voting
+/// log voting
+/datum/config_entry/flag/log_vote
config_entry_value = TRUE
-/datum/config_entry/flag/log_craft // log crafting
+/// log crafting
+/datum/config_entry/flag/log_craft
config_entry_value = TRUE
-/datum/config_entry/flag/log_whisper // log client whisper
+/// log client whisper
+/datum/config_entry/flag/log_whisper
config_entry_value = TRUE
-/datum/config_entry/flag/log_attack // log attack messages
+/// log attack messages
+/datum/config_entry/flag/log_attack
config_entry_value = TRUE
-/datum/config_entry/flag/log_emote // log emotes
+/// log attack messages
+/datum/config_entry/flag/log_victim
config_entry_value = TRUE
-/datum/config_entry/flag/log_adminchat // log admin chat messages
+/// log emotes
+/datum/config_entry/flag/log_emote
+ config_entry_value = TRUE
+
+/// log admin chat messages
+/datum/config_entry/flag/log_adminchat
protection = CONFIG_ENTRY_LOCKED
-/datum/config_entry/flag/log_shuttle // log shuttle related actions, ie shuttle computers, shuttle manipulator, emergency console
+/// log shuttle related actions, ie shuttle computers, shuttle manipulator, emergency console
+/datum/config_entry/flag/log_shuttle
config_entry_value = TRUE
-/datum/config_entry/flag/log_pda // log pda messages
+/// log pda messages
+/datum/config_entry/flag/log_pda
config_entry_value = TRUE
-/datum/config_entry/flag/log_telecomms // log telecomms messages
+/// log telecomms messages
+/datum/config_entry/flag/log_telecomms
config_entry_value = TRUE
-/datum/config_entry/flag/log_twitter // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
+/// log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
+/datum/config_entry/flag/log_twitter
config_entry_value = TRUE
-/datum/config_entry/flag/log_world_topic // log all world.Topic() calls
+/// log all world.Topic() calls
+/datum/config_entry/flag/log_world_topic
config_entry_value = TRUE
-/datum/config_entry/flag/log_manifest // log crew manifest to seperate file
+/// log crew manifest to seperate file
+/datum/config_entry/flag/log_manifest
config_entry_value = TRUE
-/datum/config_entry/flag/log_job_debug // log roundstart divide occupations debug information to a file
+/// log roundstart divide occupations debug information to a file
+/datum/config_entry/flag/log_job_debug
config_entry_value = TRUE
+/// log photos taken by players with a camera
/datum/config_entry/flag/log_pictures
+/// This is... shitcode, literally same as above, if one of them is inactive, won't log at all, PLEASE FUCKING REMOVE THIS.
/datum/config_entry/flag/picture_logging_camera
/// forces log_href for tgui
/datum/config_entry/flag/emergency_tgui_logging
config_entry_value = FALSE
-/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error
+/// The "cooldown" time for each occurrence of a unique error
+/datum/config_entry/number/error_cooldown
config_entry_value = 600
min_val = 0
-/datum/config_entry/number/error_limit // How many occurrences before the next will silence them
+/// How many occurrences before the next will silence them
+/datum/config_entry/number/error_limit
config_entry_value = 50
-/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for
+/// How long a unique error will be silenced for
+/datum/config_entry/number/error_silence_time
config_entry_value = 6000
-/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error
+/// How long to wait between messaging admins about occurrences of a unique error
+/datum/config_entry/number/error_msg_delay
config_entry_value = 50
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 7329dd653f..3bab2bfdf3 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -396,12 +396,15 @@ SUBSYSTEM_DEF(air)
*/
/datum/controller/subsystem/air/proc/run_delay_heuristics()
- if(!equalize_enabled)
- cost_equalize = 0
- if(should_do_equalization)
- eq_cooldown--
- if(eq_cooldown <= 0)
- equalize_enabled = TRUE
+ if(should_do_equalization)
+ if(!equalize_enabled)
+ cost_equalize = 0
+ if(should_do_equalization)
+ eq_cooldown--
+ if(eq_cooldown <= 0)
+ equalize_enabled = TRUE
+ else
+ equalize_enabled = FALSE
var/total_thread_time = cost_turfs + cost_equalize + cost_groups + cost_post_process
if(total_thread_time)
var/wait_ms = wait * 100
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 868351a833..772d7f7b8d 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -32,6 +32,8 @@ SUBSYSTEM_DEF(vote)
var/list/stored_modetier_results = list() // The aggregated tier list of the modes available in secret.
+ var/transfer_votes_done = 0
+
/datum/controller/subsystem/vote/fire() //called by master_controller
if(mode)
if(end_time < world.time)
@@ -248,8 +250,18 @@ SUBSYSTEM_DEF(vote)
if(vote_system == SCORE_VOTING)
calculate_scores(vote_title_text)
if(vote_system == HIGHEST_MEDIAN_VOTING)
- calculate_highest_median(vote_title_text) // nothing uses this at the moment
- var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result()
+ calculate_highest_median(vote_title_text)
+ var/list/winners = list()
+ if(mode == "transfer")
+ var/amount_required = 3 + transfer_votes_done
+ transfer_votes_done += 1
+ text += "\nExtending requires at least [amount_required] votes to win."
+ if(choices[VOTE_CONTINUE] < amount_required || choices[VOTE_TRANSFER] >= choices[VOTE_CONTINUE])
+ winners = list(VOTE_TRANSFER)
+ else
+ winners = list(VOTE_CONTINUE)
+ else
+ winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result()
var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic"
if(winners.len > 0)
if(was_roundtype_vote)
@@ -305,7 +317,7 @@ SUBSYSTEM_DEF(vote)
if(vote_system == SCHULZE_VOTING)
admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!"
else if(vote_system == HIGHEST_MEDIAN_VOTING)
- admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!"
+ admintext += "\nIt should be noted that this is not a raw tally of votes but rather the median score plus a tiebreaker!"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
admintext += "\n[choices[i]]: [votes]"
@@ -339,7 +351,7 @@ SUBSYSTEM_DEF(vote)
if(SSmapping.changemap(config.maplist[.]))
to_chat(world, "The map vote has chosen [VM.map_name] for next round!")
if("transfer") // austation begin -- Crew autotransfer vote
- if(. == "Initiate Crew Transfer")
+ if(. == VOTE_TRANSFER)
SSshuttle.autoEnd()
var/obj/machinery/computer/communications/C = locate() in GLOB.machines
if(C)
@@ -446,7 +458,7 @@ SUBSYSTEM_DEF(vote)
continue
choices |= M
if("transfer") // austation begin -- Crew autotranfer vote
- choices.Add("Initiate Crew Transfer","Continue Playing") // austation end
+ choices.Add(VOTE_TRANSFER,VOTE_CONTINUE) // austation end
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("dynamic", "extended")
if("custom")
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index ae05134b56..eda3470a0b 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -578,8 +578,12 @@
/datum/status_effect/regenerative_core/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core")
-
- if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, but only get 1/5th of the healing. They can use this to get past the damage threshhold however, and then regularely heal from there.
+ var/turf/T = get_turf(owner)
+ if(T && is_mining_level(T.z))
+ if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, though they ""only"" heal 20 brute + burn damage each instead of 25
+ heal_amount *= 0.8
+ else
+ duration = 10 SECONDS
heal_amount *= 0.2
owner.adjustBruteLoss(-heal_amount, only_organic = FALSE)
if(!AmBloodsucker(owner)) //use your coffin you lazy bastard
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index dbec6c6ee2..b5a7a38915 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -1005,11 +1005,15 @@
/datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args)
if(!owner.can_hear())
return
- if(hearing_args[HEARING_SPEAKER] == owner)
+ var/mob/hearing_speaker = hearing_args[HEARING_SPEAKER]
+ if(hearing_speaker == owner)
return
var/mob/living/carbon/C = owner
var/hypnomsg = uncostumize_say(hearing_args[HEARING_RAW_MESSAGE], hearing_args[HEARING_MESSAGE_MODE])
C.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY) //clear previous hypnosis
+ // The brain trauma itself does its own set of logging, but this is the only place the source of the hypnosis phrase can be found.
+ hearing_speaker.log_message("has hypnotised [key_name(C)] with the phrase '[hypnomsg]'", LOG_ATTACK)
+ C.log_message("has been hypnotised by the phrase '[hypnomsg]' spoken by [key_name(hearing_speaker)]", LOG_VICTIM, log_globally = FALSE)
addtimer(CALLBACK(C, /mob/living/carbon.proc/gain_trauma, /datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY, hypnomsg), 10)
addtimer(CALLBACK(C, /mob/living.proc/Stun, 60, TRUE, TRUE), 15) //Take some time to think about it
qdel(src)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 62df84857f..e56741b6cf 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1243,7 +1243,7 @@
if(user != target)
var/reverse_message = "has been [what_done] by [ssource][postfix]"
- target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE)
+ target.log_message(reverse_message, LOG_VICTIM, color="orange", log_globally=FALSE)
/**
* log_wound() is for when someone is *attacked* and suffers a wound. Note that this only captures wounds from damage, so smites/forced wounds aren't logged, as well as demotions like cuts scabbing over
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 476758efee..36f68cfdf3 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -423,7 +423,7 @@
if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost))
H.notify_ghost_cloning("Your heart is being defibrillated!")
H.grab_ghost() // Shove them back in their body.
- else if(H.can_defib())
+ else if(H.can_revive())
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
do_help(H, user)
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 7b05cf302e..e32acd105e 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -189,5 +189,7 @@
return FALSE
brainwash(C, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
+ user.log_message("has brainwashed [key_name(C)] with the objective '[objective]' using \the [src]", LOG_ATTACK)
+ C.log_message("has been brainwashed with the objective '[objective]' by [key_name(user)] using \the [src]", LOG_VICTIM, log_globally = FALSE)
log_game("[key_name(user)] brainwashed [key_name(C)] with objective '[objective]'.")
return TRUE
diff --git a/code/game/world.dm b/code/game/world.dm
index af11b7c93e..75f145b048 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -115,6 +115,7 @@ GLOBAL_LIST(topic_status_cache)
GLOB.world_virus_log = "[GLOB.log_directory]/virus.log"
GLOB.world_asset_log = "[GLOB.log_directory]/asset.log"
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
+ GLOB.world_victim_log = "[GLOB.log_directory]/victim.log"
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
GLOB.world_manifest_log = "[GLOB.log_directory]/manifest.log"
diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm
index bd7a9a43cb..65c58611cb 100644
--- a/code/modules/antagonists/brainwashing/brainwashing.dm
+++ b/code/modules/antagonists/brainwashing/brainwashing.dm
@@ -73,7 +73,7 @@
brainwash(C, objectives)
var/obj_list = english_list(objectives)
message_admins("[key_name_admin(admin)] has brainwashed [key_name_admin(C)] with the following objectives: [obj_list].")
- C.log_message("has been force-brainwashed with the objective '[obj_list]' by admin [key_name(admin)]", LOG_ATTACK, log_globally = FALSE)
+ C.log_message("has been force-brainwashed with the objective '[obj_list]' by admin [key_name(admin)]", LOG_VICTIM)
log_admin("[key_name(admin)] has brainwashed [key_name(C)] with the following objectives: [obj_list].")
/datum/objective/brainwashing
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 969e63563d..cc17928a98 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -845,16 +845,16 @@
update_inv_handcuffed()
update_hud_handcuffed()
-/mob/living/carbon/proc/can_defib()
+/mob/living/carbon/proc/can_revive(ignore_timelimit = FALSE, maximum_brute_dam = MAX_REVIVE_BRUTE_DAMAGE, maximum_fire_dam = MAX_REVIVE_FIRE_DAMAGE, ignore_heart = FALSE)
var/tlimit = DEFIB_TIME_LIMIT * 10
var/obj/item/organ/heart = getorgan(/obj/item/organ/heart)
if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker(src))
return
- if((world.time - timeofdeath) > tlimit)
+ if(!ignore_timelimit && (world.time - timeofdeath) > tlimit)
return
- if((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
+ if((getBruteLoss() >= maximum_brute_dam) || (getFireLoss() >= maximum_fire_dam))
return
- if(!heart || (heart.organ_flags & ORGAN_FAILING))
+ if(!ignore_heart && (!heart || (heart.organ_flags & ORGAN_FAILING)))
return
var/obj/item/organ/brain/BR = getorgan(/obj/item/organ/brain)
if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || suiciding)
diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm
index 1f8fd6f7a6..84ddab9e37 100644
--- a/code/modules/modular_computers/file_system/programs/budgetordering.dm
+++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm
@@ -79,7 +79,6 @@
if(id_card?.registered_account)
if((ACCESS_HEADS in id_card.access) || (ACCESS_QM in id_card.access))
requestonly = FALSE
- buyer = SSeconomy.get_dep_account(id_card.registered_account.account_job.paycheck_department)
can_approve_requests = TRUE
else
requestonly = TRUE
@@ -236,8 +235,7 @@
return
if(!self_paid && ishuman(usr) && !account)
- var/obj/item/card/id/id_card = card_slot?.GetID()
- account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department)
+ account = SSeconomy.get_dep_account(ACCOUNT_CAR)
var/turf/T = get_turf(src)
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
@@ -263,9 +261,7 @@
var/id = text2num(params["id"])
for(var/datum/supply_order/SO in SSshuttle.requestlist)
if(SO.id == id)
- var/obj/item/card/id/id_card = card_slot?.GetID()
- if(id_card && id_card?.registered_account)
- SO.paying_account = SSeconomy.get_dep_account(id_card?.registered_account?.account_job.paycheck_department)
+ SO.paying_account = SSeconomy.get_dep_account(ACCOUNT_CAR)
SSshuttle.requestlist -= SO
SSshuttle.shoppinglist += SO
. = TRUE
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 201200a95d..22ce4e7ce5 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -469,15 +469,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//((((some value between 0.5 and 1 * temp - ((273.15 + 40) * some values between 1 and 10)) * some number between 0.25 and knock your socks off / 150) * 0.25
//Heat and mols account for each other, a lot of hot mols are more damaging then a few
//Mols start to have a positive effect on damage after 350
+ var/spaced = 0
+ for(var/turf/open/space/_space_turf in range(2,src))
+ spaced++
damage = max(damage + (max(clamp(removed.total_moles() / 200, 0.5, 1) * removed.return_temperature() - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
//Power only starts affecting damage when it is above 5000
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
//Molar count only starts affecting damage when it is above 1800
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
+ damage = max(damage + spaced * 0.1 * DAMAGE_INCREASE_MULTIPLIER, 0)
+
//There might be a way to integrate healing and hurting via heat
//healing damage
- if(combined_gas < MOLE_PENALTY_THRESHOLD)
+ if(combined_gas < MOLE_PENALTY_THRESHOLD && !spaced)
//Only has a net positive effect when the temp is below 313.15, heals up to 2 damage. Psycologists increase this temp min by up to 45
damage = max(damage + (min(removed.return_temperature() - (T0C + HEAT_PENALTY_THRESHOLD), 0) / 150), 0)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index cdad332def..d233866f80 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -234,6 +234,7 @@
var/transfer_amount = T.volume * part
if(preserve_data)
trans_data = copy_data(T)
+ post_copy_data(T)
transferred += "[T] - [transfer_amount]"
R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, T.purity, pH, no_react = TRUE, ignore_pH = TRUE) //we only handle reaction after every reagent has been transfered.
@@ -274,7 +275,8 @@
var/datum/reagent/T = reagent
var/copy_amount = T.volume * part
if(preserve_data)
- trans_data = T.data
+ trans_data = copy_data(T)
+ post_copy_data(T)
R.add_reagent(T.type, copy_amount * multiplier, trans_data)
src.update_total()
@@ -301,7 +303,8 @@
var/datum/reagent/current_reagent = CR
if(current_reagent.type == reagent)
if(preserve_data)
- trans_data = current_reagent.data
+ trans_data = copy_data(current_reagent)
+ post_copy_data(current_reagent)
R.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE)
remove_reagent(current_reagent.type, amount, 1)
if(log && amount > 0)
@@ -1152,6 +1155,11 @@
return trans_data
+///
+// Should be ran after using copy_data. Calls the reagent's post_copy_data, which usually does nothing.
+/datum/reagents/proc/post_copy_data(datum/reagent/current_reagent)
+ return current_reagent.post_copy_data()
+
/datum/reagents/proc/get_reagent(type)
var/list/cached_reagents = reagent_list
. = locate(type) in cached_reagents
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 9845903e21..8d009ffb2e 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -199,6 +199,10 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
log_reagent("MOB ADD: on_merge() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
+//Ran by a reagent holder on a specific reagent after copying its data.
+/datum/reagent/proc/post_copy_data()
+ return
+
/datum/reagent/proc/on_update(atom/A)
return
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index df49474992..4d1ded3913 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -997,11 +997,11 @@
if(M.stat == DEAD)
if(M.suiciding || M.hellbound) //they are never coming back
M.visible_message("[M]'s body does not react...")
- return
+ return ..()
if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived
M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
M.do_jitter_animation(10)
- return
+ return ..()
else
M.visible_message("[M]'s body starts convulsing!")
M.notify_ghost_cloning(source = M)
@@ -1013,27 +1013,31 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits)))
- C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL*C.blood_ratio) //so you don't instantly re-die from a lack of blood
- for(var/organ in C.internal_organs)
- var/obj/item/organ/O = organ
- if(O.damage > O.maxHealth/2)
- O.setOrganDamage(O.maxHealth/2) //so you don't instantly die from organ damage when being revived
+ C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_BAD*C.blood_ratio) //so you don't instantly re-die from a lack of blood. You'll still need help if you had none though.
+ var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
+ if(H && H.organ_flags & ORGAN_FAILING)
+ H.applyOrganDamage(-15)
+ for(var/obj/item/organ/O as anything in C.internal_organs)
+ if(O.organ_flags & ORGAN_FAILING)
+ O.applyOrganDamage(-5)
M.adjustOxyLoss(-20, 0)
M.adjustToxLoss(-20, 0)
M.updatehealth()
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.can_revive(ignore_timelimit = TRUE, maximum_brute_dam = 100, maximum_fire_dam = 100, ignore_heart = TRUE))
+ return
var/tplus = world.time - M.timeofdeath
if(M.revive())
M.grab_ghost()
M.emote("gasp")
log_combat(M, M, "revived", src)
var/list/policies = CONFIG_GET(keyed_list/policy)
- var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
- var/late = timelimit && (tplus > timelimit)
- var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
+ var/policy = policies[POLICYCONFIG_ON_DEFIB_LATE] //Always causes memory loss due to the nature of strange reagent.
if(policy)
to_chat(M, policy)
- M.log_message("revived using strange reagent, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME)
+ M.log_message("revived using strange reagent, [tplus] deciseconds from time of death, considered late revival due to usage of strange reagent.", LOG_GAME)
..()
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 55f44a505e..a6b6640ead 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -491,7 +491,7 @@
return
var/fp_verb = mode == HYPO_SPRAY ? "spray" : "inject"
- var/method = mode == HYPO_SPRAY ? TOUCH : INJECT
+ var/method = mode == HYPO_SPRAY ? PATCH : INJECT //Medsprays use patch when spraying, feels like an inconsistancy here.
if(L != user)
L.visible_message("[user] is trying to [fp_verb] [L] with [src]!", \
diff --git a/code/modules/research/anomaly/explosive_compressor.dm b/code/modules/research/anomaly/explosive_compressor.dm
index 23983e31dc..54236e3763 100644
--- a/code/modules/research/anomaly/explosive_compressor.dm
+++ b/code/modules/research/anomaly/explosive_compressor.dm
@@ -1,4 +1,4 @@
-#define MAX_RADIUS_REQUIRED 8000 //tritbomb
+#define MAX_RADIUS_REQUIRED 175 //tritbomb
#define MIN_RADIUS_REQUIRED 20 //maxcap
/**
* # Explosive compressor machines
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index e3cc63c3a0..4603b04b1d 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -234,7 +234,7 @@
var/mob/living/carbon/C = host_mob
if(C.get_ghost())
return FALSE
- return C.can_defib()
+ return C.can_revive()
/datum/nanite_program/defib/proc/zap()
var/mob/living/carbon/C = host_mob
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 28103f7f97..2a09fd2b93 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -49,6 +49,8 @@
to_chat(target, "A new compulsion fills your mind... you feel forced to obey it!")
brainwash(target, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.")
+ user.log_message("has brainwashed [key_name(target)] with the objective '[objective]' using brainwashing surgery.", LOG_ATTACK)
+ target.log_message("has been brainwashed with the objective '[objective]' by [key_name(user)] using brainwashing surgery.", LOG_VICTIM, log_globally=FALSE)
log_game("[key_name(user)] surgically brainwashed [key_name(target)] with the objective '[objective]'.")
return TRUE
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index a3c6ea06c8..05f3f06b06 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -156,12 +156,14 @@
return FALSE
if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing.
applyOrganDamage(maxHealth * decay_factor)
- return
+ return FALSE
+ if(organ_flags & ORGAN_SYNTHETIC)
+ return TRUE
if(!is_cold() && damage)
///Damage decrements by a percent of its maxhealth
var/healing_amount = -(maxHealth * healing_factor)
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's satiety
- healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
+ healing_amount -= owner.satiety > 0 ? 4 * (maxHealth * healing_factor) * (owner.satiety / MAX_SATIETY) : 0
if(healing_amount)
applyOrganDamage(healing_amount) //to FERMI_TWEAK
return TRUE
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index f7b84eab20..3b3aa72749 100644
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -131,6 +131,13 @@
name = "ipc cell"
icon_state = "stomach-ipc"
+/obj/item/organ/stomach/ipc/on_life()
+ . = ..()
+ if(!.)
+ return
+ if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM) && owner.nutrition >= NUTRITION_LEVEL_FED)
+ owner.satiety += 5 //We don't need to cap the value as it's already automatically capped during nutrition level handling. Also effectively only +4 as you lose 1 per life tick. 300 seconds of sufficient charge to reach full satiety.
+
/obj/item/organ/stomach/ipc/emp_act(severity)
. = ..()
if(!owner || . & EMP_PROTECT_SELF)
diff --git a/config/entries/logging.txt b/config/entries/logging.txt
index 31692afccb..6483a371f0 100644
--- a/config/entries/logging.txt
+++ b/config/entries/logging.txt
@@ -34,6 +34,9 @@ LOG_EMOTE
## log attack messages
LOG_ATTACK
+## log victim messages
+LOG_VICTIM
+
## log pda messages
LOG_PDA
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index bb255a4194..6695194008 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -98,8 +98,8 @@
description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties."
pH = 7.6
metabolization_rate = 0.05 //Give them time to graft
- data = list("grown_volume" = 0, "injected_vol" = 0)
- var/borrowed_health
+ data = list("grown_volume" = 0, "injected_vol" = 0, "borrowed_health" = 0)
+ var/borrowed_health = 0
color = "#FFDADA"
value = REAGENT_VALUE_COMMON
@@ -107,31 +107,51 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
var/healing_factor = (((data["grown_volume"] / 100) + 1)*reac_volume)
- if(method in list(PATCH, TOUCH))
- if (M.stat == DEAD)
- M.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attemping to repair the damage as quickly as possible.")
- borrowed_health += healing_factor
- M.adjustBruteLoss(-healing_factor*2)
- M.adjustFireLoss(-healing_factor*2)
- M.adjustToxLoss(-healing_factor)
- M.adjustCloneLoss(-healing_factor)
- M.updatehealth()
+ if(method == PATCH) //Needs to actually be applied via patch / hypo / medspray and not just beakersplashed.
+ if (C.stat == DEAD)
+ C.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attempting to repair the damage as quickly as possible.")
+ var/preheal_brute = C.getBruteLoss()
+ var/preheal_burn = C.getFireLoss()
+ var/preheal_tox = C.getToxLoss()
+ var/preheal_oxy = C.getOxyLoss()
+ C.adjustBruteLoss(-healing_factor*2)
+ C.adjustFireLoss(-healing_factor*2)
+ C.adjustToxLoss(-healing_factor)
+ C.adjustCloneLoss(-healing_factor)
+ borrowed_health += (preheal_brute - C.getBruteLoss()) + (preheal_burn - C.getFireLoss()) + (preheal_tox - C.getToxLoss()) + ((preheal_oxy - C.getOxyLoss()) / 2) //Ironically this means that while slimes get damaged by the toxheal, it will reduce borrowed health and longterm effects. Funky!
+ C.updatehealth()
if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80))
- if(M.revive())
- M.emote("gasp")
+ var/tplus = world.time - M.timeofdeath
+ if(C.can_revive(ignore_timelimit = TRUE, maximum_brute_dam = MAX_REVIVE_BRUTE_DAMAGE / 2, maximum_fire_dam = MAX_REVIVE_FIRE_DAMAGE / 2, ignore_heart = TRUE) && C.revive())
+ C.grab_ghost()
+ C.emote("gasp")
borrowed_health *= 2
if(borrowed_health < 100)
borrowed_health = 100
- log_combat(M, M, "revived", src)
+ log_combat(C, C, "revived", src)
+ var/list/policies = CONFIG_GET(keyed_list/policy)
+ var/policy = policies[POLICYCONFIG_ON_DEFIB_LATE] //Always causes memory loss due to the nature of synthtissue
+ if(policy)
+ to_chat(C, policy)
+ C.log_message("revived using synthtissue, [tplus] deciseconds from time of death, considered late revival due to usage of synthtissue.", LOG_GAME)
else
+ var/preheal_brute = C.getBruteLoss()
+ var/preheal_burn = C.getFireLoss()
M.adjustBruteLoss(-healing_factor)
M.adjustFireLoss(-healing_factor)
- to_chat(M, "You feel your flesh merge with the synthetic tissue! It stings like hell!")
+ var/datum/reagent/synthtissue/active_tissue = M.reagents.has_reagent(/datum/reagent/synthtissue)
+ var/imperfect = FALSE //Merging with synthtissue that has borrowed health
+ if(active_tissue && active_tissue.borrowed_health)
+ borrowed_health += (preheal_brute - C.getBruteLoss()) + (preheal_burn - C.getFireLoss())
+ imperfect = TRUE
+ to_chat(M, "You feel your flesh [imperfect ? "partially and painfully" : ""] merge with the synthetic tissue! It stings like hell[imperfect ? " and is making you feel terribly sick" : ""]!")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ data["borrowed_health"] += borrowed_health //Preserve health offset
+ borrowed_health = 0 //We are applying this to someone else, so this info will be transferred via data.
if(method==INJECT)
data["injected_vol"] = reac_volume
var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
- if(data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
+ if(H && data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
H.applyOrganDamage(-20)
..()
@@ -145,16 +165,19 @@
C.reagents.remove_reagent(type, 15)
to_chat(C, "You feel something reform inside of you!")
- data["injected_vol"] -= metabolization_rate
+ data["injected_vol"] = max(0, data["injected_vol"] - metabolization_rate * C.metabolism_efficiency) //No negatives.
if(borrowed_health)
- C.adjustToxLoss(1)
- C.adjustCloneLoss(1)
- borrowed_health -= 1
+ var/ratio = (current_cycle > SYNTHTISSUE_DAMAGE_FLIP_CYCLES) ? 0 : (1 - (current_cycle / SYNTHTISSUE_DAMAGE_FLIP_CYCLES))
+ var/payback = 2 * C.metabolism_efficiency //How much borrowed health we are paying back. Starts as cloneloss, slowly flips over to toxloss.
+ C.adjustToxLoss((1 - ratio) * payback * REAGENTS_EFFECT_MULTIPLIER, forced = TRUE, toxins_type = TOX_OMNI)
+ C.adjustCloneLoss(ratio * payback * REAGENTS_EFFECT_MULTIPLIER)
+ borrowed_health = max(borrowed_health - payback, 0)
..()
/datum/reagent/synthtissue/on_merge(passed_data)
if(!passed_data)
return ..()
+ borrowed_health += max(0, passed_data["borrowed_health"])
if(passed_data["grown_volume"] > data["grown_volume"])
data["grown_volume"] = passed_data["grown_volume"]
if(iscarbon(holder.my_atom))
@@ -166,11 +189,16 @@
/datum/reagent/synthtissue/on_new(passed_data)
if(!passed_data)
return ..()
+ borrowed_health = min(passed_data["borrowed_health"] + borrowed_health, SYNTHTISSUE_BORROW_CAP)
if(passed_data["grown_volume"] > data["grown_volume"])
data["grown_volume"] = passed_data["grown_volume"]
update_name()
..()
+/datum/reagent/synthtissue/post_copy_data()
+ data["borrowed_health"] = 0 //We passed this along to something that needed it, set it back to 0 so we don't do it twice.
+ return ..()
+
/datum/reagent/synthtissue/proc/update_name() //They are but babes on creation and have to grow unto godhood
switch(data["grown_volume"])
if(-INFINITY to 50)
@@ -193,9 +221,9 @@
C.adjustCloneLoss(borrowed_health*1.25)
C.adjustAllOrganLoss(borrowed_health*0.25)
M.updatehealth()
- if(borrowed_health && C.health < -20)
- M.stat = DEAD
+ if(C.stat != DEAD && borrowed_health && C.health < -20)
M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.")
+ M.death()
//NEEDS ON_MOB_DEAD()
/datum/reagent/fermi/zeolites