diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index c0b68f29d34..94d9b42a2d9 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -25,12 +25,21 @@
/code/modules/admin/verbs/adminpm.dm @Cyberboss
/code/modules/mapping/ @Cyberboss
+# Jared-Fogle
+
+/code/modules/unit_tests/ @Jared-Fogle
+
# Jordie0608
/SQL/ @Jordie0608
/code/controllers/subsystem/dbcore.dm @Jordie0608
/tools/SQLAlertEmail/ @Jordie0608
+# LemonInTheDark
+
+/code/__DEFINES/atmospherics.dm @LemonInTheDark
+/code/modules/atmospherics/ @LemonInTheDark
+
# MrStonedOne
/SQL/database_changelog.txt @MrStonedOne
@@ -69,7 +78,7 @@
# Multiple Owners
/icons/ @Twaticus @ShizCalev
-/code/controllers/subsystem/air.dm @MrStonedOne
+/code/controllers/subsystem/air.dm @LemonInTheDark @MrStonedOne
#SIC SEMPER TYRANNIS
/code/modules/hydroponics/grown/citrus.dm @optimumtact
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 82fd0c6c62a..eebc5fe6395 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -4239,6 +4239,7 @@
pixel_y = -22
},
/obj/effect/turf_decal/bot,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"alQ" = (
@@ -4577,11 +4578,6 @@
/area/maintenance/starboard/fore)
"amD" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -4589,6 +4585,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"amE" = (
@@ -6109,6 +6106,7 @@
"apB" = (
/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/disposal)
"apC" = (
@@ -7242,8 +7240,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"arW" = (
@@ -7735,16 +7732,13 @@
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"asU" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"asV" = (
@@ -9189,15 +9183,11 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"avq" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/crowbar/red,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"avr" = (
@@ -10788,8 +10778,6 @@
/area/quartermaster/warehouse)
"ayo" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -10800,6 +10788,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"ayp" = (
@@ -11103,8 +11092,7 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ayT" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"ayU" = (
@@ -11402,8 +11390,7 @@
/area/quartermaster/warehouse)
"azr" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate/internals,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/quartermaster/warehouse)
"azs" = (
@@ -11770,7 +11757,6 @@
/area/maintenance/port/fore)
"aAm" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/vomit/old,
/obj/structure/toilet{
dir = 8
},
@@ -11778,6 +11764,7 @@
pixel_x = -32
},
/obj/machinery/light/small,
+/obj/effect/decal/cleanable/vomit,
/turf/open/floor/plating,
/area/crew_quarters/toilet/auxiliary)
"aAn" = (
@@ -12532,10 +12519,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aBN" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/quartermaster/warehouse)
"aBO" = (
@@ -13136,10 +13120,9 @@
/area/quartermaster/warehouse)
"aCW" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/structure/cable,
/obj/effect/turf_decal/bot,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aCX" = (
@@ -30753,12 +30736,8 @@
/area/engine/atmos)
"bjo" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/bot,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"bjp" = (
@@ -56271,11 +56250,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port)
-"ccm" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
-/area/maintenance/port)
"ccn" = (
/obj/structure/table/wood,
/obj/machinery/computer/libraryconsole,
@@ -60783,12 +60757,8 @@
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"clv" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
/obj/effect/decal/cleanable/dirt,
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"clw" = (
@@ -63575,6 +63545,7 @@
"cry" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"crA" = (
@@ -65121,15 +65092,9 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"cuH" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/clothing/shoes/jackboots,
-/obj/item/radio,
-/obj/item/storage/secure/briefcase,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"cuI" = (
@@ -67397,10 +67362,7 @@
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"cza" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"czb" = (
@@ -68346,15 +68308,12 @@
/turf/open/floor/plating,
/area/maintenance/port)
"cAY" = (
-/obj/structure/rack,
-/obj/item/clothing/gloves/color/black,
-/obj/item/wrench,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small{
dir = 1
},
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/bot,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port)
"cAZ" = (
@@ -71632,7 +71591,7 @@
pixel_y = 7;
specialfunctions = 4
},
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
"cGU" = (
@@ -73056,17 +73015,13 @@
/area/maintenance/port)
"cJM" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
@@ -73954,8 +73909,6 @@
/area/maintenance/port)
"cLC" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -73969,6 +73922,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port)
"cLD" = (
@@ -74668,11 +74622,7 @@
/turf/open/floor/plasteel/dark/telecomms,
/area/science/xenobiology)
"cNj" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port)
"cNk" = (
@@ -78058,8 +78008,20 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTU" = (
-/obj/machinery/chem_master,
/obj/effect/turf_decal/delivery,
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = -8;
+ pixel_y = 12
+ },
+/obj/structure/microscope{
+ pixel_x = -1;
+ pixel_y = 2
+ },
+/obj/item/biopsy_tool{
+ pixel_x = 14;
+ pixel_y = 4
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cTV" = (
@@ -79270,14 +79232,6 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cVT" = (
-/obj/structure/table/reinforced,
-/obj/item/folder/white,
-/obj/item/stack/sheet/mineral/plasma{
- amount = 5
- },
-/obj/item/reagent_containers/glass/beaker/large,
-/obj/item/reagent_containers/glass/beaker,
-/obj/item/reagent_containers/dropper,
/obj/machinery/light{
dir = 4
},
@@ -79287,10 +79241,10 @@
pixel_x = 32;
receive_ore_updates = 1
},
-/obj/item/reagent_containers/dropper,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/chem_master,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cVU" = (
@@ -80449,15 +80403,13 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cYn" = (
-/obj/structure/closet/crate,
-/obj/item/storage/box/donkpockets,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
@@ -82708,6 +82660,12 @@
/obj/item/storage/box/monkeycubes,
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line,
+/obj/item/reagent_containers/dropper{
+ pixel_y = 12
+ },
+/obj/item/reagent_containers/dropper{
+ pixel_y = 8
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"dcv" = (
@@ -83168,9 +83126,7 @@
/area/medical/medbay/central)
"ddl" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/item/retractor,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"ddm" = (
@@ -83343,16 +83299,12 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"ddS" = (
-/obj/structure/table,
-/obj/item/paper_bin,
-/obj/item/pen,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
},
-/obj/item/storage/bag/bio,
-/obj/item/storage/bag/bio,
/obj/effect/turf_decal/bot,
+/obj/structure/closet/secure_closet/cytology,
/turf/open/floor/plasteel,
/area/science/xenobiology)
"ddT" = (
@@ -83371,9 +83323,21 @@
/area/science/xenobiology)
"ddV" = (
/obj/structure/table/reinforced,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/slime_scanner,
/obj/effect/turf_decal/delivery,
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_x = 4;
+ pixel_y = 13
+ },
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_x = -6;
+ pixel_y = 14
+ },
+/obj/item/reagent_containers/glass/beaker/large{
+ pixel_y = 8
+ },
+/obj/item/stack/sheet/mineral/plasma{
+ amount = 5
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"ddW" = (
@@ -83858,14 +83822,13 @@
/turf/open/floor/plasteel,
/area/maintenance/port)
"deY" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port)
"deZ" = (
@@ -88795,7 +88758,6 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/abandoned_gambling_den)
"dpT" = (
-/obj/effect/decal/cleanable/vomit/old,
/obj/effect/landmark/blobstart,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -88807,6 +88769,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/abandoned_gambling_den)
"dpU" = (
@@ -91166,15 +91129,11 @@
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"dvQ" = (
-/obj/structure/rack,
/obj/effect/decal/cleanable/dirt,
-/obj/item/weldingtool,
-/obj/item/assembly/voice,
-/obj/item/clothing/head/welding,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/stripes/line{
dir = 9
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"dvR" = (
@@ -93853,11 +93812,6 @@
/area/maintenance/starboard/aft)
"dCR" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -93868,6 +93822,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
+/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plasteel,
/area/maintenance/starboard/aft)
"dCS" = (
@@ -95197,6 +95152,7 @@
/obj/structure/sign/poster/official/report_crimes{
pixel_y = 32
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood{
icon_state = "wood-broken5"
},
@@ -97178,9 +97134,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"dJp" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/costume,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"dJq" = (
@@ -98002,14 +97956,11 @@
/area/maintenance/aft)
"dLc" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft)
"dLd" = (
@@ -98378,11 +98329,7 @@
/area/maintenance/port/aft)
"dLT" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/crowbar/red,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"dLU" = (
@@ -98670,14 +98617,13 @@
/area/maintenance/aft)
"dMy" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 8
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft)
"dMz" = (
@@ -102777,12 +102723,8 @@
/area/library/abandoned)
"dUX" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/flashlight,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"dUY" = (
@@ -103401,11 +103343,11 @@
/turf/open/floor/plasteel,
/area/medical/virology)
"dWC" = (
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/airalarm{
dir = 4;
pixel_x = -23
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood,
/area/library/abandoned)
"dWD" = (
@@ -105582,6 +105524,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"ebO" = (
@@ -106821,7 +106764,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/oil,
/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"eeq" = (
@@ -108136,6 +108079,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"eKq" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance/two,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"eMd" = (
/obj/machinery/vending/cigarette,
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -112105,6 +112054,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
/turf/open/floor/plasteel,
/area/library)
+"qxX" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"qyG" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -112810,6 +112763,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/security/prison)
+"sxV" = (
+/obj/effect/loot_site_spawner,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"sAm" = (
/obj/machinery/light_switch{
pixel_x = 26
@@ -112901,6 +112858,20 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1,
/turf/open/floor/plasteel,
/area/security/prison/safe)
+"sTz" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"sTI" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{
dir = 8
@@ -112952,6 +112923,11 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"tbn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/loot_site_spawner,
+/turf/open/floor/plating,
+/area/maintenance/port)
"tbR" = (
/obj/structure/table/reinforced,
/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko,
@@ -144382,7 +144358,7 @@ bUo
bWD
bYO
caE
-ccm
+cNj
ced
cea
ced
@@ -145103,7 +145079,7 @@ alf
avr
awp
axK
-alg
+qxX
aAb
aBk
aCv
@@ -145458,7 +145434,7 @@ djJ
duE
qdJ
djF
-ceb
+tbn
cjq
dBZ
cjq
@@ -147031,7 +147007,7 @@ dYu
dZg
ebR
dLW
-ecQ
+eKq
edl
aad
aaa
@@ -147160,7 +147136,7 @@ arB
awv
axQ
alf
-aAd
+sTz
aBs
aDI
aDI
@@ -147288,7 +147264,7 @@ dLW
dLW
dLW
ecv
-dNt
+sxV
edl
aad
aad
@@ -160598,7 +160574,7 @@ cAm
cZX
cIW
cHW
-cHW
+dJp
vTA
cSR
oKQ
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 6b2719a7623..6720d6b0a4e 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -5250,18 +5250,14 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"alT" = (
-/obj/structure/rack,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
+/obj/structure/closet,
/turf/open/floor/plating,
-/area/maintenance/port/aft)
+/area/maintenance/starboard/fore)
"alU" = (
/turf/closed/wall,
/area/maintenance/port/fore)
"alV" = (
-/obj/effect/decal/cleanable/vomit,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"alW" = (
@@ -5798,8 +5794,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"ane" = (
@@ -7665,10 +7660,7 @@
/turf/open/floor/plasteel/dark,
/area/security/prison/safe)
"arM" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"arN" = (
@@ -9642,13 +9634,11 @@
/area/maintenance/starboard/fore)
"awE" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awF" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"awG" = (
@@ -16029,6 +16019,7 @@
/obj/structure/window/reinforced{
dir = 8
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"aKW" = (
@@ -20631,10 +20622,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
-"aWB" = (
-/obj/structure/closet/crate,
-/turf/open/floor/plating,
-/area/maintenance/port)
"aWC" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
@@ -24903,10 +24890,6 @@
},
/turf/open/floor/plating/icemoon,
/area/icemoon/surface/outdoors)
-"bgt" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port)
"bgu" = (
/obj/machinery/button/door{
id = "qm_warehouse";
@@ -26241,8 +26224,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"bji" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port)
"bjj" = (
@@ -27810,6 +27792,7 @@
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
+/obj/structure/cable,
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"bmO" = (
@@ -28462,7 +28445,6 @@
/area/medical/medbay)
"bok" = (
/obj/structure/cable,
-/obj/structure/cable,
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 4
},
@@ -29176,10 +29158,9 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"bqg" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
-/area/maintenance/starboard)
+/area/maintenance/starboard/fore)
"bqh" = (
/obj/machinery/light/small{
dir = 1
@@ -33735,6 +33716,7 @@
req_access_txt = "26"
},
/obj/effect/turf_decal/delivery,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/janitor)
"bAX" = (
@@ -35216,8 +35198,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bEF" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/four,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"bEH" = (
@@ -37883,9 +37864,13 @@
"bMq" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/table/glass,
-/obj/item/slime_scanner,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/glasses/science,
+/obj/item/biopsy_tool{
+ pixel_x = -16
+ },
+/obj/structure/microscope{
+ pixel_x = -1;
+ pixel_y = 4
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bMr" = (
@@ -37968,7 +37953,7 @@
/area/maintenance/starboard/aft)
"bMC" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"bMD" = (
@@ -39065,13 +39050,12 @@
/turf/closed/wall,
/area/science/misc_lab)
"bPO" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/closet/secure_closet/cytology,
+/turf/open/floor/plasteel,
+/area/science/xenobiology)
"bPP" = (
/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
@@ -39837,12 +39821,8 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bSq" = (
-/obj/structure/rack,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath,
/obj/effect/decal/cleanable/cobweb,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bSs" = (
@@ -41658,8 +41638,7 @@
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"bXZ" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft)
"bYa" = (
@@ -41790,9 +41769,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"bYs" = (
-/obj/structure/closet/crate,
-/obj/item/clothing/under/color/lightpurple,
-/obj/item/stack/spacecash/c200,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"bYt" = (
@@ -43136,12 +43113,10 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cda" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
-/area/maintenance/port/aft)
+/area/maintenance/starboard/aft)
"cdb" = (
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plating,
@@ -43763,14 +43738,8 @@
/obj/structure/closet/wardrobe/mixed,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"cgt" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"cgu" = (
-/obj/structure/rack,
/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/spawner/lootdrop/maintenance/two,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cgw" = (
@@ -44521,8 +44490,7 @@
/turf/closed/wall/r_wall,
/area/maintenance/solars/starboard/aft)
"cjI" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cjJ" = (
@@ -47937,6 +47905,7 @@
/area/maintenance/disposal)
"cAK" = (
/obj/machinery/light/small,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cAL" = (
@@ -51247,6 +51216,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/construction)
+"gYE" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/wood,
+/area/maintenance/port/aft)
"gZK" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
@@ -51394,6 +51367,10 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/hallway/secondary/entry)
+"hGN" = (
+/obj/effect/loot_site_spawner,
+/turf/open/floor/plating/icemoon,
+/area/icemoon/surface/outdoors)
"hGO" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
@@ -53000,6 +52977,10 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"mDj" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/aft)
"mEX" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -54619,11 +54600,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/medical/medbay/central)
-"ryM" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"rzl" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/maintenance{
@@ -55250,6 +55226,12 @@
/obj/item/storage/toolbox/emergency,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"tte" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/starboard/aft)
"tti" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -55493,6 +55475,10 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"ufp" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"uga" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -56341,6 +56327,12 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"wIi" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/port/aft)
"wJU" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/tile/purple,
@@ -69775,7 +69767,7 @@ boP
asU
asU
asU
-asU
+hGN
alU
atJ
amC
@@ -71324,7 +71316,7 @@ alU
auZ
bsU
axf
-amC
+alV
alU
aol
aBI
@@ -73888,7 +73880,7 @@ aom
amC
apP
amC
-arN
+amC
amC
amC
amC
@@ -74948,7 +74940,7 @@ bbO
aPA
bdM
aPz
-bgt
+bji
bhS
bgw
aPz
@@ -75205,7 +75197,7 @@ bbN
aPA
bdL
aPz
-bgt
+aSg
bhR
bgw
aZE
@@ -75431,8 +75423,8 @@ boP
ali
amC
alU
-arN
-atU
+amC
+arM
alU
atU
amC
@@ -77548,7 +77540,7 @@ bLv
bPS
alv
bSo
-bPS
+gYE
bCq
bVD
bWy
@@ -77815,7 +77807,7 @@ bZl
bCq
bHE
bCq
-cda
+cAA
cgF
bCq
bCq
@@ -78325,7 +78317,7 @@ bVE
bWz
bHE
bHE
-bLu
+cjI
bCq
bLu
bCq
@@ -79089,7 +79081,7 @@ boP
bLv
bQa
bHE
-bHE
+bSs
bCq
bHE
bLv
@@ -79309,7 +79301,7 @@ aPK
aSm
aTI
aPK
-aWB
+bji
akj
soQ
aYf
@@ -79603,7 +79595,7 @@ boP
bLv
bHE
bHE
-bSs
+bHE
bCq
bHE
bLv
@@ -79859,8 +79851,8 @@ asU
asU
bCq
bHE
-alT
-bLu
+bHE
+cjI
bCq
bHE
bLv
@@ -80625,7 +80617,7 @@ bCq
bHD
bJe
bCq
-bLu
+cjI
bHE
bHE
bHE
@@ -81136,7 +81128,7 @@ bwe
bAJ
ccu
bCq
-bHE
+ufp
bJf
bCq
boP
@@ -81163,14 +81155,14 @@ bCq
bUt
bCq
bJf
-bLu
-bRg
+bHE
+cjI
bCq
tgF
bPZ
ccd
bCq
-swV
+wIi
cqL
bJe
bLv
@@ -81937,7 +81929,7 @@ ccu
bQa
bHE
bHE
-bHE
+ufp
ccw
ccw
chB
@@ -96844,7 +96836,7 @@ bzs
bAw
bAw
bAw
-bAw
+bXZ
bzs
bzs
boP
@@ -97019,7 +97011,7 @@ asU
alO
alO
alO
-anf
+bqg
auC
alP
auD
@@ -97352,7 +97344,7 @@ bAw
bAw
bAw
bzs
-bAw
+mDj
bAw
bAw
bAw
@@ -98380,8 +98372,8 @@ bAw
bAw
bAw
bAw
-caK
bAw
+bXZ
bzs
bAw
ciF
@@ -99586,7 +99578,7 @@ boP
boP
boP
apC
-anf
+awF
anf
alP
apE
@@ -101650,7 +101642,7 @@ anf
alP
awL
anf
-anf
+awF
apE
aBF
aBF
@@ -101907,7 +101899,7 @@ anf
alP
awK
anf
-awD
+anf
apE
anf
anf
@@ -102216,7 +102208,7 @@ bJN
bMq
bNp
bMi
-bPJ
+bPO
bJN
bEm
bEm
@@ -102411,7 +102403,7 @@ boP
boP
boP
alP
-aoP
+awF
alP
alP
apE
@@ -102764,7 +102756,7 @@ mtK
mtK
cmn
cmn
-cmn
+cda
cOT
boP
boP
@@ -103783,8 +103775,8 @@ pxV
hBY
cmr
tkC
-bNB
-ryM
+bYs
+cOe
kZR
cNW
cOe
@@ -103953,7 +103945,7 @@ boP
boP
boP
alP
-anf
+bqg
apE
anf
anf
@@ -104213,7 +104205,7 @@ alP
aoQ
alP
aqE
-arA
+alT
asB
atG
auL
@@ -104803,7 +104795,7 @@ eyF
bTl
bTl
bQZ
-cgt
+cOe
cvO
cOT
boP
@@ -105060,7 +105052,7 @@ bTl
bTl
ceQ
bQZ
-cOe
+bYs
cvO
cOT
boP
@@ -106344,7 +106336,7 @@ cbV
bQZ
cOe
ceS
-cae
+tte
cNW
jVl
ciL
@@ -107356,7 +107348,7 @@ cNW
bMC
cOe
jHt
-bPO
+nXU
nXU
bSm
nXU
@@ -108625,7 +108617,7 @@ boP
boP
boP
bZi
-bqg
+bEF
brG
brG
cNR
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index ba13b9c4c07..98a6dc24900 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -4145,6 +4145,7 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"ajg" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -6150,13 +6151,6 @@
/obj/structure/closet/emcloset,
/turf/open/floor/plating,
/area/maintenance/port)
-"ana" = (
-/obj/structure/rack,
-/obj/item/clothing/under/misc/mailman,
-/obj/item/clothing/under/misc/vice_officer,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
"anb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -8231,12 +8225,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"arJ" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/spawner/lootdrop/costume,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"arK" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating{
@@ -9373,11 +9361,6 @@
icon_state = "platingdmg2"
},
/area/maintenance/starboard/fore)
-"aup" = (
-/obj/structure/closet/crate/hydroponics,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"auq" = (
/obj/effect/landmark/xeno_spawn,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer3{
@@ -9467,12 +9450,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
-"auA" = (
-/obj/structure/closet/crate/medical,
-/obj/item/stack/cable_coil,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"auB" = (
/obj/structure/closet/emcloset,
/obj/structure/sign/warning/vacuum/external{
@@ -9487,14 +9464,11 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"auD" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
},
/obj/effect/decal/cleanable/cobweb,
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"auE" = (
@@ -10264,10 +10238,7 @@
/turf/open/floor/plasteel/dark,
/area/security/brig)
"awA" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/donkpockets,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/fore)
"awB" = (
@@ -10397,8 +10368,7 @@
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
"awS" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/fore)
"awV" = (
@@ -15633,10 +15603,7 @@
/area/hydroponics/garden)
"aKw" = (
/obj/effect/decal/cleanable/cobweb,
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aKx" = (
@@ -16901,10 +16868,7 @@
/area/quartermaster/warehouse)
"aNR" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/closet/crate,
-/obj/effect/turf_decal/bot,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aNS" = (
@@ -18767,18 +18731,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics/garden)
-"aSo" = (
-/obj/item/book/manual/wiki/engineering_hacking{
- pixel_x = 4;
- pixel_y = 5
- },
-/obj/item/book/manual/wiki/engineering_construction{
- pixel_y = 3
- },
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"aSp" = (
/obj/machinery/power/terminal,
/obj/structure/extinguisher_cabinet{
@@ -23130,6 +23082,7 @@
/obj/structure/window/reinforced{
dir = 4
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bcd" = (
@@ -35806,9 +35759,7 @@
dir = 4
},
/obj/machinery/light/small,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/blood/gibs/old,
-/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel,
/area/crew_quarters/toilet/auxiliary)
"bHO" = (
@@ -37113,13 +37064,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port)
-"bLc" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
-/area/maintenance/port)
"bLd" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance/three,
@@ -37831,14 +37775,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port)
-"bMG" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/rack_parts,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port)
"bMH" = (
/obj/machinery/light/small,
/obj/machinery/power/apc{
@@ -41269,8 +41205,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bVE" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"bVF" = (
@@ -42231,6 +42166,7 @@
pixel_x = -12;
pixel_y = 2
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bXC" = (
@@ -42262,11 +42198,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
/turf/open/floor/plating,
/area/maintenance/port)
-"bXH" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
-/area/maintenance/port)
"bXJ" = (
/obj/item/storage/box/lights/mixed,
/turf/open/floor/plating{
@@ -42691,14 +42622,6 @@
/obj/item/vending_refill/cola,
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"bYP" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/spawner/lootdrop/donkpockets,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"bYQ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/airlock/maintenance{
@@ -45609,12 +45532,6 @@
/obj/effect/spawner/lootdrop/maintenance/three,
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cfE" = (
-/obj/structure/closet/crate,
-/obj/item/reagent_containers/dropper,
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"cfG" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -46578,23 +46495,19 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"chC" = (
-/obj/structure/closet/crate,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/spawner/lootdrop/maintenance/four,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"chD" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/spawner/lootdrop/maintenance/two,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard)
"chE" = (
@@ -47741,8 +47654,7 @@
name = "old sink";
pixel_y = 28
},
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"ckz" = (
@@ -48379,10 +48291,10 @@
"clZ" = (
/obj/effect/landmark/xeno_spawn,
/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/blood/gibs/old,
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer3{
dir = 4
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"cma" = (
@@ -48737,13 +48649,7 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"cmY" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"cmZ" = (
@@ -55591,10 +55497,12 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"cGo" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
+/area/maintenance/port/fore)
"cGp" = (
/obj/structure/window/reinforced{
dir = 1;
@@ -56545,10 +56453,8 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"cJr" = (
-/obj/structure/closet/crate,
-/obj/item/clothing/gloves/color/fyellow,
/obj/structure/cable,
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft)
"cJs" = (
@@ -58841,11 +58747,10 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"cOA" = (
-/obj/structure/rack,
/obj/machinery/light/small{
dir = 4
},
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cOB" = (
@@ -61845,16 +61750,6 @@
/area/science/xenobiology)
"dcd" = (
/obj/structure/table/glass,
-/obj/item/paper_bin{
- pixel_y = 4
- },
-/obj/item/folder/white{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/pen{
- pixel_x = -4
- },
/obj/machinery/requests_console{
department = "Science";
departmentType = 2;
@@ -61871,6 +61766,10 @@
/obj/effect/turf_decal/tile/purple{
dir = 4
},
+/obj/structure/microscope{
+ pixel_x = -1;
+ pixel_y = 1
+ },
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dce" = (
@@ -62079,7 +61978,6 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcu" = (
-/obj/structure/closet/l3closet/scientist,
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
@@ -62087,6 +61985,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
+/obj/structure/closet/secure_closet/cytology,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"dcv" = (
@@ -63619,9 +63518,7 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/dorms)
"dhB" = (
-/obj/structure/closet/crate,
-/obj/item/poster/random_contraband,
-/obj/effect/spawner/lootdrop/maintenance/three,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"dhC" = (
@@ -63880,11 +63777,10 @@
/turf/open/floor/wood,
/area/vacant_room/office)
"dio" = (
-/obj/structure/closet/crate,
-/obj/item/poster/random_official,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
dir = 4
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port)
"dip" = (
@@ -64127,13 +64023,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"diU" = (
-/obj/structure/closet/crate,
-/obj/item/poster/random_official,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/landmark/blobstart,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/effect/loot_site_spawner,
+/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"diV" = (
@@ -67908,8 +67802,7 @@
/turf/open/floor/plasteel/dark,
/area/security/brig)
"hdh" = (
-/obj/structure/closet/crate,
-/obj/item/storage/box/lights/mixed,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port)
"hdA" = (
@@ -68163,7 +68056,7 @@
/area/science/xenobiology)
"hvt" = (
/obj/structure/kitchenspike_frame,
-/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"hxH" = (
@@ -69231,12 +69124,7 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"jvy" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
-/obj/item/flashlight/pen{
- pixel_x = 4;
- pixel_y = 3
- },
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft)
"jwJ" = (
@@ -71115,6 +71003,11 @@
},
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
+"moO" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plasteel/white,
+/area/medical/abandoned)
"mpe" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -72068,6 +71961,10 @@
icon_state = "wood-broken3"
},
/area/quartermaster/qm)
+"okv" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
"okP" = (
/obj/machinery/newscaster{
pixel_y = 32
@@ -73874,9 +73771,8 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"qVW" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/turf_decal/stripes/line,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
"qWF" = (
@@ -74753,8 +74649,7 @@
/turf/closed/wall,
/area/maintenance/aft/secondary)
"slf" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/closet/crate,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"sme" = (
@@ -74833,12 +74728,6 @@
/obj/machinery/chem_master,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
-"sqZ" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
"srE" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
@@ -75638,7 +75527,7 @@
/area/security/prison)
"tTw" = (
/obj/structure/chair/stool,
-/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood,
/area/maintenance/port/aft)
"tXK" = (
@@ -75808,12 +75697,6 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/break_room)
-"upQ" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/two,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
"urv" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced/tinted,
@@ -77302,7 +77185,7 @@
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
},
-/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood,
/area/maintenance/port/aft)
"wHc" = (
@@ -78247,8 +78130,7 @@
/area/medical/psychology)
"yaN" = (
/obj/effect/turf_decal/delivery,
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/costume,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"ybh" = (
@@ -92461,7 +92343,7 @@ tOc
ckR
cmh
cnj
-tTw
+cjt
ckP
ckP
ckP
@@ -94264,7 +94146,7 @@ dux
cCk
qUR
mmb
-upQ
+yaN
uHp
bXE
oAe
@@ -94523,7 +94405,7 @@ bXE
bXE
hLm
bXE
-aae
+slf
bXE
hLm
dux
@@ -95037,7 +94919,7 @@ bXE
bXE
bXE
rig
-sqZ
+yaN
bXE
yaN
dux
@@ -95271,7 +95153,7 @@ bCQ
bGm
bHO
bvW
-bLc
+hdh
aod
aGN
aqK
@@ -97026,7 +96908,7 @@ aRG
aIu
atv
auL
-avO
+cGo
dne
ayj
aAL
@@ -97071,7 +96953,7 @@ dLM
bSp
aoa
aqO
-bMG
+hdh
alC
bPN
apz
@@ -97634,7 +97516,7 @@ hFW
xpZ
hav
bTs
-jNL
+jvy
bZT
bTs
aaa
@@ -97802,7 +97684,7 @@ apa
aym
azu
aIs
-aRG
+awS
aHl
aJK
aJK
@@ -97851,7 +97733,7 @@ bTx
bue
bSu
dux
-bYP
+slf
dux
cbA
cdi
@@ -98140,7 +98022,7 @@ gDK
mci
xpZ
rMb
-hYF
+moO
iHk
nWN
iHk
@@ -98621,13 +98503,13 @@ bBs
bBs
bue
bWd
-bXH
+hdh
dux
bZS
dvw
cdk
ceu
-cfE
+slf
hxP
cev
cjC
@@ -98819,7 +98701,7 @@ aio
aks
alJ
amY
-aRG
+okv
aRG
aqQ
dne
@@ -100103,7 +99985,7 @@ aeJ
aaa
aaa
aip
-ana
+awS
aog
doe
aqT
@@ -114075,7 +113957,7 @@ czD
dvY
dvY
dvY
-cGo
+ciL
cJd
cPz
cKP
@@ -116575,7 +116457,7 @@ aNm
dnR
aPS
cXc
-aSo
+dhB
dnh
avB
aWv
@@ -117070,7 +116952,7 @@ afD
aqo
arG
asB
-aup
+dhB
dnR
dnh
axN
@@ -118148,7 +118030,7 @@ bKr
bKr
bKr
bKr
-lVD
+bVE
apc
alq
alq
@@ -118867,7 +118749,7 @@ amG
amH
anN
dnS
-arJ
+dhB
arI
dnh
dqu
@@ -123752,7 +123634,7 @@ aaf
aaf
aaf
dni
-auA
+dhB
dnS
dqT
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index f3e43f453ec..e5f85ea32e0 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -7560,11 +7560,7 @@
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
"ato" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance/two,
-/obj/item/clothing/mask/balaclava,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/dorms)
"atp" = (
@@ -12827,10 +12823,10 @@
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"aFO" = (
-/obj/effect/decal/cleanable/vomit/old,
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"aFP" = (
@@ -15107,10 +15103,8 @@
/area/maintenance/department/cargo)
"aMz" = (
/obj/structure/grille/broken,
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/maintenance/two,
-/obj/item/crowbar,
/obj/machinery/light/small,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"aMA" = (
@@ -15162,6 +15156,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/disposal)
"aML" = (
@@ -16139,6 +16134,7 @@
},
/area/maintenance/department/crew_quarters/bar)
"aPz" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -16605,7 +16601,6 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
dir = 9
},
@@ -17098,10 +17093,7 @@
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"aRY" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
"aRZ" = (
@@ -24165,12 +24157,6 @@
"bju" = (
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
-"bjv" = (
-/obj/structure/closet,
-/obj/item/weldingtool,
-/obj/item/crowbar,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"bjw" = (
/turf/closed/wall/r_wall,
/area/science/explab)
@@ -24576,11 +24562,8 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bkW" = (
-/obj/item/hemostat,
-/obj/item/retractor,
-/obj/item/cautery,
-/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"bkX" = (
@@ -26762,6 +26745,9 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
+/obj/item/reagent_containers/dropper{
+ pixel_y = 8
+ },
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"bqF" = (
@@ -32721,6 +32707,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer3{
dir = 4
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel/dark,
/area/medical/exam_room)
"bEK" = (
@@ -32778,14 +32765,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"bEQ" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/item/stock_parts/matter_bin,
-/obj/item/stock_parts/matter_bin,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"bER" = (
/obj/machinery/computer/mecha{
dir = 4
@@ -34229,7 +34208,7 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bHR" = (
-/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bHS" = (
@@ -41028,11 +41007,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
/turf/open/floor/plasteel,
/area/engine/engineering)
-"bYF" = (
-/obj/item/trash/pistachios,
-/obj/structure/rack,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"bYI" = (
/obj/item/kirbyplants{
icon_state = "plant-21";
@@ -42294,9 +42268,7 @@
/turf/open/floor/plating/asteroid,
/area/chapel/asteroid/monastery)
"ccN" = (
-/obj/structure/closet/crate/medical,
-/obj/item/stack/medical/gauze,
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"ccO" = (
@@ -45083,15 +45055,9 @@
},
/area/maintenance/department/crew_quarters/bar)
"coG" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/maintenance/department/crew_quarters/bar)
+/obj/effect/loot_site_spawner,
+/turf/open/floor/plating,
+/area/maintenance/department/security/brig)
"coH" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{
@@ -48581,6 +48547,7 @@
/obj/structure/urinal{
pixel_y = 32
},
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/plating,
/area/maintenance/department/science)
"dNr" = (
@@ -48751,6 +48718,7 @@
/area/engine/engineering)
"ekU" = (
/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"elk" = (
@@ -49601,13 +49569,9 @@
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"gjN" = (
-/obj/item/weldingtool,
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/effect/decal/cleanable/oil{
- icon_state = "floor6"
- },
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
-/area/maintenance/department/security/brig)
+/area/maintenance/solars/port)
"gkz" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 4
@@ -50374,6 +50338,9 @@
/obj/machinery/light{
dir = 4
},
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = -6
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"hPU" = (
@@ -50433,12 +50400,6 @@
},
/turf/open/space/basic,
/area/engine/engineering)
-"hUt" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"hUJ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3,
@@ -51187,7 +51148,7 @@
},
/area/maintenance/department/science)
"jFw" = (
-/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/science)
"jGb" = (
@@ -51758,11 +51719,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
-"kKI" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/closet,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
"kMO" = (
/obj/effect/turf_decal/caution{
dir = 4
@@ -52991,6 +52947,10 @@
/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/closed/wall/r_wall,
/area/science/mixing)
+"nvG" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"nwg" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
@@ -53098,6 +53058,12 @@
dir = 1
},
/area/hallway/secondary/exit/departure_lounge)
+"nGx" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/department/engine)
"nIm" = (
/obj/machinery/computer/security/telescreen{
dir = 8;
@@ -53529,10 +53495,6 @@
/turf/open/floor/engine,
/area/medical/chemistry)
"oon" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -53558,6 +53520,12 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
+"orc" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating{
+ luminosity = 2
+ },
+/area/maintenance/department/science)
"ory" = (
/obj/machinery/light{
dir = 4
@@ -53603,6 +53571,10 @@
/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
+"otM" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/wood,
+/area/maintenance/department/crew_quarters/dorms)
"ous" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/loading_area{
@@ -54046,12 +54018,19 @@
/area/science/genetics)
"pfP" = (
/obj/structure/table,
-/obj/item/storage/box/syringes,
+/obj/item/storage/box/syringes{
+ pixel_x = -3;
+ pixel_y = 5
+ },
/obj/machinery/camera{
c_tag = "Xenobiology Computers";
dir = 4;
network = list("ss13","rd")
},
+/obj/item/biopsy_tool{
+ pixel_x = 8;
+ pixel_y = 2
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"pgk" = (
@@ -54147,6 +54126,12 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"pzm" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/security/brig)
"pAb" = (
/obj/machinery/power/emitter,
/obj/machinery/light{
@@ -54224,8 +54209,7 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"pKd" = (
-/obj/effect/spawner/lootdrop/maintenance/two,
-/obj/structure/closet/crate,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"pKg" = (
@@ -55438,12 +55422,6 @@
"sqQ" = (
/turf/open/floor/plating,
/area/maintenance/disposal)
-"srZ" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
"ssx" = (
/obj/item/shard,
/turf/open/floor/plating,
@@ -55475,10 +55453,10 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"svN" = (
-/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/sign/departments/restroom{
pixel_y = 32
},
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/department/science)
"sww" = (
@@ -55684,6 +55662,10 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"sYG" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/department/security/brig)
"sYY" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -55698,7 +55680,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"sZh" = (
-/obj/structure/closet/crate,
+/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/disposal)
"sZu" = (
@@ -55781,17 +55763,15 @@
/area/science/explab)
"tdB" = (
/obj/structure/table,
-/obj/item/reagent_containers/glass/beaker,
-/obj/item/reagent_containers/dropper,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/item/clothing/glasses/science{
- pixel_x = 0;
- pixel_y = 9
+/obj/structure/microscope{
+ pixel_x = -1;
+ pixel_y = 4
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
@@ -56308,6 +56288,9 @@
pixel_x = 3;
pixel_y = 4
},
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = -6
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"ueV" = (
@@ -56366,6 +56349,10 @@
"ulY" = (
/turf/open/floor/engine,
/area/engine/engineering)
+"umd" = (
+/obj/effect/spawner/lootdrop/gross_decal_spawner,
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"ume" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -57945,8 +57932,8 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/structure/closet/l3closet/scientist,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1,
+/obj/structure/closet/secure_closet/cytology,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"xsB" = (
@@ -58287,10 +58274,11 @@
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"ygZ" = (
-/obj/structure/closet/crate,
-/obj/effect/spawner/lootdrop/maintenance/three,
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
+/obj/effect/loot_site_spawner,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/department/engine)
"yhB" = (
/obj/structure/disposaloutlet,
/obj/structure/disposalpipe/trunk{
@@ -70835,7 +70823,7 @@ aaa
crb
crg
cru
-crv
+nvG
bZY
crT
csi
@@ -73577,7 +73565,7 @@ lcU
sGr
hiw
wYu
-ajD
+sYG
jsf
ajD
rLi
@@ -75632,8 +75620,8 @@ aiu
aiu
aeJ
aiu
-aqg
-gjN
+coG
+uaE
aoe
atp
aus
@@ -75643,11 +75631,11 @@ axC
xuv
azN
vtT
-vtT
+gjN
aiu
apB
aiu
-aBa
+pzm
oTC
ait
aaa
@@ -82119,7 +82107,7 @@ bzG
bAQ
bBZ
bnv
-bDi
+ccN
bDi
bDi
aCD
@@ -82141,7 +82129,7 @@ bva
bva
bva
bSw
-bYF
+ccN
bSw
bva
bva
@@ -83691,7 +83679,7 @@ lHX
nDo
bva
sij
-bDi
+umd
ydf
ihj
ssx
@@ -84189,7 +84177,7 @@ bPy
bQl
bQW
bva
-bSw
+nGx
bPC
bUc
bva
@@ -84199,7 +84187,7 @@ bva
nNJ
bDi
bOB
-bSw
+ygZ
bDi
bDi
cad
@@ -84957,7 +84945,7 @@ bMJ
bEr
bEr
bPA
-bNX
+ccN
bQX
bKH
bKH
@@ -86451,7 +86439,7 @@ aKT
aLH
aNf
aKT
-aLL
+aRY
aQO
aRO
aSH
@@ -88506,7 +88494,7 @@ aJO
aKV
abI
aKT
-coG
+coH
aPE
aQS
aRQ
@@ -91371,7 +91359,7 @@ bAm
dhz
bCD
bDA
-bEQ
+ccN
jSA
bHo
bIv
@@ -95669,7 +95657,7 @@ ajt
alQ
mnG
alb
-alb
+otM
aiS
anY
apt
@@ -97008,7 +96996,7 @@ beI
bhp
beI
beI
-bjv
+pKd
bkx
blN
bmT
@@ -97265,7 +97253,7 @@ rud
bhq
bcI
bix
-ygZ
+aFi
bkx
blM
bmU
@@ -102118,7 +102106,7 @@ aBY
atn
aEj
aFf
-hUt
+pKd
aFi
aFi
aFi
@@ -102657,7 +102645,7 @@ aaa
aEl
asG
aFi
-aFi
+pKd
aEj
bhz
lEn
@@ -103716,7 +103704,7 @@ aht
bwm
ikB
iVJ
-izF
+orc
typ
bwm
aht
@@ -103928,7 +103916,7 @@ rax
aQo
aPg
aRu
-srZ
+sZh
aLm
aTx
aEj
@@ -104455,7 +104443,7 @@ bbM
bcL
bdS
baG
-kKI
+pKd
aFi
hOz
aEj
@@ -107814,7 +107802,7 @@ faA
qYn
bkF
oon
-lWy
+jFw
rSQ
qVi
lWy
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index dae0711cb12..d549afab56e 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -103,6 +103,7 @@
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
#define ADMIN_PUNISHMENT_SCARIFY "Scarify"
#define ADMIN_PUNISHMENT_SHOES "Knot Shoes"
+#define ADMIN_PUNISHMENT_DOCK "Dock Pay"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index a56f10dccd3..15b9ea3ab4b 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -92,6 +92,13 @@
#define COLOR_ASSEMBLY_BLUE "#38559E"
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
+///Colors for xenobiology vatgrowing
+#define COLOR_SAMPLE_YELLOW "#c0b823"
+#define COLOR_SAMPLE_PURPLE "#342941"
+#define COLOR_SAMPLE_GREEN "#98b944"
+#define COLOR_SAMPLE_BROWN "#91542d"
+#define COLOR_SAMPLE_GRAY "#5e5856"
+
/**
* Some defines to generalise colours used in lighting.
*
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 35c9e3be621..a83bab5fdee 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -755,6 +755,10 @@
///(obj/item/insertion_candidate, mob/user, silent) - returns bool
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
+// /datum/component/swabbing signals
+#define COMSIG_SWAB_FOR_SAMPLES "swab_for_samples" ///Called when you try to swab something using the swabable component, includes a mutable list of what has been swabbed so far so it can be modified.
+ #define COMPONENT_SWAB_FOUND (1<<0)
+
// /datum/component/two_handed signals
///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index 1cf6486c730..5572dec40bc 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -37,3 +37,6 @@
#define FOOD_MEAT_HUMAN 50
#define FOOD_MEAT_MUTANT 100
#define FOOD_MEAT_MUTANT_RARE 200
+
+
+#define IS_EDIBLE(O) (istype(O, /obj/item/reagent_containers/food/snacks) || O.GetComponent(/datum/component/edible))
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index ce8c83c7038..ea7d4ae8056 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -47,7 +47,7 @@
#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(24) ///turf/closed
#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/closed/wall/material
-#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/closed/wall/r_wall/syndicate
+#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate
#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(27) ///turf/closed/indestructible/hotelwall
#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(28) ///turf/closed/mineral, /turf/closed/indestructible
#define SMOOTH_GROUP_BOSS_WALLS S_TURF(29) ///turf/closed/indestructible/riveted/boss
@@ -96,7 +96,7 @@
#define SMOOTH_GROUP_HEDGE_FLUFF S_OBJ(65) ///obj/structure/fluff/hedge
-#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(66) ///obj/structure/window/shuttle, /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/shuttle/engine
+#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(66) ///obj/structure/window/shuttle, /obj/structure/window/plasma/reinforced/plastitanium, /turf/closed/indestructible/opsglass, /obj/structure/shuttle
#define SMOOTH_GROUP_CLEANABLE_DIRT S_OBJ(67) ///obj/effect/decal/cleanable/dirt
diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm
index 86c4bf155c4..46cbccc8fee 100644
--- a/code/__DEFINES/research.dm
+++ b/code/__DEFINES/research.dm
@@ -88,3 +88,36 @@
///Amount of points gained per second by a single R&D server, see: [/controllers/subsystem/research.dm][research]
#define TECHWEB_SINGLE_SERVER_INCOME 52.3
+
+///Swab cell line types
+#define CELL_LINE_TABLE_SLUDGE "cell_line_sludge_table"
+#define CELL_LINE_TABLE_MOLD "cell_line_mold_table"
+#define CELL_LINE_TABLE_MOIST "cell_line_moist_table"
+#define CELL_LINE_TABLE_BLOB "cell_line_blob_table"
+
+///Biopsy cell line types
+#define CELL_LINE_TABLE_BEAR "cell_line_bear_table"
+#define CELL_LINE_TABLE_BLOBBERNAUT "cell_line_blobbernaut_table"
+#define CELL_LINE_TABLE_BLOBSPORE "cell_line_blobspore_table"
+#define CELL_LINE_TABLE_CARP "cell_line_carp_table"
+#define CELL_LINE_TABLE_CAT "cell_line_cat_table"
+#define CELL_LINE_TABLE_CHICKEN "cell_line_chicken_table"
+#define CELL_LINE_TABLE_COCKROACH "cell_line_cockroach_table"
+#define CELL_LINE_TABLE_CORGI "cell_line_corgi_table"
+#define CELL_LINE_TABLE_COW "cell_line_cow_table"
+#define CELL_LINE_TABLE_GELATINOUS "cell_line_gelatinous_table"
+#define CELL_LINE_TABLE_GRAPE "cell_line_grape_table"
+#define CELL_LINE_TABLE_MEGACARP "cell_line_megacarp_table"
+#define CELL_LINE_TABLE_MOUSE "cell_line_mouse_table"
+#define CELL_LINE_TABLE_PINE "cell_line_pine_table"
+#define CELL_LINE_TABLE_PUG "cell_line_pug_table"
+#define CELL_LINE_TABLE_SLIME "cell_line_slime_table"
+#define CELL_LINE_TABLE_SNAKE "cell_line_snake_table"
+#define CELL_LINE_TABLE_VATBEAST "cell_line_vatbeast_table"
+
+///All cell virus types
+#define CELL_VIRUS_TABLE_GENERIC "cell_virus_generic_table"
+#define CELL_VIRUS_TABLE_GENERIC_MOB "cell_virus_generic_mob_table"
+
+///General defines for vatgrowing
+#define VATGROWING_DANGER_MINIMUM 30 //Past how much growth can the other cell_lines affect a finished cell line negatively
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index a77b65acf81..10a6ab98c5c 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -6,7 +6,8 @@
#define CONSCIOUS 0
#define SOFT_CRIT 1
#define UNCONSCIOUS 2
-#define DEAD 3
+#define HARD_CRIT 3
+#define DEAD 4
//Maximum healthiness an individual can have
#define MAX_SATIETY 600
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 080559a25f7..25fd070a663 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -80,6 +80,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_IMMOBILIZED "immobilized" //Prevents voluntary movement.
#define TRAIT_FLOORED "floored" //Prevents standing or staying up on its own.
#define TRAIT_INCAPACITATED "incapacitated"
+#define TRAIT_CRITICAL_CONDITION "critical-condition" //In some kind of critical condition. Is able to succumb.
#define TRAIT_BLIND "blind"
#define TRAIT_MUTE "mute"
#define TRAIT_EMOTEMUTE "emotemute"
@@ -279,6 +280,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define BUCKLED_TRAIT "buckled" //trait associated to being buckled
#define CHOKEHOLD_TRAIT "chokehold" //trait associated to being held in a chokehold
#define RESTING_TRAIT "resting" //trait associated to resting
+#define STAT_TRAIT "stat" //trait associated to a stat value or range of
// unique trait sources, still defines
#define CLONING_POD_TRAIT "cloning-pod"
@@ -323,3 +325,4 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define SKILLCHIP_TRAIT "skillchip"
#define PULLED_WHILE_SOFTCRIT_TRAIT "pulled-while-softcrit"
#define LOCKED_BORG_TRAIT "locked-borg"
+#define LACKING_LOCOMOTION_APPENDAGES_TRAIT "lacking-locomotion-appengades" //trait associated to not having locomotion appendages nor the ability to fly or float
diff --git a/code/_globalvars/lists/construction.dm b/code/_globalvars/lists/construction.dm
deleted file mode 100644
index 3accb854ca1..00000000000
--- a/code/_globalvars/lists/construction.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-///A cache with all the objects craftable with a plumbing constructor and their delay (doubles as their cost, 1sec/10 matter)
-GLOBAL_LIST_INIT(plumbing_constructables, list(
- /obj/machinery/plumbing/input = 5,
- /obj/machinery/plumbing/output = 5,
- /obj/machinery/plumbing/tank = 20,
- /obj/machinery/plumbing/acclimator = 10,
- /obj/machinery/plumbing/bottler = 50,
- /obj/machinery/plumbing/disposer = 10,
- /obj/machinery/plumbing/fermenter = 30,
- /obj/machinery/plumbing/filter = 5,
- /obj/machinery/plumbing/grinder_chemical = 30,
- /obj/machinery/plumbing/pill_press = 20,
- /obj/machinery/plumbing/liquid_pump = 35,
- /obj/machinery/plumbing/reaction_chamber = 15,
- /obj/machinery/plumbing/splitter = 5,
- /obj/machinery/plumbing/synthesizer = 15,
- /obj/machinery/plumbing/sender = 20
-))
diff --git a/code/_globalvars/lists/xenobiology.dm b/code/_globalvars/lists/xenobiology.dm
new file mode 100644
index 00000000000..36bf999f32c
--- /dev/null
+++ b/code/_globalvars/lists/xenobiology.dm
@@ -0,0 +1,36 @@
+///These global lists exist to allow our element to have weight tables without having to be seperate instances.
+
+///Assoc list of cell line define | assoc list of datum | cell_line
+GLOBAL_LIST_INIT_TYPED(cell_line_tables, /list, list(
+ CELL_LINE_TABLE_SLUDGE = list(/datum/micro_organism/cell_line/sholean_grapes = 2, /datum/micro_organism/cell_line/blobbernaut = 1, /datum/micro_organism/cell_line/slime = 2, /datum/micro_organism/cell_line/cow = 1, /datum/micro_organism/cell_line/mouse = 1, /datum/micro_organism/cell_line/chicken = 1, /datum/micro_organism/cell_line/cockroach = 2),
+ CELL_LINE_TABLE_MOIST = list(/datum/micro_organism/cell_line/gelatinous_cube = 2, /datum/micro_organism/cell_line/megacarp = 1, /datum/micro_organism/cell_line/slime = 2, /datum/micro_organism/cell_line/snake = 1, /datum/micro_organism/cell_line/carp = 1, /datum/micro_organism/cell_line/cockroach = 1),
+ CELL_LINE_TABLE_BLOB = list(/datum/micro_organism/cell_line/blobbernaut = 1, /datum/micro_organism/cell_line/blob_spore = 1),
+ CELL_LINE_TABLE_MOLD = list(/datum/micro_organism/cell_line/vat_beast = 2, /datum/micro_organism/cell_line/bear = 1, /datum/micro_organism/cell_line/slime = 1, /datum/micro_organism/cell_line/blob_spore = 1, /datum/micro_organism/cell_line/mouse = 2, /datum/micro_organism/cell_line/corgi = 1, /datum/micro_organism/cell_line/cockroach = 1, /datum/micro_organism/cell_line/cat = 1),
+ CELL_LINE_TABLE_BEAR = list(/datum/micro_organism/cell_line/bear = 1),
+ CELL_LINE_TABLE_BLOBBERNAUT = list(/datum/micro_organism/cell_line/blobbernaut = 1),
+ CELL_LINE_TABLE_BLOBSPORE = list(/datum/micro_organism/cell_line/blob_spore = 1),
+ CELL_LINE_TABLE_CARP = list(/datum/micro_organism/cell_line/carp = 1),
+ CELL_LINE_TABLE_CAT = list(/datum/micro_organism/cell_line/cat = 1),
+ CELL_LINE_TABLE_CHICKEN = list(/datum/micro_organism/cell_line/chicken = 1),
+ CELL_LINE_TABLE_COCKROACH = list(/datum/micro_organism/cell_line/cockroach = 1),
+ CELL_LINE_TABLE_CORGI = list(/datum/micro_organism/cell_line/corgi = 1),
+ CELL_LINE_TABLE_COW = list(/datum/micro_organism/cell_line/cow = 1),
+ CELL_LINE_TABLE_GELATINOUS = list(/datum/micro_organism/cell_line/gelatinous_cube = 1),
+ CELL_LINE_TABLE_GRAPE = list(/datum/micro_organism/cell_line/sholean_grapes = 1),
+ CELL_LINE_TABLE_MEGACARP = list(/datum/micro_organism/cell_line/megacarp = 1),
+ CELL_LINE_TABLE_MOUSE = list(/datum/micro_organism/cell_line/mouse = 1),
+ CELL_LINE_TABLE_PINE = list(/datum/micro_organism/cell_line/pine = 1),
+ CELL_LINE_TABLE_PUG = list(/datum/micro_organism/cell_line/pug = 1),
+ CELL_LINE_TABLE_SLIME = list(/datum/micro_organism/cell_line/slime = 1),
+ CELL_LINE_TABLE_SNAKE = list(/datum/micro_organism/cell_line/snake = 1),
+ CELL_LINE_TABLE_VATBEAST = list(/datum/micro_organism/cell_line/vat_beast = 1)
+ ))
+
+///Assoc list of cell virus define | assoc list of datum | cell_virus
+GLOBAL_LIST_INIT(cell_virus_tables, list(
+ CELL_VIRUS_TABLE_GENERIC = list(/datum/micro_organism/virus = 1),
+ CELL_VIRUS_TABLE_GENERIC_MOB = list(/datum/micro_organism/virus = 1)
+ ))
+
+///List of all possible sample colors
+GLOBAL_LIST_INIT(xeno_sample_colors, list(COLOR_SAMPLE_YELLOW, COLOR_SAMPLE_PURPLE, COLOR_SAMPLE_GREEN, COLOR_SAMPLE_BROWN, COLOR_SAMPLE_GRAY))
diff --git a/code/_onclick/hud/ooze.dm b/code/_onclick/hud/ooze.dm
new file mode 100644
index 00000000000..137f49049e8
--- /dev/null
+++ b/code/_onclick/hud/ooze.dm
@@ -0,0 +1,19 @@
+///Hud type with targetting dol and a nutrition bar
+/datum/hud/ooze/New(mob/living/owner)
+ . = ..()
+
+ zone_select = new /obj/screen/zone_sel()
+ zone_select.icon = ui_style
+ zone_select.hud = src
+ zone_select.update_icon()
+ static_inventory += zone_select
+
+ alien_plasma_display = new /obj/screen/ooze_nutrition_display //Just going to use the alien plasma display because making new vars for each object is braindead.
+ alien_plasma_display.hud = src
+ infodisplay += alien_plasma_display
+
+/obj/screen/ooze_nutrition_display
+ icon = 'icons/mob/screen_alien.dmi'
+ icon_state = "power_display"
+ name = "nutrition"
+ screen_loc = ui_alienplasmadisplay
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index cecd5e92c5f..eed8baa1339 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -248,7 +248,7 @@
if(dextrous && !ismob(A))
..()
else
- AttackingTarget()
+ AttackingTarget(A)
diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm
index c5d6dfa1268..f81a7d3df61 100644
--- a/code/controllers/subsystem/processing/processing.dm
+++ b/code/controllers/subsystem/processing/processing.dm
@@ -30,6 +30,8 @@ SUBSYSTEM_DEF(processing)
if (MC_TICK_CHECK)
return
+
+///This proc is called on a datum if it is being processed in a subsystem. If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list
/datum/proc/process()
set waitfor = 0
return PROCESS_KILL
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 2b6463fe3a2..5952340136b 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -468,6 +468,7 @@
else
Remove(owner)
+
/datum/action/item_action/cult_dagger/Trigger()
for(var/obj/item/H in owner.held_items) //In case we were already holding another dagger
if(istype(H, /obj/item/melee/cultblade/dagger))
@@ -478,11 +479,16 @@
owner.temporarilyRemoveItemFromInventory(I)
owner.put_in_hands(I)
I.attack_self(owner)
+ return
+ if(!isliving(owner))
+ to_chat(owner, "You lack the necessary living force for this action.")
+ return
+ var/mob/living/living_owner = owner
+ if (living_owner.usable_hands <= 0)
+ to_chat(living_owner, "You dont have any usable hands!")
else
- if (owner.get_num_arms() <= 0)
- to_chat(owner, "You dont have any usable hands!")
- else
- to_chat(owner, "Your hands are full!")
+ to_chat(living_owner, "Your hands are full!")
+
///MGS BOX!
/datum/action/item_action/agent_box
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index baa6968fdeb..572265cbb18 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -80,7 +80,7 @@
if(!weapon.isEmbedHarmless())
harmful = TRUE
- weapon.embedded(parent)
+ weapon.embedded(parent, part)
START_PROCESSING(SSdcs, src)
var/mob/living/carbon/victim = parent
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index f9ab924f36c..1538cc8bff7 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -219,7 +219,7 @@
return override_allow_spacemove || AM.has_gravity()
/datum/component/riding/proc/account_limbs(mob/living/M)
- if(M.get_num_legs() < 2 && !slowed)
+ if(M.usable_legs < 2 && !slowed)
vehicle_move_delay = vehicle_move_delay + slowvalue
slowed = TRUE
else if(slowed)
@@ -302,7 +302,7 @@
return
if(iscarbon(user))
var/mob/living/carbon/carbonuser = user
- if(!carbonuser.get_num_arms())
+ if(!carbonuser.usable_hands)
Unbuckle(user)
to_chat(user, "You can't grab onto [AM] with no hands!")
return
diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm
new file mode 100644
index 00000000000..de897a10c65
--- /dev/null
+++ b/code/datums/components/swabbing.dm
@@ -0,0 +1,128 @@
+/*!
+
+This component is used in vat growing to swab for microbiological samples which can then be mixed with reagents in a petridish to create a culture plate.
+
+*/
+/datum/component/swabbing
+ ///The current datums on the swab
+ var/list/swabbed_items
+ ///Can we swab objs?
+ var/can_swab_objs
+ ///Can we swab turfs?
+ var/can_swab_turfs
+ ///Can we swab mobs?
+ var/can_swab_mobs
+ ///Callback for update_icon()
+ var/datum/callback/update_icons
+ ///Callback for update_overlays()
+ var/datum/callback/update_overlays
+
+/datum/component/swabbing/Initialize(can_swab_objs = TRUE, can_swab_turfs = TRUE, can_swab_mobs = FALSE, datum/callback/update_icons, datum/callback/update_overlays, swab_time = 1 SECONDS, max_items = 3)
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, .proc/try_to_swab)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/handle_overlays)
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, .proc/handle_icon)
+
+ src.can_swab_objs = can_swab_objs
+ src.can_swab_turfs = can_swab_turfs
+ src.can_swab_mobs = can_swab_mobs
+ src.update_icons = update_icons
+ src.update_overlays = update_overlays
+
+/datum/component/swabbing/Destroy()
+ . = ..()
+ for(var/swabbed in swabbed_items)
+ qdel(swabbed)
+ QDEL_NULL(update_icons)
+ QDEL_NULL(update_overlays)
+
+
+///Changes examine based on your sample
+/datum/component/swabbing/proc/examine(datum/source, mob/user, list/examine_list)
+ if(LAZYLEN(swabbed_items))
+ examine_list += "There is a microbiological sample on [parent]!"
+ examine_list += "You can see the following micro-organisms:\n"
+ for(var/i in swabbed_items)
+ var/datum/biological_sample/samp = i
+ for(var/organism in samp.micro_organisms)
+ var/datum/micro_organism/MO = organism
+ examine_list += MO.get_details()
+
+///Ran when you attack an object, tries to get a swab of the object. if a swabbable surface is found it will run behavior and hopefully
+/datum/component/swabbing/proc/try_to_swab(datum/source, atom/target, mob/user, params)
+ set waitfor = FALSE //This prevents do_after() from making this proc not return it's value.
+
+ if(istype(target, /obj/structure/table))//help how do i do this less shitty
+ return NONE //idk bro pls send help
+
+ if(istype(target, /obj/item/petri_dish))
+ if(!LAZYLEN(swabbed_items))
+ return NONE
+ var/obj/item/petri_dish/dish = target
+ if(dish.sample)
+ return
+
+ var/datum/biological_sample/deposited_sample
+
+ for(var/i in swabbed_items) //Typed in case there is a non sample on the swabbing tool because someone was fucking with swabbable element
+ if(!istype(i, /datum/biological_sample/))
+ stack_trace("Non biological sample being swabbed, no bueno.")
+ continue
+ var/datum/biological_sample/sample = i
+ //Collapse the samples into one sample; one gooey mess essentialy.
+ if(!deposited_sample)
+ deposited_sample = sample
+ else
+ deposited_sample.Merge(sample)
+
+ dish.deposit_sample(user, deposited_sample)
+ LAZYCLEARLIST(swabbed_items)
+
+ var/obj/item/I = parent
+ I.update_icon()
+
+ return COMPONENT_NO_ATTACK
+ if(!can_swab(target))
+ return NONE //Just do the normal attack.
+
+
+ . = COMPONENT_NO_ATTACK //Point of no return. No more attacking after this.
+
+ if(LAZYLEN(swabbed_items))
+ to_chat(user, "You cannot collect another sample on [parent]!")
+ return
+
+ to_chat(user, "You start swabbing [target] for samples!")
+ if(!do_after(user, 3 SECONDS, TRUE, target)) // Start swabbing boi
+ return
+
+ LAZYINITLIST(swabbed_items) //If it isn't initialized, initialize it. As we need to pass it by reference
+
+ if(SEND_SIGNAL(target, COMSIG_SWAB_FOR_SAMPLES, swabbed_items) == NONE) //If we found something to swab now we let the swabbed thing handle what it would do, we just sit back and relax now.
+ to_chat(user, "You do not manage to find a anything on [target]!")
+ return
+
+ to_chat(user, "You manage to collect a microbiological sample from [target]!")
+
+ var/obj/item/parent_item = parent
+ parent_item.update_icon()
+
+///Checks if the swabbing component can swab the specific object or nots
+/datum/component/swabbing/proc/can_swab(atom/target)
+ if(isobj(target))
+ return can_swab_objs
+ if(isturf(target))
+ return can_swab_turfs
+ if(ismob(target))
+ return can_swab_mobs
+
+///Handle any special overlay cases on the item itself
+/datum/component/swabbing/proc/handle_overlays(datum/source, list/overlays)
+ update_overlays?.Invoke(overlays, swabbed_items)
+
+///Handle any special icon cases on the item itself
+/datum/component/swabbing/proc/handle_icon(datum/source)
+ update_icons?.Invoke(swabbed_items)
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 38287eab344..2c3d60d24bb 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -1,8 +1,7 @@
-#define MAX_TABLE_MESSES 8 // how many things can we knock off a table at once?
+/// how many things can we knock off a table at once by diving into it?
+#define MAX_TABLE_MESSES 12
/**
- *#tackle.dm
- *
* For when you want to throw a person at something and have fun stuff happen
*
* This component is made for carbon mobs (really, humans), and allows its parent to throw themselves and perform tackles. This is done by enabling throw mode, then clicking on your
@@ -10,7 +9,7 @@
* roll to see how badly you just messed yourself up. If, along your journey, you hit a table, you'll slam onto it and send up to MAX_TABLE_MESSES (8) /obj/items on the table flying,
* and take a bit of extra damage and stun for each thing launched.
*
- * There are 2 """skill rolls""" involved here, which are handled and explained in sack() and rollTackle() (for roll 1, carbons), and splat() (for roll 2, walls and solid objects)
+ * There are 2 separate """skill rolls""" involved here, which are handled and explained in [rollTackle()][/datum/component/tackler/proc/rollTackle] (for roll 1, carbons), and [splat()][/datum/component/tackler/proc/splat] (for roll 2, walls and solid objects)
*/
/datum/component/tackler
dupe_mode = COMPONENT_DUPE_UNIQUE
@@ -108,7 +107,7 @@
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/checkObstacle)
playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1)
- var/leap_word = isfelinid(user) ? "pounce" : "leap" ///If cat, "pounce" instead of "leap".
+ var/leap_word = isfelinid(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap".
if(can_see(user, A, 7))
user.visible_message("[user] [leap_word]s at [A]!", "You [leap_word] at [A]!")
else
@@ -124,11 +123,9 @@
return(COMSIG_MOB_CANCEL_CLICKON)
/**
- * sack()
- *
* sack() is called when you actually smack into something, assuming we're mid-tackle. First it deals with smacking into non-carbons, in two cases:
* * If it's a non-carbon mob, we don't care, get out of here and do normal thrown-into-mob stuff
- * * Else, if it's something dense (walls, machinery, structures, most things other than the floor), go to splat() and get ready for some high grade shit
+ * * Else, if it's something dense (walls, machinery, structures, most things other than the floor), go to [/datum/component/tackler/proc/splat] and get ready for some high grade shit
*
* If it's a carbon we hit, we'll call rollTackle() which rolls a die and calculates modifiers for both the tackler and target, then gives us a number. Negatives favor the target, while positives favor the tackler.
* Check [rollTackle()][/datum/component/tackler/proc/rollTackle] for a more thorough explanation on the modifiers at play.
@@ -149,6 +146,7 @@
if(!tackling || !tackle)
return
+ user.toggle_throw_mode()
if(!iscarbon(hit))
if(hit.density)
return splat(user, hit)
@@ -157,7 +155,7 @@
var/mob/living/carbon/target = hit
var/mob/living/carbon/human/T = target
var/mob/living/carbon/human/S = user
- var/tackle_word = isfelinid(user) ? "pounce" : "tackle" ///If cat, "pounce" instead of "tackle".
+ var/tackle_word = isfelinid(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle".
var/roll = rollTackle(target)
tackling = FALSE
@@ -171,7 +169,7 @@
user.Paralyze(30)
var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD)
if(hed)
- hed.receive_damage(brute=20, updating_health=TRUE)
+ hed.receive_damage(brute=15, updating_health=TRUE, wound_bonus = CANT_WOUND)
user.gain_trauma(/datum/brain_trauma/mild/concussion)
if(-4 to -2) // glancing blow at best
@@ -181,7 +179,7 @@
user.Knockdown(30)
if(ishuman(target) && !T.has_movespeed_modifier(/datum/movespeed_modifier/shove))
T.add_movespeed_modifier(/datum/movespeed_modifier/shove) // maybe define a slightly more severe/longer slowdown for this
- addtimer(CALLBACK(T, /mob/living/carbon/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
+ addtimer(CALLBACK(T, /mob/living/carbon/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH * 2)
if(-1 to 0) // decent hit, both parties are about equally inconvenienced
user.visible_message("[user] lands a passable [tackle_word] on [target], sending them both tumbling!", "You land a passable [tackle_word] on [target], sending you both tumbling!", target)
@@ -231,8 +229,6 @@
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
/**
- * rollTackle()
- *
* This handles all of the modifiers for the actual carbon-on-carbon tackling, and gets its own proc because of how many there are (with plenty more in mind!)
*
* The base roll is between (-3, 3), with negative numbers favoring the target, and positive numbers favoring the tackler. The target and the tackler are both assessed for
@@ -261,6 +257,15 @@
defense_mod -= 2
if(HAS_TRAIT(target, TRAIT_GIANT))
defense_mod += 2
+ if(target.get_organic_health() < 50)
+ defense_mod -= 1
+
+ var/leg_wounds = 0 // -1 defense per 2 leg wounds
+ for(var/i in target.all_wounds)
+ var/datum/wound/iterwound = i
+ if((iterwound.limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)))
+ leg_wounds++
+ defense_mod -= round(leg_wounds * 0.5)
if(ishuman(target))
var/mob/living/carbon/human/T = target
@@ -308,16 +313,14 @@
/**
- * splat()
- *
* This is where we handle diving into dense atoms, generally with effects ranging from bad to REALLY bad. This works as a percentile roll that is modified in two steps as detailed below. The higher
* the roll, the more severe the result.
*
- * Mod 1: Speed
+ * Mod 1: Speed-
* * Base tackle speed is 1, which is what normal gripper gloves use. For other sources with higher speed tackles, like dolphin and ESPECIALLY rocket gloves, we obey Newton's laws and hit things harder.
* * For every unit of speed above 1, move the lower bound of the roll up by 15. Unlike Mod 2, this only serves to raise the lower bound, so it can't be directly counteracted by anything you can control.
*
- * Mod 2: Misc
+ * Mod 2: Misc-
* -Flat modifiers, these take whatever you rolled and add/subtract to it, with the end result capped between the minimum from Mod 1 and 100. Note that since we can't roll higher than 100 to start with,
* wearing a helmet should be enough to remove any chance of permanently paralyzing yourself and dramatically lessen knocking yourself unconscious, even with rocket gloves. Will expand on maybe
* * Wearing a helmet: -6
@@ -325,11 +328,13 @@
* * Clumsy: +6
*
* Effects: Below are the outcomes based off your roll, in order of increasing severity
- * * 1-63: Knocked down for a few seconds and a bit of brute and stamina damage
- * * 64-83: Knocked silly, gain some confusion as well as the above
- * * 84-93: Cranial trauma, get a concussion and more confusion, plus more damage
- * * 94-98: Knocked unconscious, significant chance to get a random mild brain trauma, as well as a fair amount of damage
- * * 99-100: Break your spinal cord, get paralyzed, take a bunch of damage too. Very unlucky!
+ *
+ * * 1-67: Knocked down for a few seconds and a bit of brute and stamina damage
+ * * 68-85: Knocked silly, gain some confusion as well as the above
+ * * 86-92: Cranial trauma, get a concussion and more confusion, plus more damage
+ * * 93-96: Knocked unconscious, get a random mild brain trauma, as well as a fair amount of damage
+ * * 97-98: Massive head damage, probably crack your skull open, random mild brain trauma
+ * * 99-Infinity: Break your spinal cord, get paralyzed, take a bunch of damage too. Very unlucky!
*/
/datum/component/tackler/proc/splat(mob/living/carbon/user, atom/hit)
if(istype(hit, /obj/machinery/vending)) // before we do anything else-
@@ -344,7 +349,7 @@
return
var/oopsie_mod = 0
- var/danger_zone = (speed - 1) * 15 // for every extra speed we have over 1, take away 15 of the safest chance
+ var/danger_zone = (speed - 1) * 13 // for every extra speed we have over 1, take away 13 of the safest chance
danger_zone = max(min(danger_zone, 100), 1)
if(ishuman(user))
@@ -367,9 +372,13 @@
switch(oopsie)
if(99 to INFINITY)
// can you imagine standing around minding your own business when all of the sudden some guy fucking launches himself into a wall at full speed and irreparably paralyzes himself?
- user.visible_message("[user] slams face-first into [hit] at an awkward angle, severing [user.p_their()] spinal column with a sickening crack! Holy shit!", "You slam face-first into [hit] at an awkward angle, severing your spinal column with a sickening crack! Holy shit!")
+ user.visible_message("[user] slams face-first into [hit] at an awkward angle, severing [user.p_their()] spinal column with a sickening crack! Fucking shit!", "You slam face-first into [hit] at an awkward angle, severing your spinal column with a sickening crack! Fucking shit!")
+ var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD)
+ if(hed)
+ hed.receive_damage(brute=40, updating_health=FALSE, wound_bonus = 40)
+ else
+ user.adjustBruteLoss(40, updating_health=FALSE)
user.adjustStaminaLoss(30)
- user.adjustBruteLoss(30)
playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE)
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE)
@@ -379,7 +388,23 @@
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.clear_fullscreen("flash", 4.5)
- if(94 to 98)
+ if(97 to 98)
+ user.visible_message("[user] slams skull-first into [hit] with a sound like crumpled paper, revealing a horrifying breakage in [user.p_their()] cranium! Holy shit!", "You slam skull-first into [hit] and your senses are filled with warm goo flooding across your face! Your skull is open!")
+ var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD)
+ if(hed)
+ hed.receive_damage(brute=30, updating_health=FALSE, wound_bonus = 25)
+ else
+ user.adjustBruteLoss(40, updating_health=FALSE)
+ user.adjustStaminaLoss(30)
+ user.gain_trauma_type(BRAIN_TRAUMA_MILD)
+ playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE)
+ playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
+ user.emote("gurgle")
+ shake_camera(user, 7, 7)
+ user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
+ user.clear_fullscreen("flash", 4.5)
+
+ if(93 to 96)
user.visible_message("[user] slams face-first into [hit] with a concerning squish, immediately going limp!", "You slam face-first into [hit], and immediately lose consciousness!")
user.adjustStaminaLoss(30)
user.adjustBruteLoss(30)
@@ -390,9 +415,9 @@
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.clear_fullscreen("flash", 3.5)
- if(84 to 93)
+ if(86 to 92)
user.visible_message("[user] slams head-first into [hit], suffering major cranial trauma!", "You slam head-first into [hit], and the world explodes around you!")
- user.adjustStaminaLoss(30)
+ user.adjustStaminaLoss(30, updating_health=FALSE)
user.adjustBruteLoss(30)
user.add_confusion(15)
if(prob(80))
@@ -403,19 +428,19 @@
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.clear_fullscreen("flash", 2.5)
- if(64 to 83)
+ if(68 to 85)
user.visible_message("[user] slams hard into [hit], knocking [user.p_them()] senseless!", "You slam hard into [hit], knocking yourself senseless!")
- user.adjustStaminaLoss(30)
+ user.adjustStaminaLoss(30, updating_health=FALSE)
user.adjustBruteLoss(10)
user.add_confusion(10)
user.Knockdown(30)
shake_camera(user, 3, 4)
- if(1 to 63)
+ if(1 to 67)
user.visible_message("[user] slams into [hit]!", "You slam into [hit]!")
- user.adjustStaminaLoss(20)
+ user.adjustStaminaLoss(20, updating_health=FALSE)
user.adjustBruteLoss(10)
- user.Knockdown(30)
+ user.Knockdown(20)
shake_camera(user, 2, 2)
playsound(user, 'sound/weapons/smash.ogg', 70, TRUE)
@@ -448,7 +473,7 @@
user.Paralyze(10)
user.Knockdown(30)
W.take_damage(30 * speed)
- user.adjustStaminaLoss(10 * speed)
+ user.adjustStaminaLoss(10 * speed, updating_health=FALSE)
user.adjustBruteLoss(5 * speed)
/datum/component/tackler/proc/delayedSmash(obj/structure/window/W)
@@ -478,7 +503,7 @@
if(messes.len >= MAX_TABLE_MESSES)
break
- /// for telling HOW big of a mess we just made
+ // for telling HOW big of a mess we just made
var/HOW_big_of_a_miss_did_we_just_make = ""
if(messes.len)
if(messes.len < MAX_TABLE_MESSES / 4)
@@ -491,10 +516,10 @@
HOW_big_of_a_miss_did_we_just_make = ", making a ginormous mess!" // an extra exclamation point!! for emphasis!!!
owner.visible_message("[owner] trips over [kevved] and slams into it face-first[HOW_big_of_a_miss_did_we_just_make]!", "You trip over [kevved] and slam into it face-first[HOW_big_of_a_miss_did_we_just_make]!")
- owner.adjustStaminaLoss(20 + messes.len * 2)
- owner.adjustBruteLoss(10 + messes.len)
- owner.Paralyze(5 * messes.len) // half a second of paralyze for each thing you knock around
- owner.Knockdown(20 + 5 * messes.len) // 2 seconds of knockdown after the paralyze
+ owner.adjustStaminaLoss(15 + messes.len * 2, FALSE)
+ owner.adjustBruteLoss(8 + messes.len)
+ owner.Paralyze(0.4 SECONDS * messes.len) // .4 seconds of paralyze for each thing you knock around
+ owner.Knockdown(2 SECONDS + 0.4 SECONDS * messes.len) // 2 seconds of knockdown after the paralyze
for(var/obj/item/I in messes)
var/dist = rand(1, 3)
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
index 88e15d7f0a5..0d7c03d4075 100644
--- a/code/datums/components/twohanded.dm
+++ b/code/datums/components/twohanded.dm
@@ -135,7 +135,7 @@
else
to_chat(user, "You need your other hand to be empty!")
return
- if(user.get_num_arms() < 2)
+ if(user.usable_hands < 2)
if(require_twohands)
user.dropItemToGround(parent, force=TRUE)
to_chat(user, "You don't have enough intact hands.")
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 245fb4e7e40..a049288947c 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -269,10 +269,11 @@
return power
if(M.IsSleeping())
return power * 0.25 //Voluntary unconsciousness yields lower healing.
- if(M.stat == UNCONSCIOUS)
- return power * 0.9
- if(M.stat == SOFT_CRIT)
- return power * 0.5
+ switch(M.stat)
+ if(UNCONSCIOUS, HARD_CRIT)
+ return power * 0.9
+ if(SOFT_CRIT)
+ return power * 0.5
if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
to_chat(M, "You feel yourself slip into a regenerative coma...")
active_coma = TRUE
diff --git a/code/datums/elements/swabbable.dm b/code/datums/elements/swabbable.dm
new file mode 100644
index 00000000000..18b88f50324
--- /dev/null
+++ b/code/datums/elements/swabbable.dm
@@ -0,0 +1,50 @@
+/*!
+
+This element is used in vat growing to allow for the object to be
+
+*/
+/datum/element/swabable
+ element_flags = ELEMENT_BESPOKE
+ id_arg_index = 2
+ ///The define of the cell_line list to use
+ var/cell_line_define
+ ///The define of the cell_virus list to use
+ var/virus_define
+ ///Amount of cell lines on a single sample
+ var/cell_line_amount
+ ///Amount of viruses on a single sample
+ var/virus_chance
+
+///Listens for the swab signal and then generate a sample based on pre-determined lists that are saved as GLOBs. this allows us to have very few swabbable element instances.
+/datum/element/swabable/Attach(datum/target, cell_line_define, virus_define, cell_line_amount = 1, virus_chance = 10)
+ . = ..()
+ if(!isatom(target) || isarea(target))
+ return ELEMENT_INCOMPATIBLE
+
+ RegisterSignal(target, COMSIG_SWAB_FOR_SAMPLES, .proc/GetSwabbed)
+
+ src.cell_line_define = cell_line_define
+ src.virus_define = virus_define
+ src.cell_line_amount = cell_line_amount
+ src.virus_chance = virus_chance
+
+///Stops listening to the swab signal; you can no longer be swabbed.
+/datum/element/swabable/Detach(datum/source, force)
+ . = ..()
+ if(!isatom(source) || isarea(source))
+ return ELEMENT_INCOMPATIBLE
+ UnregisterSignal(source, COMSIG_SWAB_FOR_SAMPLES)
+
+///Ran when the parent is swabbed by an object that can swab that type of obj. The list is sent by ref, which means the thing which sent the signal will still have the updated list.
+/datum/element/swabable/proc/GetSwabbed(datum/source, list/mutable_results)
+ SIGNAL_HANDLER
+ . = COMPONENT_SWAB_FOUND //Return this so the swabbing component knows hes a good boy and found something that needs swabbing.
+
+ LAZYADD(mutable_results, GenerateSample())
+ Detach(source)
+
+///Generates a /datum/biological_sample
+/datum/element/swabable/proc/GenerateSample()
+ var/datum/biological_sample/generated_sample = new
+ generated_sample.GenerateSample(cell_line_define, virus_define, cell_line_amount, virus_chance)
+ return generated_sample
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index d0f37526174..19575faa0f4 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -134,7 +134,7 @@
switch(user.stat)
if(SOFT_CRIT)
to_chat(user, "You cannot [key] while in a critical condition!")
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
to_chat(user, "You cannot [key] while unconscious!")
if(DEAD)
to_chat(user, "You cannot [key] while dead!")
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 7ec84cca5d0..1a788f77984 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -45,7 +45,7 @@
for(var/I in callees)
var/obj/machinery/holopad/H = I
- if(!QDELETED(H) && H.is_operational())
+ if(!QDELETED(H) && H.is_operational)
dialed_holopads += H
if(head_call)
if(H.secure)
@@ -178,13 +178,13 @@
/datum/holocall/proc/Check()
for(var/I in dialed_holopads)
var/obj/machinery/holopad/H = I
- if(!H.is_operational())
+ if(!H.is_operational)
ConnectionFailure(H)
if(QDELETED(src))
return FALSE
- . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc
+ . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational && user.loc == calling_holopad.loc
if(.)
if(!connected_holopad)
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index e3e015802ef..1cf14fd205c 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -435,7 +435,7 @@
/datum/mutation/human/martyrdom/proc/bloody_shower(new_stat)
SIGNAL_HANDLER
- if(new_stat != UNCONSCIOUS)
+ if(new_stat != HARD_CRIT)
return
var/list/organs = owner.getorganszone(BODY_ZONE_HEAD, 1)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 86e06325ffb..e02f51946a6 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -280,7 +280,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(A.fire)
cont = FALSE
break
- if(cont && D.is_operational())
+ if(cont && D.is_operational)
if(D.operating)
D.nextstate = opening ? FIREDOOR_OPEN : FIREDOOR_CLOSED
else if(!(D.density ^ opening))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e4480c4e6a8..5f097d46646 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -653,7 +653,7 @@
* Default behaviour is to send a warning that the user can't move while buckled as long
* as the [buckle_message_cooldown][/atom/var/buckle_message_cooldown] has expired (50 ticks)
*/
-/atom/proc/relaymove(mob/user)
+/atom/proc/relaymove(mob/living/user, direction)
if(buckle_message_cooldown <= world.time)
buckle_message_cooldown = world.time + 50
to_chat(user, "You can't move while buckled to [src]!")
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 78a8efb12f4..ffae8794e16 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,5 +1,7 @@
/atom/movable
layer = OBJ_LAYER
+ glide_size = 8
+ appearance_flags = TILE_BOUND|PIXEL_SCALE
var/last_move = null
var/last_move_time = 0
var/anchored = FALSE
@@ -31,10 +33,9 @@
var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before.
var/list/client_mobs_in_contents // This contains all the client mobs within this container
var/list/acted_explosions //for explosion dodging
- glide_size = 8
- appearance_flags = TILE_BOUND|PIXEL_SCALE
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
- var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
+ ///In case you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. Should only be changed through setMovetype()
+ var/movement_type = GROUND
var/atom/movable/pulling
var/grab_state = 0
var/throwforce = 0
@@ -563,9 +564,15 @@
var/atom/movable/AM = item
AM.onTransitZ(old_z,new_z)
+
+///Proc to modify the movement_type and hook behavior associated with it changing.
/atom/movable/proc/setMovetype(newval)
+ if(movement_type == newval)
+ return
+ . = movement_type
movement_type = newval
+
/**
* Called whenever an object moves and by mobs when they attempt to move themselves through space
* And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move]
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 3863fcc991e..0044d18f106 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -338,7 +338,7 @@
switch(stat)
if(CONSCIOUS)
holder.icon_state = "hudstat"
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
holder.icon_state = "hudoffline"
else
holder.icon_state = "huddead2"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e0852a7e9c8..3c65135dbe4 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -498,7 +498,7 @@
if(L.suiciding) //Suicider
msg += "[L.name] ([L.key]), the [L.job] (Suicide)\n"
failed = TRUE //Disconnected client
- if(!failed && L.stat == UNCONSCIOUS)
+ if(!failed && (L.stat == UNCONSCIOUS || L.stat == HARD_CRIT))
msg += "[L.name] ([L.key]), the [L.job] (Dying)\n"
failed = TRUE //Unconscious
if(!failed && L.stat == DEAD)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index c2d44fe5420..06cba324617 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -604,43 +604,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/steal/special/find_target(dupe_search_range)
return set_target(pick(GLOB.possible_items_special))
-/datum/objective/steal/exchange
- name = "exchange"
- martyr_compatible = 0
-
-/datum/objective/steal/exchange/admin_edit(mob/admin)
- return
-
-/datum/objective/steal/exchange/proc/set_faction(faction,otheragent)
- target = otheragent
- if(faction == "red")
- targetinfo = new/datum/objective_item/unique/docs_blue
- else if(faction == "blue")
- targetinfo = new/datum/objective_item/unique/docs_red
- explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent"
- steal_target = targetinfo.targetitem
-
-
-/datum/objective/steal/exchange/update_explanation_text()
- ..()
- if(target && target.current)
- explanation_text = "Acquire [targetinfo.name] held by [target.name], the [target.assigned_role] and syndicate agent"
- else
- explanation_text = "Free Objective"
-
-
-/datum/objective/steal/exchange/backstab
- name = "prevent exchange"
-
-/datum/objective/steal/exchange/backstab/set_faction(faction)
- if(faction == "red")
- targetinfo = new/datum/objective_item/unique/docs_red
- else if(faction == "blue")
- targetinfo = new/datum/objective_item/unique/docs_blue
- explanation_text = "Do not give up or lose [targetinfo.name]."
- steal_target = targetinfo.targetitem
-
-
/datum/objective/download
name = "download"
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index 6280594ff6e..8251619012a 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -173,16 +173,6 @@
excludefromjob = list("Chief Engineer","Station Engineer","Atmospheric Technician")
//Unique Objectives
-/datum/objective_item/unique/docs_red
- name = "the \"Red\" secret documents."
- targetitem = /obj/item/documents/syndicate/red
- difficulty = 10
-
-/datum/objective_item/unique/docs_blue
- name = "the \"Blue\" secret documents."
- targetitem = /obj/item/documents/syndicate/blue
- difficulty = 10
-
/datum/objective_item/special/New()
..()
if(TargetExists())
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 92c8f02509a..4ebcfa10be4 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -2,9 +2,6 @@
var/traitor_name = "traitor"
var/list/datum/mind/traitors = list()
- var/datum/mind/exchange_red
- var/datum/mind/exchange_blue
-
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
@@ -73,8 +70,6 @@
var/datum/antagonist/traitor/new_antag = new antag_datum()
addtimer(CALLBACK(traitor, /datum/mind.proc/add_antag_datum, new_antag), rand(10,100))
GLOB.pre_setup_antags -= traitor
- if(!exchange_blue)
- exchange_blue = -1 //Block latejoiners from getting exchange objectives
..()
//We're not actually ready until all traitors are assigned.
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 3aa18d3d889..1234d20c55c 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -76,7 +76,7 @@
if(!(machine_stat & BROKEN))
return
to_chat(user, "You repair [src].")
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
obj_integrity = max_integrity
update_icon()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 19cfd3c10b7..5ef0eb2bf6e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -68,7 +68,7 @@
if (!state_open && user == occupant)
container_resist_act(user)
-/obj/machinery/sleeper/relaymove(mob/user)
+/obj/machinery/sleeper/relaymove(mob/living/user, direction)
if (!state_open)
container_resist_act(user)
@@ -89,7 +89,7 @@
. = ..()
if (. & EMP_PROTECT_SELF)
return
- if(is_operational() && occupant)
+ if(is_operational && occupant)
open_machine()
/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user)
@@ -185,7 +185,7 @@
if(SOFT_CRIT)
data["occupant"]["stat"] = "Conscious"
data["occupant"]["statstate"] = "average"
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
data["occupant"]["stat"] = "Unconscious"
data["occupant"]["statstate"] = "average"
if(DEAD)
@@ -220,7 +220,7 @@
. = TRUE
if("inject")
var/chem = text2path(params["chem"])
- if(!is_operational() || !mob_occupant || isnull(chem))
+ if(!is_operational || !mob_occupant || isnull(chem))
return
if(mob_occupant.health < min_health && chem != /datum/reagent/medicine/epinephrine)
return
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 580780c799c..c9aafb38716 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -77,9 +77,6 @@ Class Procs:
process_atmos()
Called by the 'air subsystem' once per atmos tick for each machine that is listed in its 'atmos_machines' list.
- is_operational()
- Returns 0 if the machine is unpowered, broken or undergoing maintenance, something else if not
-
Compiled by Aygar
*/
@@ -98,7 +95,7 @@ Class Procs:
anchored = TRUE
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
- var/machine_stat = 0
+ var/machine_stat = NONE
var/use_power = IDLE_POWER_USE
//0 = dont run the auto
//1 = run auto, use idle
@@ -107,6 +104,8 @@ Class Procs:
var/active_power_usage = 0
var/power_channel = AREA_USAGE_EQUIP
//AREA_USAGE_EQUIP,AREA_USAGE_ENVIRON or AREA_USAGE_LIGHT
+ ///A combination of factors such as having power, not being broken and so on. Boolean.
+ var/is_operational = TRUE
var/wire_compatible = FALSE
var/list/component_parts = null //list of all the parts used to build it, if made from certain kinds of frames.
@@ -179,6 +178,25 @@ Class Procs:
/obj/machinery/proc/process_atmos()//If you dont use process why are you here
return PROCESS_KILL
+
+///Called when we want to change the value of the machine_stat variable. Holds bitflags.
+/obj/machinery/proc/set_machine_stat(new_value)
+ if(new_value == machine_stat)
+ return
+ . = machine_stat
+ machine_stat = new_value
+ on_set_machine_stat(.)
+
+
+///Called when the value of `machine_stat` changes, so we can react to it.
+/obj/machinery/proc/on_set_machine_stat(old_value)
+ if(old_value & (NOPOWER|BROKEN|MAINT))
+ if(!(machine_stat & (NOPOWER|BROKEN|MAINT))) //From off to on.
+ set_is_operational(TRUE)
+ else if(machine_stat & (NOPOWER|BROKEN|MAINT)) //From on to off.
+ set_is_operational(FALSE)
+
+
/obj/machinery/emp_act(severity)
. = ..()
if(use_power && !machine_stat && !(. & EMP_PROTECT_SELF))
@@ -255,8 +273,20 @@ Class Procs:
use_power(active_power_usage,power_channel)
return 1
-/obj/machinery/proc/is_operational()
- return !(machine_stat & (NOPOWER|BROKEN|MAINT))
+
+///Called when we want to change the value of the `is_operational` variable. Boolean.
+/obj/machinery/proc/set_is_operational(new_value)
+ if(new_value == is_operational)
+ return
+ . = is_operational
+ is_operational = new_value
+ on_set_is_operational(.)
+
+
+///Called when the value of `is_operational` changes, so we can react to it.
+/obj/machinery/proc/on_set_is_operational(old_value)
+ return
+
/obj/machinery/can_interact(mob/user)
if((machine_stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE)) // Check if the machine is broken, and if we can still interact with it if so
@@ -362,7 +392,7 @@ Class Procs:
var/obj/item/bodypart/arm = user.hand_bodyparts[user.active_hand_index]
if(!arm)
return
- if(arm.disabled)
+ if(arm.bodypart_disabled)
return
var/damage = damage_deflection / 10
arm.receive_damage(brute=damage, wound_bonus = CANT_WOUND)
@@ -403,7 +433,7 @@ Class Procs:
return
/obj/machinery/proc/default_pry_open(obj/item/I)
- . = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
+ . = !(state_open || panel_open || is_operational || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
if(.)
I.play_tool_sound(src, 50)
visible_message("[usr] pries open \the [src].", "You pry open \the [src].")
@@ -440,7 +470,7 @@ Class Procs:
SHOULD_CALL_PARENT(1)
. = ..()
if(!(machine_stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- machine_stat |= BROKEN
+ set_machine_stat(machine_stat | BROKEN)
SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag)
update_icon()
return TRUE
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 84f82b165b2..8973051c22f 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -33,7 +33,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
update_icon()
/obj/machinery/announcement_system/update_icon_state()
- if(is_operational())
+ if(is_operational)
icon_state = (panel_open ? "AAS_On_Open" : "AAS_On")
else
icon_state = (panel_open ? "AAS_Off_Open" : "AAS_Off")
@@ -64,7 +64,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
return
else if(P.tool_behaviour == TOOL_MULTITOOL && panel_open && (machine_stat & BROKEN))
to_chat(user, "You reset [src]'s firmware.")
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
update_icon()
else
return ..()
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
return str
/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels)
- if(!is_operational())
+ if(!is_operational)
return
var/message
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
index fd4f6ed64dc..10f5552a007 100644
--- a/code/game/machinery/aug_manipulator.dm
+++ b/code/game/machinery/aug_manipulator.dm
@@ -86,7 +86,7 @@
if(!(machine_stat & BROKEN))
return
to_chat(user, "You repair [src].")
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
obj_integrity = max(obj_integrity, max_integrity)
update_icon()
else
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 46f0f3126b9..5b1d2d54f74 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -61,7 +61,7 @@
/obj/machinery/autolathe/ui_interact(mob/user)
. = ..()
- if(!is_operational())
+ if(!is_operational)
return
if(shocked && !(machine_stat & NOPOWER))
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index a0f46ade81c..3b4c117dbcf 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -147,7 +147,7 @@
update_icon()
network = list()
GLOB.cameranet.removeCamera(src)
- machine_stat |= EMPED
+ set_machine_stat(machine_stat | EMPED)
set_light(0)
emped = emped+1 //Increase the number of consecutive EMP's
update_icon()
@@ -166,7 +166,7 @@
if(emped != thisemp) //Only fix it if the camera hasn't been EMP'd again
return
network = previous_network
- machine_stat &= ~EMPED
+ set_machine_stat(machine_stat & ~EMPED)
update_icon()
if(can_use())
GLOB.cameranet.addCamera(src)
@@ -237,7 +237,7 @@
return
toggle_cam(user, 1)
obj_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
I.play_tool_sound(src)
return TRUE
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 8942f83e535..619360c8104 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -104,7 +104,7 @@
if(SOFT_CRIT)
data["patient"]["stat"] = "Conscious"
data["patient"]["statstate"] = "average"
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
data["patient"]["stat"] = "Unconscious"
data["patient"]["statstate"] = "average"
if(DEAD)
diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm
index 569e8fc6bbc..5c83748afea 100644
--- a/code/game/machinery/computer/_computer.dm
+++ b/code/game/machinery/computer/_computer.dm
@@ -118,5 +118,5 @@
/obj/machinery/computer/AltClick(mob/user)
. = ..()
- if(!user.canUseTopic(src, !issilicon(user)) || !is_operational())
+ if(!user.canUseTopic(src, !issilicon(user)) || !is_operational)
return
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 72c2c5a935a..e3e8c548fe3 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -92,7 +92,7 @@
switch (occupier.stat)
if (CONSCIOUS)
. += "ai-fixer-full"
- if (UNCONSCIOUS)
+ if (UNCONSCIOUS, HARD_CRIT)
. += "ai-fixer-404"
else
. += "ai-fixer-empty"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 62426129805..c2a4f722ea2 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -211,7 +211,7 @@
user_image = image(icon,loc,icon_state,FLY_LAYER)
eye_user.client.images += user_image
-/mob/camera/ai_eye/remote/relaymove(mob/user,direct)
+/mob/camera/ai_eye/remote/relaymove(mob/living/user, direction)
var/initial = initial(sprint)
var/max_sprint = 50
@@ -219,7 +219,7 @@
sprint = initial
for(var/i = 0; i < max(sprint, initial); i += 20)
- var/turf/step = get_turf(get_step(src, direct))
+ var/turf/step = get_turf(get_step(src, direction))
if(step)
setLoc(step)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 2777173442e..025b0f0843a 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -171,7 +171,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/obj/machinery/computer/card/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, !issilicon(user)) || !is_operational())
+ if(!user.canUseTopic(src, !issilicon(user)) || !is_operational)
return
if(inserted_modify_id)
if(id_eject(user, inserted_modify_id))
@@ -361,7 +361,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(..())
return
- if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational())
+ if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational)
usr.unset_machine()
usr << browse(null, "window=id_com")
return
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index c0c074a4556..7ae5a3e4933 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -251,7 +251,7 @@
if(!ui)
ui = new(user, src, "DnaConsole")
ui.open()
-
+
/obj/machinery/computer/scan_consolenew/ui_assets()
. = ..() || list()
. += get_asset_datum(/datum/asset/simple/genetics)
@@ -1462,7 +1462,7 @@
if(!connected_scanner)
return FALSE
- return (connected_scanner && connected_scanner.is_operational())
+ return (connected_scanner && connected_scanner.is_operational)
/**
* Checks if there is a valid DNA Scanner occupant for genetic modification
@@ -1512,7 +1512,7 @@
for(var/direction in GLOB.cardinals)
test_scanner = locate(/obj/machinery/dna_scannernew, get_step(src, direction))
if(!isnull(test_scanner))
- if(test_scanner.is_operational())
+ if(test_scanner.is_operational)
connected_scanner = test_scanner
connected_scanner.linked_console = src
return
diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
index de87b331609..47b3f36d651 100644
--- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm
+++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm
@@ -123,7 +123,7 @@
for(var/direction in GLOB.cardinals)
teleporterf = locate(/obj/machinery/gulag_teleporter, get_step(src, direction))
- if(teleporterf && teleporterf.is_operational())
+ if(teleporterf?.is_operational)
return teleporterf
/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/findbeacon()
diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm
index 221bc8a96e3..2fc68b8f542 100644
--- a/code/game/machinery/computer/teleporter.dm
+++ b/code/game/machinery/computer/teleporter.dm
@@ -159,12 +159,12 @@
log_game("[key_name(user)] has set the teleporter target to [target_station] at [AREACOORD(T)]")
target = target_station.teleporter_hub
target_station.linked_stations |= power_station
- target_station.machine_stat &= ~NOPOWER
+ target_station.set_machine_stat(target_station.machine_stat & ~NOPOWER)
if(target_station.teleporter_hub)
- target_station.teleporter_hub.machine_stat &= ~NOPOWER
+ target_station.teleporter_hub.set_machine_stat(target_station.teleporter_hub.machine_stat & ~NOPOWER)
target_station.teleporter_hub.update_icon()
if(target_station.teleporter_console)
- target_station.teleporter_console.machine_stat &= ~NOPOWER
+ target_station.teleporter_console.set_machine_stat(target_station.teleporter_console.machine_stat & ~NOPOWER)
target_station.teleporter_console.update_icon()
/obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM)
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index c2d4a399bb7..6729611c8c7 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -11,6 +11,7 @@
idle_power_usage = 0
power_channel = AREA_USAGE_EQUIP
req_one_access = list(ACCESS_MEDICAL, ACCESS_HEADS, ACCESS_SECURITY) //used to control clamps
+ processing_flags = NONE
/// The mount's defib
var/obj/item/defibrillator/defib
/// if true, and a defib is loaded, it can't be removed without unlocking the clamps
@@ -178,11 +179,25 @@
idle_power_usage = 1
wallframe_type = /obj/item/wallframe/defib_mount/charging
+
+/obj/machinery/defibrillator_mount/charging/Initialize()
+ . = ..()
+ if(is_operational)
+ begin_processing()
+
+
+/obj/machinery/defibrillator_mount/charging/on_set_is_operational(old_value)
+ if(old_value) //Turned off
+ end_processing()
+ else //Turned on
+ begin_processing()
+
+
/obj/machinery/defibrillator_mount/charging/process()
var/obj/item/stock_parts/cell/C = get_cell()
- if(!C)
+ if(!C || !is_operational)
return PROCESS_KILL
- if(C.charge < C.maxcharge && is_operational())
+ if(C.charge < C.maxcharge)
use_power(100)
C.give(80)
update_icon()
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 172bffd8113..242c96ce354 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -114,7 +114,7 @@
return TRUE
-/obj/machinery/dna_scannernew/relaymove(mob/user)
+/obj/machinery/dna_scannernew/relaymove(mob/living/user, direction)
if(user.stat || locked)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 82c1dde57a4..32a9a4454f6 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -958,7 +958,7 @@
"You hear welding.")
if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, .proc/weld_checks, W, user)))
obj_integrity = max_integrity
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
user.visible_message("[user] finishes welding [src].", \
"You finish repairing the airlock.")
update_icon()
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index af9cdea2be8..01d85b05dcd 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -216,7 +216,7 @@
"[user] fixes [src]!",
"You restore [src] to operation.")
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
obj_integrity = max_integrity
update_icon()
else
diff --git a/code/game/machinery/electrolyzer.dm b/code/game/machinery/electrolyzer.dm
index ababba60d17..3d288e64702 100644
--- a/code/game/machinery/electrolyzer.dm
+++ b/code/game/machinery/electrolyzer.dm
@@ -64,7 +64,7 @@
. += "electrolyzer-open"
/obj/machinery/electrolyzer/process()
- if(!is_operational() && on)
+ if(!is_operational && on)
on = FALSE
if(!on)
return PROCESS_KILL
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 13af99cb335..00c0cd2e5a3 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -124,7 +124,7 @@
..()
/obj/machinery/firealarm/proc/alarm(mob/user)
- if(!is_operational() || (last_alarm+FIREALARM_COOLDOWN > world.time))
+ if(!is_operational || (last_alarm+FIREALARM_COOLDOWN > world.time))
return
last_alarm = world.time
var/area/A = get_area(src)
@@ -134,7 +134,7 @@
log_game("[user] triggered a fire alarm at [COORD(src)]")
/obj/machinery/firealarm/proc/reset(mob/user)
- if(!is_operational())
+ if(!is_operational)
return
var/area/A = get_area(src)
A.firereset(src)
@@ -226,7 +226,7 @@
if(buildstage == 1)
if(machine_stat & BROKEN)
to_chat(user, "You remove the destroyed circuit.")
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
else
to_chat(user, "You pry out the circuit.")
new /obj/item/electronics/firealarm(user.loc)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index 6a839bd61e5..e69deb67508 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -84,7 +84,7 @@ The console is located at computer/gulag_teleporter.dm
return
-/obj/machinery/gulag_teleporter/relaymove(mob/user)
+/obj/machinery/gulag_teleporter/relaymove(mob/living/user, direction)
if(user.stat != CONSCIOUS)
return
if(locked)
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 2bd531a7c73..d88f7c7e8ab 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -155,7 +155,7 @@
return TRUE
/obj/machinery/harvester/default_pry_open(obj/item/I) //wew
- . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR //We removed is_operational() here
+ . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR //We removed is_operational here
if(.)
I.play_tool_sound(src, 50)
visible_message("[usr] pries open \the [src].", "You pry open [src].")
@@ -180,7 +180,7 @@
if (!state_open && user == occupant)
container_resist_act(user)
-/obj/machinery/harvester/relaymove(mob/user)
+/obj/machinery/harvester/relaymove(mob/living/user, direction)
if (!state_open)
container_resist_act(user)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 31114666c57..034495961a4 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -109,7 +109,7 @@ Possible to do for anyone motivated enough:
/obj/machinery/holopad/tutorial/attack_hand(mob/user)
if(!istype(user))
return
- if(user.incapacitated() || !is_operational())
+ if(user.incapacitated() || !is_operational)
return
if(replay_mode)
replay_stop()
@@ -200,7 +200,7 @@ Possible to do for anyone motivated enough:
return ..()
/obj/machinery/holopad/ui_status(mob/user)
- if(!is_operational())
+ if(!is_operational)
return UI_CLOSE
if(outgoing_call && !calling)
return UI_CLOSE
@@ -357,7 +357,7 @@ Possible to do for anyone motivated enough:
if(!istype(AI))
AI = null
- if(!is_operational() || !validate_user(master))
+ if(!is_operational || !validate_user(master))
clear_holo(master)
if(outgoing_call)
@@ -387,7 +387,7 @@ Possible to do for anyone motivated enough:
if(!istype(AI))
AI = null
- if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it
+ if(is_operational && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it
if (AI && istype(AI.current, /obj/machinery/holopad))
to_chat(user, "ERROR: \black Image feed in progress.")
return
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index 7aba0d2a691..226e5dfba15 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -188,7 +188,7 @@
"You successfully break out of [src]!")
open_machine()
-/obj/machinery/hypnochair/relaymove(mob/user)
+/obj/machinery/hypnochair/relaymove(mob/living/user, direction)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
to_chat(user, "[src]'s door won't budge!")
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index 91c188188ef..a7acffe21c4 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -39,7 +39,7 @@
/obj/machinery/limbgrower/ui_interact(mob/user)
. = ..()
- if(!is_operational())
+ if(!is_operational)
return
var/dat = main_win(user)
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 77f35944433..0b2f4f5db77 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -59,7 +59,7 @@
return
/obj/machinery/medical_kiosk/update_icon_state()
- if(is_operational())
+ if(is_operational)
icon_state = "kiosk_off"
else
icon_state = "kiosk"
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index fea03c25954..04fc034ff8d 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -733,7 +733,7 @@ GLOBAL_LIST_EMPTY(allCasters)
return
to_chat(user, "You repair [src].")
obj_integrity = max_integrity
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
update_icon()
else
to_chat(user, "[src] does not need repairs.")
diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm
index dc319e665a2..23f252e1a66 100644
--- a/code/game/machinery/prisonlabor.dm
+++ b/code/game/machinery/prisonlabor.dm
@@ -11,7 +11,7 @@
/obj/machinery/plate_press/update_icon()
. = ..()
- if(!is_operational())
+ if(!is_operational)
icon_state = "offline"
else if(pressing)
icon_state = "loop"
@@ -25,7 +25,7 @@
. = ..()
/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, params)
- if(!is_operational())
+ if(!is_operational)
to_chat(user, "[src] has to be on to do this!")
return FALSE
if(current_plate)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index b3dbaab0a09..8cdbcb59b3c 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -11,12 +11,17 @@
state_open = TRUE
circuit = /obj/item/circuitboard/machine/cyborgrecharger
occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human)
+ processing_flags = NONE
var/recharge_speed
var/repairs
+
/obj/machinery/recharge_station/Initialize()
. = ..()
update_icon()
+ if(is_operational)
+ begin_processing()
+
/obj/machinery/recharge_station/RefreshParts()
recharge_speed = 0
@@ -35,15 +40,20 @@
if(repairs)
. += "[src] has been upgraded to support automatic repairs."
-/obj/machinery/recharge_station/process()
- if(!is_operational())
- return
+/obj/machinery/recharge_station/on_set_is_operational(old_value)
+ if(old_value) //Turned off
+ end_processing()
+ else //Turned on
+ begin_processing()
+
+
+/obj/machinery/recharge_station/process()
if(occupant)
process_occupant()
return 1
-/obj/machinery/recharge_station/relaymove(mob/user)
+/obj/machinery/recharge_station/relaymove(mob/living/user, direction)
if(user.stat)
return
open_machine()
@@ -89,7 +99,7 @@
add_fingerprint(occupant)
/obj/machinery/recharge_station/update_icon_state()
- if(is_operational())
+ if(is_operational)
if(state_open)
icon_state = "borgcharger0"
else
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index e7c3f2d9d10..9a9da90bdf0 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -368,13 +368,13 @@
to_chat(user, "You start re-attaching the top section of [src]...")
if(I.use_tool(src, user, 30, volume=50))
to_chat(user, "You re-attach the top section of [src].")
- machine_stat &= ~MAINT
+ set_machine_stat(machine_stat & ~MAINT)
icon_state = "idle"
else
to_chat(user, "You start welding the top section from [src]...")
if(I.use_tool(src, user, 30, volume=50))
to_chat(user, "You removed the top section of [src].")
- machine_stat |= MAINT
+ set_machine_stat(machine_stat | MAINT)
icon_state = "open"
/obj/machinery/roulette/proc/shock(mob/user, prb)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index a6109198188..bba702a85df 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -199,7 +199,7 @@
return
coil.use(1)
obj_integrity = max_integrity
- machine_stat &= ~BROKEN
+ set_machine_stat(machine_stat & ~BROKEN)
to_chat(user, "You repair \the [src].")
update_icon()
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 73d379324a9..43022f0c058 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -70,7 +70,7 @@
. += "sheater-open"
/obj/machinery/space_heater/process()
- if(!on || !is_operational())
+ if(!on || !is_operational)
if (on) // If it's broken, turn it off too
on = FALSE
return PROCESS_KILL
diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm
index f7478289e5a..028bbfe0aa3 100644
--- a/code/game/machinery/stasis.dm
+++ b/code/game/machinery/stasis.dm
@@ -66,7 +66,7 @@
. = ..()
/obj/machinery/stasis/proc/stasis_running()
- return stasis_enabled && is_operational()
+ return stasis_enabled && is_operational
/obj/machinery/stasis/update_icon_state()
if(machine_stat & BROKEN)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 061045cbdaf..c52a5bccbe3 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -181,7 +181,7 @@
/obj/machinery/suit_storage_unit/power_change()
. = ..()
- if(!is_operational() && state_open)
+ if(!is_operational && state_open)
open_machine()
dump_contents()
update_icon()
@@ -212,7 +212,7 @@
if(!state_open)
to_chat(user, "The unit's doors are shut!")
return
- if(!is_operational())
+ if(!is_operational)
to_chat(user, "The unit is not operational!")
return
if(occupant || helmet || suit || storage)
@@ -323,7 +323,7 @@
if(electrocute_mob(user, src, src, 1, TRUE))
return 1
-/obj/machinery/suit_storage_unit/relaymove(mob/user)
+/obj/machinery/suit_storage_unit/relaymove(mob/living/user, direction)
if(locked)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
@@ -366,7 +366,7 @@
open_machine()
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
- if(state_open && is_operational())
+ if(state_open && is_operational)
if(istype(I, /obj/item/clothing/suit))
if(suit)
to_chat(user, "The unit already contains a suit!.")
@@ -424,7 +424,7 @@
/obj/machinery/suit_storage_unit/default_pry_open(obj/item/I)//needs to check if the storage is locked.
- . = !(state_open || panel_open || is_operational() || locked || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
+ . = !(state_open || panel_open || is_operational || locked || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR
if(.)
I.play_tool_sound(src, 50)
visible_message("[usr] pries open \the [src].", "You pry open \the [src].")
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index a2cf4cb71ed..edeec36ef10 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -10,7 +10,6 @@
anchored = FALSE
density = TRUE
layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS
- machine_stat = 0
verb_say = "states"
var/cooldown = 0
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index af687355b2b..ecb464acbbe 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -146,9 +146,9 @@ GLOBAL_LIST_EMPTY(telecomms_list)
if(. & EMP_PROTECT_SELF)
return
if(prob(100/severity) && !(machine_stat & EMPED))
- machine_stat |= EMPED
+ set_machine_stat(machine_stat | EMPED)
var/duration = (300 * 10)/severity
addtimer(CALLBACK(src, .proc/de_emp), rand(duration - 20, duration + 20))
/obj/machinery/telecomms/proc/de_emp()
- machine_stat &= ~EMPED
+ set_machine_stat(machine_stat & ~EMPED)
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 66e5e470ef3..1b5f1800b61 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -269,7 +269,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
new /obj/item/restraints/handcuffs(loc)
..()
-/obj/machinery/washing_machine/relaymove(mob/user)
+/obj/machinery/washing_machine/relaymove(mob/living/user, direction)
container_resist_act(user)
/obj/machinery/washing_machine/container_resist_act(mob/living/user)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 378c8905c4e..582b218e587 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -570,7 +570,7 @@
return FALSE
-/obj/mecha/relaymove(mob/user,direction)
+/obj/mecha/relaymove(mob/living/user, direction)
if(completely_disabled)
return
if(!direction)
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 95e17007b98..9cc9663cd44 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -125,6 +125,7 @@
setDir(pick(1,2,4,8))
icon_state += "-old"
add_blood_DNA(list("Non-human DNA" = random_blood_type()))
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10)
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index f504e84acf2..55e2fef54cb 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -159,6 +159,8 @@
/obj/effect/decal/cleanable/vomit/old/Initialize(mapload, list/datum/disease/diseases)
. = ..()
icon_state += "-old"
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10)
+
/obj/effect/decal/cleanable/chem_pile
name = "chemical pile"
@@ -238,3 +240,15 @@
desc = "Torn pieces of cardboard and paper, left over from a package."
icon = 'icons/obj/objects.dmi'
icon_state = "paper_shreds"
+
+/obj/effect/decal/cleanable/garbage
+ name = "decomposing garbage"
+ desc = "A split open garbage bag, its stinking content seems to be partially liquified. Yuck!"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "garbage"
+ layer = OBJ_LAYER //To display the decal over wires.
+ beauty = -150
+
+/obj/effect/decal/cleanable/garbage/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 15)
diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm
index 3722218113b..70213a24435 100644
--- a/code/game/objects/effects/spawners/bundle.dm
+++ b/code/game/objects/effects/spawners/bundle.dm
@@ -195,3 +195,14 @@
/obj/item/clothing/head/fedora/beige,
/obj/item/clothing/under/suit/beige,
/obj/item/clothing/shoes/laceup)
+
+/obj/effect/spawner/bundle/hobo_squat
+ name = "hobo squat spawner"
+ items = list(/obj/structure/bed/maint,
+ /obj/effect/spawner/scatter/grime,
+ /obj/effect/spawner/lootdrop/maint_drugs)
+
+/obj/effect/spawner/bundle/moisture_trap
+ name = "moisture trap spawner"
+ items = list(/obj/effect/spawner/scatter/moisture,
+ /obj/structure/moisture_trap)
diff --git a/code/game/objects/effects/spawners/decals.dm b/code/game/objects/effects/spawners/decals.dm
new file mode 100644
index 00000000000..f8f2d19d74a
--- /dev/null
+++ b/code/game/objects/effects/spawners/decals.dm
@@ -0,0 +1,15 @@
+///This spawner can spawn either a swabbable or non-swabble decal, the purpose of this is provide swabbing spots that cannot be rushed every round using map knowledge.
+/obj/effect/spawner/lootdrop/gross_decal_spawner
+ name = "gross decal spawner"
+ icon_state = "random_trash"
+ loot = list(
+ /obj/effect/decal/cleanable/garbage = 15,
+ /obj/effect/decal/cleanable/vomit/old = 15,
+ /obj/effect/decal/cleanable/blood/gibs/old = 15,
+ /obj/effect/decal/cleanable/insectguts = 5,
+ /obj/effect/decal/cleanable/greenglow/ecto = 5,
+ /obj/effect/decal/cleanable/wrapping = 5,
+ /obj/effect/decal/cleanable/plastic = 5,
+ /obj/effect/decal/cleanable/glass = 5,
+ /obj/effect/decal/cleanable/dirt = 30
+ )
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 0e33084580d..8bb94375d4e 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -131,6 +131,70 @@
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
)
+/obj/effect/spawner/lootdrop/garbage_spawner
+ name = "garbage_spawner"
+ loot = list(/obj/effect/spawner/lootdrop/food_packaging = 56,
+ /obj/item/trash/can = 8,
+ /obj/item/shard = 8,
+ /obj/effect/spawner/lootdrop/botanical_waste = 8,
+ /obj/effect/spawner/lootdrop/cigbutt = 8,
+ /obj/item/reagent_containers/syringe = 5,
+ /obj/item/reagent_containers/food/snacks/deadmouse = 2,
+ /obj/item/light/tube/broken = 3,
+ /obj/item/light/tube/broken = 1,
+ /obj/item/trash/candle = 1)
+
+/obj/effect/spawner/lootdrop/cigbutt
+ name = "cigarette butt spawner"
+ loot = list(/obj/item/cigbutt = 65,
+ /obj/item/cigbutt/roach = 20,
+ /obj/item/cigbutt/cigarbutt = 15)
+
+/obj/effect/spawner/lootdrop/food_packaging
+ name = "food packaging spawner"
+ loot = list(/obj/item/trash/raisins = 20,
+ /obj/item/trash/cheesie = 10,
+ /obj/item/trash/candy = 10,
+ /obj/item/trash/chips = 10,
+ /obj/item/trash/sosjerky = 10,
+ /obj/item/trash/pistachios = 10,
+ /obj/item/trash/boritos = 8,
+ /obj/item/trash/can/food/beans = 6,
+ /obj/item/trash/popcorn = 5,
+ /obj/item/trash/energybar = 5,
+ /obj/item/trash/can/food/peaches/maint = 4,
+ /obj/item/trash/semki = 2)
+
+/obj/effect/spawner/lootdrop/botanical_waste
+ name = "botanical waste spawner"
+ loot = list(/obj/item/grown/bananapeel = 60,
+ /obj/item/grown/corncob = 30,
+ /obj/item/reagent_containers/food/snacks/grown/bungopit = 10)
+
+/obj/effect/spawner/lootdrop/refreshing_beverage
+ name = "good soda spawner"
+ loot = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 15,
+ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 15,
+ /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 10,
+ /obj/item/reagent_containers/food/drinks/beer/light = 10,
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 5,
+ /obj/item/reagent_containers/food/drinks/soda_cans/cola = 5)
+
+/obj/effect/spawner/lootdrop/maint_drugs
+ name = "maint drugs spawner"
+ loot = list(/obj/item/reagent_containers/food/drinks/bottle/hooch = 50,
+ /obj/item/clothing/mask/cigarette/rollie/cannabis = 15,
+ /obj/item/clothing/mask/cigarette/rollie/mindbreaker = 5,
+ /obj/item/reagent_containers/syringe = 15,
+ /obj/item/cigbutt/roach = 15)
+
/obj/effect/spawner/lootdrop/grille_or_trash
name = "maint grille or trash spawner"
loot = list(/obj/structure/grille = 5,
diff --git a/code/game/objects/effects/spawners/lootsite.dm b/code/game/objects/effects/spawners/lootsite.dm
new file mode 100644
index 00000000000..f4c33bafbe7
--- /dev/null
+++ b/code/game/objects/effects/spawners/lootsite.dm
@@ -0,0 +1,22 @@
+///this spawner usually spawns a boring crate, but has a chance to replace the crate with "loot crate" with a different loot table or a decorative site.
+/obj/effect/loot_site_spawner
+ icon = 'icons/effects/landmarks_static.dmi'
+ icon_state = "loot_site"
+ ///This is the loot table for the spawner. Try to make sure the weights add up to 1000, so it is easy to understand.
+ var/list/loot_table = list(/obj/structure/closet/crate/maint = 765,
+ /obj/structure/closet/crate/trashcart/filled = 80,
+ /obj/effect/spawner/bundle/moisture_trap = 50,
+ /obj/effect/spawner/bundle/hobo_squat = 35,
+ /obj/structure/closet/mini_fridge = 40,
+ /obj/effect/spawner/lootdrop/gross_decal_spawner = 30)
+
+
+/obj/effect/loot_site_spawner/Initialize()
+ ..()
+ if(!length(loot_table))
+ return INITIALIZE_HINT_QDEL
+
+ var/spawned_object = pickweight(loot_table)
+ new spawned_object(get_turf(src))
+
+ return INITIALIZE_HINT_QDEL
diff --git a/code/game/objects/effects/spawners/scatter.dm b/code/game/objects/effects/spawners/scatter.dm
new file mode 100644
index 00000000000..1318a0943b5
--- /dev/null
+++ b/code/game/objects/effects/spawners/scatter.dm
@@ -0,0 +1,55 @@
+///This spawner scatters the spawned stuff around where it is placed.
+/obj/effect/spawner/scatter
+ ///determines how many things to scatter
+ var/max_spawns = 3
+ ///determines how big of a range we should scatter things in.
+ var/radius = 2
+ ///This weighted list acts as the loot table for the spawner
+ var/list/loot_table
+
+/obj/effect/spawner/scatter/Initialize()
+ ..()
+ if(!length(loot_table))
+ return INITIALIZE_HINT_QDEL
+
+ var/list/candidate_locations = list()
+
+ for(var/turf/turf_in_view in oview(radius, get_turf(src)))
+ if(!turf_in_view.density)
+
+ candidate_locations += turf_in_view
+
+ if(!candidate_locations.len)
+ return INITIALIZE_HINT_QDEL
+
+ var/loot_spawned = 0
+ while((max_spawns-loot_spawned) && candidate_locations.len)
+ var/spawned_thing = pickweight(loot_table)
+ while(islist(spawned_thing))
+ spawned_thing = pickweight(spawned_thing)
+ new spawned_thing(pick_n_take(candidate_locations))
+ loot_spawned++
+
+ return INITIALIZE_HINT_QDEL
+
+///This spawner will scatter garbage around a dirty site.
+/obj/effect/spawner/scatter/grime
+ name = "trash and grime scatterer"
+ max_spawns = 5
+ loot_table = list(/obj/effect/spawner/lootdrop/garbage_spawner = 30,
+ /mob/living/simple_animal/hostile/cockroach = 25,
+ /obj/effect/decal/cleanable/garbage = 20,
+ /obj/effect/decal/cleanable/vomit/old = 15,
+ /obj/effect/spawner/lootdrop/cigbutt = 10)
+
+///This spawner will scatter water related items around a moist site.
+/obj/effect/spawner/scatter/moisture
+ max_spawns = 2
+ radius = 1
+ loot_table = list(/obj/item/clothing/head/cone = 35,
+ /obj/item/clothing/suit/caution = 15,
+ /mob/living/simple_animal/hostile/retaliate/frog = 10,
+ /obj/item/reagent_containers/glass/rag = 10,
+ /obj/item/reagent_containers/glass/bucket = 10,
+ /obj/effect/decal/cleanable/blood/old = 10,
+ /obj/structure/mopbucket = 10)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8da739a78ce..0c2f08c6165 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -931,7 +931,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
dropped(M, FALSE)
return ..()
-/obj/item/proc/embedded(atom/embedded_target)
+/obj/item/proc/embedded(atom/embedded_target, obj/item/bodypart/part)
return
/obj/item/proc/unembedded()
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 9d8d9b48634..d41036342af 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -925,16 +925,22 @@ RLD
var/list/name_to_type = list()
///All info for construction
var/list/machinery_data = list("cost" = list())
+ ///This list that holds all the plumbing design types the plumberer can construct. Its purpose is to make it easy to make new plumberer subtypes with a different selection of machines.
+ var/list/plumbing_design_types
+
+/obj/item/construction/plumbing/Initialize(mapload)
+ . = ..()
+ set_plumbing_designs()
/obj/item/construction/plumbing/attack_self(mob/user)
..()
if(!choices.len)
- for(var/A in GLOB.plumbing_constructables)
+ for(var/A in plumbing_design_types)
var/obj/machinery/plumbing/M = A
choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state)))
name_to_type[initial(M.name)] = M
- machinery_data["cost"][A] = GLOB.plumbing_constructables[A]
+ machinery_data["cost"][A] = plumbing_design_types[A]
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
@@ -944,6 +950,26 @@ RLD
playsound(src, 'sound/effects/pop.ogg', 50, FALSE)
to_chat(user, "You change [name]s blueprint to '[choice]'.")
+///Set the list of designs this plumbing rcd can make
+/obj/item/construction/plumbing/proc/set_plumbing_designs()
+ plumbing_design_types = list(
+ /obj/machinery/plumbing/input = 5,
+ /obj/machinery/plumbing/output = 5,
+ /obj/machinery/plumbing/tank = 20,
+ /obj/machinery/plumbing/acclimator = 10,
+ /obj/machinery/plumbing/bottler = 50,
+ /obj/machinery/plumbing/disposer = 10,
+ /obj/machinery/plumbing/fermenter = 30,
+ /obj/machinery/plumbing/filter = 5,
+ /obj/machinery/plumbing/grinder_chemical = 30,
+ /obj/machinery/plumbing/pill_press = 20,
+ /obj/machinery/plumbing/liquid_pump = 35,
+ /obj/machinery/plumbing/reaction_chamber = 15,
+ /obj/machinery/plumbing/splitter = 5,
+ /obj/machinery/plumbing/synthesizer = 15,
+ /obj/machinery/plumbing/sender = 20
+)
+
///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type
/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user)
if(!machinery_data || !isopenturf(A))
@@ -982,6 +1008,27 @@ RLD
else
create_machine(A, user)
+/obj/item/construction/plumbing/research
+ name = "research plumbing constructor"
+ desc = "A type of plumbing constructor designed to rapidly deploy the machines needed to conduct cytological research."
+ icon_state = "plumberer_sci"
+ has_ammobar = TRUE
+
+/obj/item/construction/plumbing/research/set_plumbing_designs()
+ plumbing_design_types = list(
+ /obj/machinery/plumbing/input = 5,
+ /obj/machinery/plumbing/output = 5,
+ /obj/machinery/plumbing/tank = 20,
+ /obj/machinery/plumbing/acclimator = 10,
+ /obj/machinery/plumbing/filter = 5,
+ /obj/machinery/plumbing/grinder_chemical = 30,
+ /obj/machinery/plumbing/reaction_chamber = 15,
+ /obj/machinery/plumbing/splitter = 5,
+ /obj/machinery/plumbing/disposer = 10,
+ /obj/machinery/plumbing/growing_vat = 20
+)
+
+
/obj/item/rcd_upgrade
name = "RCD advanced design disk"
desc = "It seems to be empty."
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 2825af993c5..2f2418150d4 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -752,7 +752,7 @@ GLOBAL_LIST_EMPTY(PDAs)
else
L = get(src, /mob/living/silicon)
- if(L && L.stat != UNCONSCIOUS)
+ if(L && (L.stat == CONSCIOUS || L.stat == SOFT_CRIT))
var/reply = "(Reply)"
var/hrefstart
var/hrefend
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 632019f5608..91742f60e5e 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -154,7 +154,7 @@
. = ..()
master.disrupt()
-/obj/effect/dummy/chameleon/relaymove(mob/user, direction)
+/obj/effect/dummy/chameleon/relaymove(mob/living/user, direction)
if(isspaceturf(loc) || !direction)
return //No magical space movement!
diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm
index af0ba3273e3..0af5510a2c7 100644
--- a/code/game/objects/items/food/bread.dm
+++ b/code/game/objects/items/food/bread.dm
@@ -51,7 +51,7 @@
name = "meatbread loaf"
desc = "The culinary base of every self-respecting eloquen/tg/entleman."
icon_state = "meatbread"
- food_reagents = list(/datum/reagent/consumable/nutriment = 35, /datum/reagent/consumable/nutriment/vitamin = 15)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/vitamin = 15, /datum/reagent/consumable/nutriment/protein = 17)
tastes = list("bread" = 10, "meat" = 10)
foodtypes = GRAIN | MEAT
@@ -69,7 +69,7 @@
name = "xenomeatbread loaf"
desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical."
icon_state = "xenomeatbread"
- food_reagents = list(/datum/reagent/consumable/nutriment = 35, /datum/reagent/consumable/nutriment/vitamin = 15)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/vitamin = 15, /datum/reagent/consumable/nutriment/protein = 24)
tastes = list("bread" = 10, "acid" = 10)
foodtypes = GRAIN | MEAT
@@ -81,14 +81,14 @@
name = "xenomeatbread slice"
desc = "A slice of delicious meatbread. Extra Heretical."
icon_state = "xenobreadslice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/nutriment/protein = 5)
foodtypes = GRAIN | MEAT
/obj/item/food/bread/spidermeat
name = "spider meat loaf"
desc = "Reassuringly green meatloaf made from spider meat."
icon_state = "spidermeatbread"
- food_reagents = list(/datum/reagent/consumable/nutriment = 35, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 15)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 15, /datum/reagent/consumable/nutriment/protein = 17)
tastes = list("bread" = 10, "cobwebs" = 5)
foodtypes = GRAIN | MEAT | TOXIC
@@ -100,7 +100,7 @@
name = "spider meat bread slice"
desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
icon_state = "xenobreadslice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtypes = GRAIN | MEAT | TOXIC
/obj/item/food/bread/banana
@@ -126,7 +126,7 @@
name = "Tofubread"
desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
icon_state = "tofubread"
- food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/vitamin = 15)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 15, /datum/reagent/consumable/nutriment/protein = 13)
tastes = list("bread" = 10, "tofu" = 10)
foodtypes = GRAIN | VEGETABLES
@@ -138,14 +138,14 @@
name = "tofubread slice"
desc = "A slice of delicious tofubread."
icon_state = "tofubreadslice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtypes = GRAIN | VEGETABLES
/obj/item/food/bread/creamcheese
name = "cream cheese bread"
desc = "Yum yum yum!"
icon_state = "creamcheesebread"
- food_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/vitamin = 10)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 10)
tastes = list("bread" = 10, "cheese" = 10)
foodtypes = GRAIN | DAIRY
@@ -157,7 +157,7 @@
name = "cream cheese bread slice"
desc = "A slice of yum!"
icon_state = "creamcheesebreadslice"
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
/obj/item/food/bread/mimana
name = "mimana bread"
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index d317655de4f..7eaa638fc14 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -57,12 +57,12 @@
M.retaliate(user)
if(!C.handcuffed)
- if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())
+ if(C.canBeHandcuffed())
C.visible_message("[user] is trying to put [src.name] on [C]!", \
"[user] is trying to put [src.name] on you!")
playsound(loc, cuffsound, 30, TRUE, -2)
- if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()))
+ if(do_mob(user, C, 30) && C.canBeHandcuffed())
if(iscyborg(user))
apply_cuffs(C, user, TRUE)
else
@@ -269,7 +269,7 @@
var/mob/living/carbon/C = L
if(C.mobility_flags & MOBILITY_STAND)
def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- if(!C.legcuffed && C.get_num_legs(FALSE) >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
+ if(!C.legcuffed && C.num_legs >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
C.legcuffed = src
forceMove(C)
C.update_equipment_speed_mods()
@@ -339,7 +339,7 @@
* * C - the carbon that we will try to ensnare
*/
/obj/item/restraints/legcuffs/bola/proc/ensnare(mob/living/carbon/C)
- if(!C.legcuffed && C.get_num_legs(FALSE) >= 2)
+ if(!C.legcuffed && C.num_legs >= 2)
visible_message("\The [src] ensnares [C]!")
C.legcuffed = src
forceMove(C)
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 013bc28210f..c72ce45e969 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -70,7 +70,7 @@
else
. += "[src] is latched closed."
-/obj/item/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
+/obj/item/his_grace/relaymove(mob/living/user, direction) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
if(!awakened)
user.forceMove(get_turf(src))
user.visible_message("[user] scrambles out of [src]!", "You climb out of [src]!")
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 7670723de5d..6e02c864be1 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -463,7 +463,7 @@
hitsound = 'sound/weapons/rapierhit.ogg'
var/possessed = FALSE
-/obj/item/nullrod/scythe/talking/relaymove(mob/user)
+/obj/item/nullrod/scythe/talking/relaymove(mob/living/user, direction)
return //stops buckled message spam for the ghost.
/obj/item/nullrod/scythe/talking/attack_self(mob/living/user)
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index 3893cc997b4..ac238a85a33 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -103,7 +103,7 @@
return FALSE
if(!victim.client)
to_chat(user, "[src] refuses to attach to a non-sapient creature!")
- if(victim.stat != CONSCIOUS || !victim.get_num_legs())
+ if(victim.stat != CONSCIOUS || !victim.usable_legs)
to_chat(user, "[src] refuses to attach to someone incapable of using it!")
user.temporarilyRemoveItemFromInventory(src, TRUE)
. = FALSE
diff --git a/code/game/objects/items/implants/implant_exile.dm b/code/game/objects/items/implants/implant_exile.dm
index 9b682063389..3a1bf7f413e 100644
--- a/code/game/objects/items/implants/implant_exile.dm
+++ b/code/game/objects/items/implants/implant_exile.dm
@@ -4,19 +4,56 @@
/obj/item/implant/exile
name = "exile implant"
desc = "Prevents you from returning from away missions."
- activated = 0
+ activated = FALSE
/obj/item/implant/exile/get_data()
var/dat = {"Implant Specifications:
Name: Nanotrasen Employee Exile Implant
- Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
"}
+ Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant.
"}
return dat
+
+///Used to help the staff of the space hotel resist the urge to use the space hotel's incredibly alluring roundstart teleporter to ignore their flavor/greeting text and come to the station.
+/obj/item/implant/exile/noteleport
+ name = "anti-teleportation implant"
+ desc = "Uses impressive bluespace grounding techniques to deny the person implanted by this implant the ability to teleport (or be teleported). Used by certain slavers (or particularly strict employers) to keep their slaves from using teleporters to escape their grasp."
+
+/obj/item/implant/exile/noteleport/get_data()
+ var/dat = {"Implant Specifications:
+ Name: Anti-Teleportation Implant
+ Implant Details: Keeps the implantee from using most teleportation devices. In addition, it spoofs the implant signature of an exile implant to keep the implantee from using certain gateway systems.
"}
+ return dat
+
+/obj/item/implant/exile/noteleport/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
+ . = ..()
+ if(!. || !isliving(target))
+ return FALSE
+ var/mob/living/living_target = target
+ ADD_TRAIT(living_target, TRAIT_NO_TELEPORT, "implant")
+ return TRUE
+
+/obj/item/implant/exile/noteleport/removed(mob/target, silent = FALSE, special = FALSE)
+ . = ..()
+ if(!. || !isliving(target))
+ return FALSE
+ var/mob/living/living_target = target
+ REMOVE_TRAIT(living_target, TRAIT_NO_TELEPORT, "implant")
+ return TRUE
+
/obj/item/implanter/exile
name = "implanter (exile)"
imp_type = /obj/item/implant/exile
+/obj/item/implanter/exile/noteleport
+ name = "implanter (anti-teleportation)"
+ imp_type = /obj/item/implant/exile/noteleport
+
/obj/item/implantcase/exile
name = "implant case - 'Exile'"
desc = "A glass case containing an exile implant."
imp_type = /obj/item/implant/exile
+
+/obj/item/implantcase/exile/noteleport
+ name = "implant case - 'Anti-Teleportation'"
+ desc = "A glass case containing an anti-teleportation implant."
+ imp_type = /obj/item/implant/exile/noteleport
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 7f6454e66e7..193049d998a 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -134,7 +134,7 @@
"You successfully break out of [src]!")
open_machine()
-/obj/machinery/implantchair/relaymove(mob/user)
+/obj/machinery/implantchair/relaymove(mob/living/user, direction)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
to_chat(user, "[src]'s door won't budge!")
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index a54d7870614..299032b1deb 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -78,6 +78,14 @@
to_chat(user, "You are unable to fit your [name] into the [J.name].")
return
+/obj/item/storage/bag/trash/filled
+
+/obj/item/storage/bag/trash/filled/PopulateContents()
+ . = ..()
+ for(var/i in 1 to rand(1, 7))
+ new /obj/effect/spawner/lootdrop/garbage_spawner(src)
+ update_icon_state()
+
/obj/item/storage/bag/trash/bluespace
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 49e7e2c6a59..43d28beb709 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -1386,3 +1386,21 @@
/obj/item/storage/box/skillchips/engineering/PopulateContents()
new/obj/item/skillchip/job/engineer(src)
new/obj/item/skillchip/job/engineer(src)
+
+/obj/item/storage/box/swab
+ name = "box of microbiological swabs"
+ desc = "Contains a number of sterile swabs for collecting microbiological samples."
+ illustration = "swab"
+
+/obj/item/storage/box/swab/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/swab(src)
+
+/obj/item/storage/box/petridish
+ name = "box of petridishes"
+ desc = "This box purports to contain a number of high rim petridishes."
+ illustration = "petridish"
+
+/obj/item/storage/box/petridish/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/petri_dish(src)
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 9c6c23ebbcb..ae0d17c7456 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -179,7 +179,7 @@
desc = "Seems kind of... fishy."
name = "Cayenne's bed"
anchored = TRUE
-
+
/obj/structure/bed/dogbed/lia
desc = "Seems kind of... fishy."
name = "Lia's bed"
@@ -212,3 +212,13 @@
name = "resting contraption"
desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
icon_state = "abed"
+
+
+/obj/structure/bed/maint
+ name = "dirty mattress"
+ desc = "An old grubby mattress. You try to not think about what could be the cause of those stains."
+ icon_state = "dirty_mattress"
+
+/obj/structure/bed/maint/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOLD, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 25)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index ae60dde1cae..3eb02423395 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -343,8 +343,8 @@
O.forceMove(T)
return 1
-/obj/structure/closet/relaymove(mob/user)
- if(user.stat || !isturf(loc) || !isliving(user))
+/obj/structure/closet/relaymove(mob/living/user, direction)
+ if(user.stat || !isturf(loc))
return
if(locked)
if(message_cooldown <= world.time)
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 166ea7c6f99..b6a80ee5197 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -21,7 +21,7 @@
var/egged = 0
/obj/structure/closet/cardboard/relaymove(mob/living/user, direction)
- if(!istype(user) || opened || move_delay || user.incapacitated() || !isturf(loc) || !has_gravity(loc))
+ if(opened || move_delay || user.incapacitated() || !isturf(loc) || !has_gravity(loc))
return
move_delay = TRUE
var/oldloc = loc
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index 6c389bc160c..2489563b236 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -109,3 +109,22 @@
new /obj/item/crowbar(src)
new /obj/item/stock_parts/cell(src)
new /obj/item/multitool(src)
+
+/obj/structure/closet/mini_fridge
+ name = "grimy mini-fridge"
+ desc = "A small contraption designed to imbue a few drinks with a pleasant chill. This antiquated unit however seems to serve no purpose other than keeping the roaches company."
+ icon_state = "mini_fridge"
+ icon_welded = "welded_small"
+ max_mob_size = MOB_SIZE_SMALL
+ storage_capacity = 7
+
+/obj/structure/closet/mini_fridge/PopulateContents()
+ . = ..()
+ new /obj/effect/spawner/lootdrop/refreshing_beverage(src)
+ new /obj/effect/spawner/lootdrop/refreshing_beverage(src)
+ if(prob(50))
+ new /obj/effect/spawner/lootdrop/refreshing_beverage(src)
+ if(prob(40))
+ new /obj/item/reagent_containers/food/snacks/pizzaslice/moldy(src)
+ else if(prob(30))
+ new /obj/item/reagent_containers/food/snacks/syndicake(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 7c286dc1a42..489e759b25f 100755
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -27,3 +27,21 @@
new /obj/item/circuitboard/machine/techfab/department/science(src)
new /obj/item/storage/photo_album/rd(src)
new /obj/item/storage/box/skillchips/science(src)
+
+
+/obj/structure/closet/secure_closet/cytology
+ name = "cytology equipment locker"
+ icon_state = "science"
+ req_access = list(ACCESS_RESEARCH)
+
+/obj/structure/closet/secure_closet/cytology/PopulateContents()
+ . = ..()
+ new /obj/item/pushbroom(src)
+ new /obj/item/plunger(src)
+ new /obj/item/storage/bag/bio(src)
+ new /obj/item/storage/box/petridish(src)
+ new /obj/item/stack/ducts/fifty(src)
+ for(var/i in 1 to 2)
+ new /obj/item/biopsy_tool(src)
+ new /obj/item/storage/box/swab(src)
+ new /obj/item/construction/plumbing/research(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 119a8084a58..7af616d6dc6 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -83,6 +83,27 @@
open_sound_volume = 25
close_sound_volume = 50
+/obj/structure/closet/crate/maint
+
+/obj/structure/closet/crate/maint/PopulateContents()
+ . = ..()
+ for(var/i in 1 to rand(2,6))
+ new /obj/effect/spawner/lootdrop/maintenance(src)
+
+/obj/structure/closet/crate/trashcart/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 15)
+
+/obj/structure/closet/crate/trashcart/filled
+
+/obj/structure/closet/crate/trashcart/filled/PopulateContents()
+ . = ..()
+ for(var/i in 1 to rand(7,15))
+ new /obj/effect/spawner/lootdrop/garbage_spawner(src)
+ if(prob(12))
+ new /obj/item/storage/bag/trash/filled(src)
+ new /obj/effect/spawner/scatter/grime(loc)
+
/obj/structure/closet/crate/internals
desc = "An internals crate."
name = "internals crate"
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 17085337550..7b1c4ee5885 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -374,14 +374,14 @@
mob_name = "hotel staff member"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
- objectives = "Cater to visiting guests with your fellow staff. Do not leave your assigned hotel and always remember: The customer is always right!"
+ objectives = "Cater to visiting guests with your fellow staff. Do not leave your assigned hotel. Remember, the customer is always right!"
death = FALSE
roundstart = FALSE
random = TRUE
outfit = /datum/outfit/hotelstaff
short_desc = "You are a staff member of a top-of-the-line space hotel!"
- flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and make sure the manager doesn't fire you."
- important_info = "DON'T leave the hotel"
+ flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests, advertise the hotel, and make sure the manager doesn't fire you."
+ important_info = "Do NOT leave the hotel, as that is grounds for contract termination."
assignedrole = "Hotel Staff"
/datum/outfit/hotelstaff
@@ -390,7 +390,7 @@
shoes = /obj/item/clothing/shoes/laceup
r_pocket = /obj/item/radio/off
back = /obj/item/storage/backpack
- implants = list(/obj/item/implant/mindshield)
+ implants = list(/obj/item/implant/mindshield, /obj/item/implant/exile/noteleport)
/obj/effect/mob_spawn/human/hotel_staff/security
name = "hotel security sleeper"
@@ -400,7 +400,7 @@
flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \
guests and the staff."
important_info = "Do NOT leave the hotel, as that is grounds for contract termination."
- objectives = "Do not leave your assigned hotel. Try and keep the peace between staff and guests, non-lethal force heavily advised if possible."
+ objectives = "Do not leave your assigned hotel. Try and keep the peace between staff and guests. Using non-lethal force instead of lethal force is heavily advised if possible."
/datum/outfit/hotelstaff/security
name = "Hotel Security"
diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm
new file mode 100644
index 00000000000..9ad6a866e16
--- /dev/null
+++ b/code/game/objects/structures/maintenance.dm
@@ -0,0 +1,101 @@
+/** This structure acts as a source of moisture loving cell lines,
+as well as a location where a hidden item can somtimes be retrieved
+at the cost of risking a vicious bite.**/
+/obj/structure/moisture_trap
+ name = "moisture trap"
+ desc = "A device installed in order to control moisture in poorly ventilated areas.\nThe stagnant water inside basin seems to produce serious biofouling issues when improperly maintained.\nThis unit in particular seems to be teeming with life!\nWho thought mother Gaia could assert herself so vigoriously in this sterile and desolate place?"
+ icon_state = "moisture_trap"
+ anchored = TRUE
+ density = FALSE
+ ///This var stores the hidden item that might be able to be retrieved from the trap
+ var/obj/item/hidden_item
+ ///This var determines if there is a chance to recieve a bite when sticking your hand into the water.
+ var/critter_infested = TRUE
+ var/list/loot = list(
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton = 35,
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 15,
+ /obj/item/trash/can = 15,
+ /obj/item/clothing/head/helmet/skull = 10,
+ /obj/item/restraints/handcuffs = 4,
+ /obj/item/restraints/handcuffs/cable/red = 1,
+ /obj/item/restraints/handcuffs/cable/blue = 1,
+ /obj/item/restraints/handcuffs/cable/green = 1,
+ /obj/item/restraints/handcuffs/cable/pink = 1,
+ /obj/item/restraints/handcuffs/alien = 2,
+ /obj/item/coin/bananium = 9,
+ /obj/item/kitchen/knife/butcher = 5,
+ /obj/item/coin/mythril = 1) //the loot table isn't that great and should probably be improved and expanded later.
+
+
+/obj/structure/moisture_trap/Initialize()
+ . = ..()
+ if(prob(40))
+ critter_infested = FALSE
+ if(prob(75))
+ var/picked_item = pickweight(loot)
+ hidden_item = new picked_item(src)
+ loot = null
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOIST, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 20)
+
+/obj/structure/moisture_trap/Destroy()
+ if(hidden_item)
+ QDEL_NULL(hidden_item)
+ return ..()
+
+///This proc checks if we are able to reach inside the trap to interact with it.
+/obj/structure/moisture_trap/proc/CanReachInside(mob/user)
+ if(!isliving(user))
+ return FALSE
+ var/mob/living/living_user = user
+ if((living_user.mobility_flags & MOBILITY_STAND) && ishuman(living_user)) //I dont think monkeys can crawl on command.
+ return FALSE
+ return TRUE
+
+/obj/structure/moisture_trap/attack_hand(mob/user)
+ . = ..()
+ if(iscyborg(user) || isalien(user))
+ return
+ if(!CanReachInside(user))
+ to_chat(user, "You need to lie down to reach into [src].")
+ return
+ to_chat(user, "You reach down into the cold water of the basin.")
+ if(!do_after(user, 2 SECONDS, target = src))
+ return
+ if(hidden_item)
+ user.put_in_hands(hidden_item)
+ to_chat(user, "As you poke around inside [src] you feel the contours of something hidden below the murky waters.\nYou retrieve [hidden_item] from [src].")
+ hidden_item = null
+ return
+ if(critter_infested && prob(50) && iscarbon(user))
+ var/mob/living/carbon/bite_victim = user
+ var/obj/item/bodypart/affecting = bite_victim.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ if(affecting?.receive_damage(30))
+
+ to_chat(user, "You feel a sharp as an unseen creature sinks it's [pick("fangs", "beak", "proboscis")] into your arm!")
+ bite_victim.update_damage_overlays()
+ playsound(src,'sound/weapons/bite.ogg', 70, TRUE)
+ return
+ to_chat(user, "You find nothing of value...")
+
+/obj/structure/moisture_trap/attackby(obj/item/I, mob/user, params)
+ if(iscyborg(user) || isalien(user) || !CanReachInside(user))
+ return ..()
+ add_fingerprint(user)
+ if(istype(I, /obj/item/reagent_containers))
+ if(istype(I, /obj/item/reagent_containers/food/snacks/monkeycube))
+ var/obj/item/reagent_containers/food/snacks/monkeycube/cube = I
+ cube.Expand()
+ return
+ var/obj/item/reagent_containers/reagent_container = I
+ if(reagent_container.is_open_container())
+ reagent_container.reagents.add_reagent(/datum/reagent/water, min(reagent_container.volume - reagent_container.reagents.total_volume, reagent_container.amount_per_transfer_from_this))
+ to_chat(user, "You fill [reagent_container] from [src].")
+ return
+ if(hidden_item)
+ to_chat(user, "There is already something inside [src].")
+ return
+ if(!user.transferItemToLoc(I, src))
+ to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]!")
+ return
+ hidden_item = I
+ to_chat(user, "You hide [I] inside the basin.")
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index b76a67407b4..73e23b958ea 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -48,7 +48,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/update_icon()
return
-/obj/structure/bodycontainer/relaymove(mob/user)
+/obj/structure/bodycontainer/relaymove(mob/living/user, direction)
if(user.stat || !isturf(loc))
return
if(locked)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index cf1d02b40b8..d57f8388d18 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -632,7 +632,7 @@
. = ..()
if(.)
return
- if(!(user.mobility_flags & MOBILITY_STAND) || user.get_num_legs() < 2)
+ if(!(user.mobility_flags & MOBILITY_STAND) || user.usable_legs < 2)
return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index c923312f336..177ad9cc124 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -178,28 +178,33 @@
/obj/structure/transit_tube_pod/remove_air(amount)
return air_contents.remove(amount)
-/obj/structure/transit_tube_pod/relaymove(mob/mob, direction)
- if(istype(mob) && mob.client)
- if(!moving)
- for(var/obj/structure/transit_tube/station/station in loc)
- if(!station.pod_moving)
- if(direction == turn(station.boarding_dir,180))
- if(station.open_status == STATION_TUBE_OPEN)
- mob.forceMove(loc)
- update_icon()
- else
- station.open_animation()
- else if(direction in station.tube_dirs)
- setDir(direction)
- station.launch_pod()
- return
+/obj/structure/transit_tube_pod/relaymove(mob/living/user, direction)
+ if(!user.client || moving)
+ return
+
+ for(var/obj/structure/transit_tube/station/station in loc)
+ if(station.pod_moving)
+ return
+ if(direction == turn(station.boarding_dir,180))
+ if(station.open_status == STATION_TUBE_OPEN)
+ user.forceMove(loc)
+ update_icon()
+ else
+ station.open_animation()
+ else if(direction in station.tube_dirs)
+ setDir(direction)
+ station.launch_pod()
+ return
+
+ for(var/obj/structure/transit_tube/transit_tube in loc)
+ if(!(dir in transit_tube.tube_dirs))
+ continue
+ if(!transit_tube.has_exit(direction))
+ continue
+ setDir(direction)
+ return
- for(var/obj/structure/transit_tube/TT in loc)
- if(dir in TT.tube_dirs)
- if(TT.has_exit(direction))
- setDir(direction)
- return
/obj/structure/transit_tube_pod/return_temperature()
return air_contents.temperature
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index 9755dcd6551..e1705332786 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -129,6 +129,8 @@
icon_state = "plastitanium_window"
opacity = FALSE
smoothing_flags = SMOOTH_CORNERS
+ smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS)
+ canSmoothWith = null
icon = 'icons/obj/smooth_structures/plastitanium_window.dmi'
/turf/closed/indestructible/opsglass/Initialize()
diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm
index 34697e750b4..68142b1f50d 100644
--- a/code/game/turfs/closed/walls.dm
+++ b/code/game/turfs/closed/walls.dm
@@ -136,7 +136,7 @@
var/obj/item/bodypart/arm = user.hand_bodyparts[user.active_hand_index]
if(!arm)
return
- if(arm.disabled)
+ if(arm.bodypart_disabled)
return
if(prob(hardness))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE)
diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm
index 50d47bb3b52..6677a31d266 100644
--- a/code/game/turfs/open/floor.dm
+++ b/code/game/turfs/open/floor.dm
@@ -275,7 +275,10 @@
PlaceOnTop(/turf/closed/wall)
return TRUE
if(RCD_AIRLOCK)
- if(locate(/obj/machinery/door) in src)
+ for(var/obj/machinery/door/door in src)
+ if(door.sub_door)
+ continue
+ to_chat(user, "There is another door here!")
return FALSE
if(ispath(the_rcd.airlock_type, /obj/machinery/door/window))
to_chat(user, "You build a windoor.")
diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm
index e7d64f796ab..7f771d34c17 100644
--- a/code/modules/NTNet/network.dm
+++ b/code/modules/NTNet/network.dm
@@ -128,7 +128,7 @@
var/obj/machinery/ntnet_relay/n = i
if(zlevel && n.z != zlevel)
continue
- if(n.is_operational())
+ if(n.is_operational)
return TRUE
return FALSE
diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm
index 0fbb9d0bc0b..dc3a1876997 100644
--- a/code/modules/NTNet/relays.dm
+++ b/code/modules/NTNet/relays.dm
@@ -11,8 +11,10 @@
circuit = /obj/item/circuitboard/machine/ntnet_relay
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
- var/enabled = 1 // Set to 0 if the relay was turned off
- var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
+ ///On / off status for the relay machine, toggleable by the user.
+ var/relay_enabled = TRUE
+ ///(D)DoS-attack-related failure causing it not to be operational any longer.
+ var/dos_failure = FALSE
var/list/dos_sources = list() // Backwards reference for qdel() stuff
var/uid
var/static/gl_uid = 1
@@ -23,24 +25,47 @@
var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time.
-// TODO: Implement more logic here. For now it's only a placeholder.
-/obj/machinery/ntnet_relay/is_operational()
- if(machine_stat & (BROKEN | NOPOWER | EMPED))
- return FALSE
- if(dos_failure)
- return FALSE
- if(!enabled)
- return FALSE
- return TRUE
+///Proc called to change the value of the `relay_enabled` variable and append behavior related to its change.
+/obj/machinery/ntnet_relay/proc/set_relay_enabled(new_value)
+ if(new_value == relay_enabled)
+ return
+ . = relay_enabled
+ relay_enabled = new_value
+ if(.) //Turned off
+ set_is_operational(FALSE)
+ else if(!dos_failure && !(machine_stat & (NOPOWER|BROKEN|MAINT))) //Turned on
+ set_is_operational(TRUE)
+
+
+///Proc called to change the value of the `dos_failure` variable and append behavior related to its change.
+/obj/machinery/ntnet_relay/proc/set_dos_failure(new_value)
+ if(new_value == dos_failure)
+ return
+ . = dos_failure
+ dos_failure = new_value
+ if(.) //Failure ended
+ if(relay_enabled && !(machine_stat & (NOPOWER|BROKEN|MAINT)))
+ set_is_operational(TRUE)
+ else //Failure started
+ set_is_operational(FALSE)
+
+
+/obj/machinery/ntnet_relay/on_set_machine_stat(old_value)
+ if(old_value & (NOPOWER|BROKEN|MAINT))
+ if(relay_enabled && !dos_failure && !(machine_stat & (NOPOWER|BROKEN|MAINT))) //From off to on.
+ set_is_operational(TRUE)
+ else if(machine_stat & (NOPOWER|BROKEN|MAINT)) //From on to off.
+ set_is_operational(FALSE)
+
/obj/machinery/ntnet_relay/update_icon_state()
- if(is_operational())
+ if(is_operational)
icon_state = "bus"
else
icon_state = "bus_off"
/obj/machinery/ntnet_relay/process()
- if(is_operational())
+ if(is_operational)
use_power = ACTIVE_POWER_USE
else
use_power = IDLE_POWER_USE
@@ -52,12 +77,12 @@
// If DoS traffic exceeded capacity, crash.
if((dos_overload > dos_capacity) && !dos_failure)
- dos_failure = 1
+ set_dos_failure(TRUE)
update_icon()
SSnetworks.station_network.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
// If the DoS buffer reaches 0 again, restart.
if((dos_overload == 0) && dos_failure)
- dos_failure = 0
+ set_dos_failure(FALSE)
update_icon()
SSnetworks.station_network.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
..()
@@ -70,7 +95,7 @@
/obj/machinery/ntnet_relay/ui_data(mob/user)
var/list/data = list()
- data["enabled"] = enabled
+ data["enabled"] = relay_enabled
data["dos_capacity"] = dos_capacity
data["dos_overload"] = dos_overload
data["dos_crashed"] = dos_failure
@@ -82,13 +107,13 @@
switch(action)
if("restart")
dos_overload = 0
- dos_failure = 0
+ set_dos_failure(FALSE)
update_icon()
SSnetworks.station_network.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
return TRUE
if("toggle")
- enabled = !enabled
- SSnetworks.station_network.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
+ set_relay_enabled(!relay_enabled)
+ SSnetworks.station_network.add_log("Quantum relay manually [relay_enabled ? "enabled" : "disabled"].")
update_icon()
return TRUE
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 7c3ba200bd3..0135d1f9bd5 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1282,7 +1282,9 @@
if(SOFT_CRIT)
status = "Dying"
if(UNCONSCIOUS)
- status = "[L.InCritical() ? "Unconscious and Dying" : "Unconscious"]"
+ status = "Unconscious"
+ if(HARD_CRIT)
+ status = "Unconscious and Dying"
if(DEAD)
status = "Dead"
health_description = "Status = [status]"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 2fb098b5ca2..fd0b3a4b5ac 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1071,7 +1071,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
ADMIN_PUNISHMENT_BLEED,
ADMIN_PUNISHMENT_PERFORATE,
ADMIN_PUNISHMENT_SCARIFY,
- ADMIN_PUNISHMENT_SHOES
+ ADMIN_PUNISHMENT_SHOES,
+ ADMIN_PUNISHMENT_DOCK
)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in sortList(punishment_list)
@@ -1238,6 +1239,32 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr,"[dude] does not have knottable shoes!", confidential = TRUE)
return
sick_kicks.adjust_laces(SHOES_KNOTTED)
+ if(ADMIN_PUNISHMENT_DOCK)
+ if(!iscarbon(target))
+ to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE)
+ return
+ var/mob/living/carbon/dude = target
+ var/obj/item/card/id/card = dude.get_idcard(TRUE)
+ if(!card)
+ to_chat(usr,"[dude] does not have an ID card on!", confidential = TRUE)
+ return
+ if(!card.registered_account)
+ to_chat(usr,"[dude] does not have an ID card with an account!", confidential = TRUE)
+ return
+ if(card.registered_account.account_balance == 0)
+ to_chat(usr, "ID Card lacks any funds. No pay to dock.")
+ return
+ var/new_cost = input("How much pay are we docking? Current balance: [card.registered_account.account_balance] credits.","BUDGET CUTS") as num|null
+ if(!new_cost)
+ return
+ if(!(card.registered_account.has_money(new_cost)))
+ to_chat(usr, "ID Card lacked funds. Emptying account.")
+ card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.")
+ card.registered_account.account_balance = 0
+ else
+ card.registered_account.account_balance = card.registered_account.account_balance - new_cost
+ card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.")
+ SEND_SOUND(target, 'sound/machines/buzz-sigh.ogg')
punish_log(target, punishment)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index f373bf939bb..2b3050343c1 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -585,11 +585,11 @@ Congratulations! You are now trained for invasive xenobiology research!"}
return
var/mob/living/carbon/C = L
if(!C.handcuffed)
- if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())
+ if(C.canBeHandcuffed())
playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
C.visible_message("[user] begins restraining [C] with [src]!", \
"[user] begins shaping an energy field around your hands!")
- if(do_mob(user, C, time_to_cuff) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()))
+ if(do_mob(user, C, time_to_cuff) && C.canBeHandcuffed())
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C)
C.update_handcuffed()
diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm
index 100c186ff20..d3f5baeaa5c 100644
--- a/code/modules/antagonists/abductor/machinery/experiment.dm
+++ b/code/modules/antagonists/abductor/machinery/experiment.dm
@@ -34,7 +34,7 @@
if(state_open && !panel_open)
..(target)
-/obj/machinery/abductor/experiment/relaymove(mob/user)
+/obj/machinery/abductor/experiment/relaymove(mob/living/user, direction)
if(user.stat != CONSCIOUS)
return
if(message_cooldown <= world.time)
diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm
index f4a9a021d2d..73e154c26f7 100644
--- a/code/modules/antagonists/blob/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob_mobs.dm
@@ -12,7 +12,7 @@
speak_emote = null //so we use verb_yell/verb_say/etc
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
- maxbodytemp = 360
+ maxbodytemp = INFINITY
unique_name = 1
a_intent = INTENT_HARM
see_in_dark = 8
@@ -115,6 +115,8 @@
var/death_cloud_size = 1 //size of cloud produced from a dying spore
var/mob/living/carbon/human/oldguy
var/is_zombie = FALSE
+ ///Whether or not this is a fragile spore from Distributed Neurons
+ var/is_weak = FALSE
/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, obj/structure/blob/factory/linked_node)
. = ..()
@@ -123,11 +125,12 @@
factory.spores += src
if(linked_node.overmind && istype(linked_node.overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons) && !istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak))
notify_ghosts("A controllable spore has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Spore Created")
+ add_cell_sample()
/mob/living/simple_animal/hostile/blob/blobspore/Life()
if(!is_zombie && isturf(src.loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
- if(H.stat == DEAD)
+ if(!is_weak && H.stat == DEAD)
Zombify(H)
break
if(factory && z != factory.z)
@@ -225,6 +228,13 @@
color = initial(color)//looks better.
add_overlay(blob_head_overlay)
+/mob/living/simple_animal/hostile/blob/blobspore/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
+/mob/living/simple_animal/hostile/blob/blobspore/independent
+ gold_core_spawnable = FALSE
+ independent = TRUE
+
/mob/living/simple_animal/hostile/blob/blobspore/weak
name = "fragile blob spore"
health = 15
@@ -232,6 +242,8 @@
melee_damage_lower = 1
melee_damage_upper = 2
death_cloud_size = 0
+ is_weak = TRUE
+ gold_core_spawnable = NO_SPAWN
/////////////////
// BLOBBERNAUT //
@@ -261,6 +273,13 @@
mob_size = MOB_SIZE_LARGE
hud_type = /datum/hud/blobbernaut
+/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
+ . = ..()
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/blob/blobbernaut/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
var/list/blobs_in_area = range(2, src)
diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
index 8d2724d3261..aa11c7ca90b 100644
--- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
+++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
@@ -25,8 +25,8 @@
M.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
- M.adjustFireLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
- M.adjustToxLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0)
+ M.adjustBruteLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ M.adjustFireLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ M.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
. = 1
..()
diff --git a/code/modules/antagonists/blob/blobstrains/debris_devourer.dm b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm
index 1bbb913ed6f..9fefe3bd0b3 100644
--- a/code/modules/antagonists/blob/blobstrains/debris_devourer.dm
+++ b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm
@@ -1,4 +1,4 @@
-#define DEBRIS_DENSITY (length(core.contents) / length(overmind.blobs_legit)) // items per blob
+#define DEBRIS_DENSITY (length(core.contents) / (length(overmind.blobs_legit) * 0.25)) // items per blob
// Accumulates junk liberally
/datum/blobstrain/debris_devourer
@@ -18,11 +18,12 @@
debris_attack(L, blob)
/datum/blobstrain/debris_devourer/on_sporedeath(mob/living/spore)
+ var/obj/structure/blob/core/core = overmind.blob_core
for(var/i in 1 to 3)
- var/obj/item/I = locate() in overmind.blob_core
+ var/obj/item/I = pick(core.contents)
if (I && !QDELETED(I))
I.forceMove(get_turf(spore))
- I.throw_at(get_edge_target_turf(spore,pick(GLOB.alldirs)), 3, 5)
+ I.throw_at(get_edge_target_turf(spore,pick(GLOB.alldirs)), 6, 5, spore, TRUE, FALSE, null, 3)
/datum/blobstrain/debris_devourer/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O, coefficient = 1) //when the blob expands, do this
for (var/obj/item/I in T)
@@ -30,11 +31,11 @@
/datum/blobstrain/debris_devourer/proc/debris_attack(mob/living/L, source)
var/obj/structure/blob/core/core = overmind.blob_core
- if (prob(20 * DEBRIS_DENSITY)) // Pretend the items are spread through the blob and its mobs and not in the core.
- var/obj/item/I = locate() in core
+ if (prob(40 * DEBRIS_DENSITY)) // Pretend the items are spread through the blob and its mobs and not in the core.
+ var/obj/item/I = pick(core.contents)
if (I && !QDELETED(I))
I.forceMove(get_turf(source))
- I.throw_at(L, 2, 5)
+ I.throw_at(L, 6, 5, overmind, TRUE, FALSE, null, 3)
/datum/blobstrain/debris_devourer/blobbernaut_attack(mob/living/L, mob/living/blobbernaut) // When this blob's blobbernaut attacks people
debris_attack(L,blobbernaut)
@@ -59,5 +60,4 @@
if (8 to 10)
. += "Absorbed debris is currently reducing incoming damage by a medium amount."
-
#undef DEBRIS_DENSITY
diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
index 3581a5e8501..96d4ccfde0c 100644
--- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
+++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
@@ -3,8 +3,8 @@
name = "Distributed Neurons"
description = "will do very low toxin damage and turns unconscious targets into blob zombies."
effectdesc = "will also produce fragile spores when killed. Spores produced by factories are sentient."
- shortdesc = "will do very low toxin damage and will turn unconscious targets into blob zombies for additional resources(for your overmind). Spores produced by factories are sentient."
- analyzerdescdamage = "Does very low toxin damage and kills unconscious humans, turning them into blob zombies."
+ shortdesc = "will do very low toxin damage and will kill any unconcious targets when attacked. Spores produced by factories are sentient."
+ analyzerdescdamage = "Does very low toxin damage and kills unconscious humans."
analyzerdesceffect = "Produces spores when killed. Spores produced by factories are sentient."
color = "#E88D5D"
complementary_color = "#823ABB"
@@ -27,13 +27,14 @@
/datum/reagent/blob/distributed_neurons/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, TOX)
- if(O && ishuman(M) && M.stat == UNCONSCIOUS)
- M.death() //sleeping in a fight? bad plan.
- var/points = rand(5, 10)
- var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(get_turf(M))
- BS.overmind = O
- BS.update_icons()
- O.blob_mobs.Add(BS)
- BS.Zombify(M)
- O.add_points(points)
- to_chat(O, "Gained [points] resources from the zombification of [M].")
+ if(O && ishuman(M))
+ if(M.stat == UNCONSCIOUS || M.stat == HARD_CRIT)
+ M.death() //sleeping in a fight? bad plan.
+ if(M.stat == DEAD && O.can_buy(5))
+ var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(get_turf(M))
+ BS.overmind = O
+ BS.update_icons()
+ O.blob_mobs.Add(BS)
+ BS.Zombify(M)
+ O.add_points(-5)
+ to_chat(O, "Spent 5 resources for the zombification of [M].")
diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
index 7ac8c0c823c..6e85d2110d6 100644
--- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
+++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
@@ -29,6 +29,6 @@
/datum/reagent/blob/energized_jelly/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.losebreath += round(0.2*reac_volume)
- M.adjustStaminaLoss(reac_volume)
+ M.adjustStaminaLoss(reac_volume * 1.2)
if(M)
M.apply_damage(0.6*reac_volume, OXY)
diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
index 174205d76d9..e19c1331969 100644
--- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
+++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
@@ -3,7 +3,7 @@
name = "Explosive Lattice"
description = "will do brute damage in an area around targets."
effectdesc = "will also resist explosions, but takes increased damage from fire and other energy sources."
- analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets."
+ analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets. Spores explode on death."
analyzerdesceffect = "Is highly resistant to explosions, but takes increased damage from fire and other energy sources."
color = "#8B2500"
complementary_color = "#00668B"
@@ -17,6 +17,14 @@
else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER)
return damage * 1.5
return ..()
+
+/datum/blobstrain/reagent/explosive_lattice/on_sporedeath(mob/living/spore)
+ var/obj/effect/temp_visual/explosion/fast/effect = new /obj/effect/temp_visual/explosion/fast(get_turf(spore))
+ effect.alpha = 150
+ for(var/mob/living/actor in orange(get_turf(spore), 1))
+ if(ROLE_BLOB in actor.faction) //no friendly fire
+ continue
+ actor.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
/datum/reagent/blob/explosive_lattice
name = "Explosive Lattice"
diff --git a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
index eada8f47b25..6c07ca6c34b 100644
--- a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
+++ b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
@@ -1,7 +1,7 @@
//does massive brute and burn damage, but can only expand manually
/datum/blobstrain/reagent/networked_fibers
name = "Networked Fibers"
- description = "will do high brute and burn damage and will generate resources quicker, but can only expand manually."
+ description = "will do high brute and burn damage and will generate resources quicker, but can only expand manually using the core."
shortdesc = "will do high brute and burn damage."
effectdesc = "will move your core when manually expanding near it."
analyzerdescdamage = "Does high brute and burn damage."
@@ -9,6 +9,8 @@
color = "#4F4441"
complementary_color = "#414C4F"
reagent = /datum/reagent/blob/networked_fibers
+ core_regen = 5
+ point_rate = 3
/datum/blobstrain/reagent/networked_fibers/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(!O && newB.overmind)
@@ -24,6 +26,9 @@
C.forceMove(T)
C.setDir(get_dir(newB, C))
O.add_points(1)
+ return
+ O.add_points(4)
+ qdel(newB)
//does massive brute and burn damage, but can only expand manually
/datum/reagent/blob/networked_fibers
diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
index bd193959e9f..297e56ae2f8 100644
--- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
+++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
@@ -3,7 +3,7 @@
name = "Pressurized Slime"
description = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
effectdesc = "will also wet tiles near blobs that are attacked or killed."
- analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them."
+ analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them. Is resistant to brute attacks."
analyzerdesceffect = "When attacked or killed, lubricates nearby tiles, extinguishing anything on them."
color = "#AAAABB"
complementary_color = "#BBBBAA"
@@ -15,6 +15,8 @@
/datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) || damage_type != BURN)
extinguisharea(B, damage)
+ if(damage_type == BRUTE)
+ return damage * 0.5
return ..()
/datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm
index 5079519283c..fd39fe55df4 100644
--- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm
+++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm
@@ -27,4 +27,4 @@
/datum/reagent/blob/reactive_spines/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
- M.adjustBruteLoss(0.8*reac_volume)
+ M.adjustBruteLoss(reac_volume)
diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
index 500418b7be6..1df852bb1c8 100644
--- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
+++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
@@ -2,11 +2,13 @@
/datum/blobstrain/reagent/regenerative_materia
name = "Regenerative Materia"
description = "will do toxin damage and cause targets to believe they are fully healed."
- analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
+ analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed. Core regenerates much faster."
color = "#A88FB7"
complementary_color = "#AF7B8D"
message_living = ", and you feel alive"
reagent = /datum/reagent/blob/regenerative_materia
+ core_regen = 20
+ point_rate = 3
/datum/reagent/blob/regenerative_materia
name = "Regenerative Materia"
diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
index 2fbe5b6e901..d24a1a2008d 100644
--- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
+++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
@@ -10,7 +10,7 @@
reagent = /datum/reagent/blob/shifting_fragments
/datum/blobstrain/reagent/shifting_fragments/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
- if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield) && prob(25)))
+ if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield)))
newB.forceMove(get_turf(B))
B.forceMove(T)
diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm
index 394306df0dd..1e542f994c6 100644
--- a/code/modules/antagonists/blob/powers.dm
+++ b/code/modules/antagonists/blob/powers.dm
@@ -358,7 +358,7 @@
/mob/camera/blob/proc/reroll_strain()
var/list/choices = list()
- while (length(choices) < 4)
+ while (length(choices) < 6)
var/datum/blobstrain/bs = pick((GLOB.valid_blobstrains))
choices[initial(bs.name)] = bs
diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm
index 324af94f142..086f3835a02 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -33,6 +33,7 @@
if(atmosblock)
air_update_turf(1)
ConsumeTile()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOB, CELL_VIRUS_TABLE_GENERIC, 2, 2)
/obj/structure/blob/proc/creation_action() //When it's created by the overmind, do this.
return
diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm
index 91f9b2d080b..66eb1c0e124 100644
--- a/code/modules/antagonists/blob/structures/shield.dm
+++ b/code/modules/antagonists/blob/structures/shield.dm
@@ -40,6 +40,4 @@
icon_state = "blob_glow"
flags_ricochet = RICOCHET_SHINY
point_return = 8
- max_integrity = 100
- brute_resist = 0.5
explosion_block = 2
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index 5385636a08d..c03f817b43e 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -13,7 +13,8 @@
var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1
var/req_human = 0 //if you need to be human to use this ability
var/req_absorbs = 0 //similar to req_dna, but only gained from absorbing, not DNA sting
- var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD
+ ///Maximum stat before the ability is blocked. For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, while `DEAD` allows the ability to be used on any stat values.
+ var/req_stat = CONSCIOUS
var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag
var/active = FALSE//used by a few powers that toggle
diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm
index c586e35d5a0..5428d4a34a5 100644
--- a/code/modules/antagonists/changeling/powers/fleshmend.dm
+++ b/code/modules/antagonists/changeling/powers/fleshmend.dm
@@ -5,7 +5,7 @@
button_icon_state = "fleshmend"
chemical_cost = 20
dna_cost = 2
- req_stat = UNCONSCIOUS
+ req_stat = HARD_CRIT
//Starts healing you every second for 10 seconds.
//Can be used whilst unconscious.
diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm
index 1098f541635..5ba9410eaa5 100644
--- a/code/modules/antagonists/changeling/powers/panacea.dm
+++ b/code/modules/antagonists/changeling/powers/panacea.dm
@@ -5,7 +5,7 @@
button_icon_state = "panacea"
chemical_cost = 20
dna_cost = 1
- req_stat = UNCONSCIOUS
+ req_stat = HARD_CRIT
//Heals the things that the other regenerative abilities don't.
/datum/action/changeling/panacea/sting_action(mob/user)
diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm
index a060cda7f8e..a87a41e2bbc 100644
--- a/code/modules/antagonists/changeling/powers/regenerate.dm
+++ b/code/modules/antagonists/changeling/powers/regenerate.dm
@@ -5,7 +5,7 @@
button_icon_state = "regenerate"
chemical_cost = 10
dna_cost = 0
- req_stat = UNCONSCIOUS
+ req_stat = HARD_CRIT
/datum/action/changeling/regenerate/sting_action(mob/living/user)
..()
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index f56baeb3902..dbcf8a23b68 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -159,10 +159,10 @@
invocation = "Ta'gh fara'qha fel d'amar det!"
/datum/action/innate/cult/blood_spell/emp/Activate()
+ owner.whisper(invocation, language = /datum/language/common)
owner.visible_message("[owner]'s hand flashes a bright blue!", \
"You speak the cursed words, emitting an EMP blast from your hand.")
empulse(owner, 2, 5)
- owner.whisper(invocation, language = /datum/language/common)
charges--
if(charges<=0)
qdel(src)
@@ -182,31 +182,32 @@
health_cost = 12
/datum/action/innate/cult/blood_spell/equipment
- name = "Summon Equipment"
- desc = "Allows you to summon a ritual dagger, or empowers your hand to summon combat gear onto a cultist you touch, including cult armor, a cult bola, and a cult sword."
+ name = "Summon Combat Equipment"
+ desc = "Empowers your hand to summon combat gear onto a cultist you touch, including cult armor, a cult bola, and a cult sword. Not recommended for use before the blood cult's presence has been revealed."
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/dagger
+ name = "Summon Ritual Dagger"
+ desc = "Allows you to summon a ritual dagger, in case you've lost the dagger that was given to you."
+ invocation = "Wur d'dai leev'mai k'sagan!" //where did I leave my keys, again?
+ button_icon_state = "equip" //this is the same icon that summon equipment uses, but eh, I'm not a spriter
+
+/datum/action/innate/cult/blood_spell/dagger/Activate()
+ var/turf/owner_turf = get_turf(owner)
+ owner.whisper(invocation, language = /datum/language/common)
+ owner.visible_message("[owner]'s hand glows red for a moment.", \
+ "Your plea for aid is answered, and light begins to shimmer and take form within your hand!")
+ var/obj/item/melee/cultblade/dagger/summoned_blade = new (owner_turf)
+ if(owner.put_in_hands(summoned_blade))
+ 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', FALSE, 0, 25))
+ charges--
+ if(charges <= 0)
+ qdel(src)
/datum/action/innate/cult/blood_spell/horror
name = "Hallucinations"
@@ -511,7 +512,7 @@
/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(FALSE) >= 2 || C.get_arm_ignore())
+ if(C.canBeHandcuffed())
CuffAttack(C, user)
else
user.visible_message("This victim doesn't have enough arms to complete the restraint!")
@@ -666,14 +667,14 @@
return TRUE
-//Armor: Gives the target a basic cultist combat loadout
+//Armor: Gives the target (cultist) a basic cultist combat loadout
/obj/item/melee/blood_magic/armor
name = "Arming Aura"
desc = "Will equipt cult combat gear onto a cultist on contact."
color = "#33cc33" // green
/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(iscarbon(target) && proximity)
+ if(iscarbon(target) && iscultist(target) && proximity)
uses--
var/mob/living/carbon/C = target
C.visible_message("Otherworldly armor suddenly appears on [C]!")
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 6c318070f2c..f3865f348df 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -816,7 +816,7 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(new_human, "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.")
while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T))
- if(user.stat || new_human.InCritical())
+ if(user.stat != CONSCIOUS || HAS_TRAIT(new_human, TRAIT_CRITICAL_CONDITION))
break
user.apply_damage(0.1, BRUTE)
sleep(1)
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index a15097096e0..a937c9c39de 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -18,8 +18,14 @@
status_flags = CANPUSH
mob_size = MOB_SIZE_LARGE
held_items = list(null, null)
- bodyparts = list(/obj/item/bodypart/chest/devil, /obj/item/bodypart/head/devil, /obj/item/bodypart/l_arm/devil,
- /obj/item/bodypart/r_arm/devil, /obj/item/bodypart/r_leg/devil, /obj/item/bodypart/l_leg/devil)
+ bodyparts = list(
+ /obj/item/bodypart/chest/devil,
+ /obj/item/bodypart/head/devil,
+ /obj/item/bodypart/l_arm/devil,
+ /obj/item/bodypart/r_arm/devil,
+ /obj/item/bodypart/r_leg/devil,
+ /obj/item/bodypart/l_leg/devil,
+ )
hud_type = /datum/hud/devil
var/ascended = FALSE
var/mob/living/oldform
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
index 22b1b4a8b16..ebcd4d8a290 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
@@ -132,27 +132,28 @@
if(tar.anti_magic_check())
tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!")
return ..()
- var/mob/living/carbon/C2 = user
+ var/mob/living/carbon/carbon_user = user
if(isliving(target))
- var/mob/living/L = target
- L.adjustBruteLoss(20)
- C2.adjustBruteLoss(-20)
+ var/mob/living/living_target = target
+ living_target.adjustBruteLoss(20)
+ carbon_user.adjustBruteLoss(-20)
if(iscarbon(target))
- var/mob/living/carbon/C1 = target
- for(var/obj/item/bodypart/bodypart in C2.bodyparts)
+ var/mob/living/carbon/carbon_target = target
+ for(var/bp in carbon_user.bodyparts)
+ var/obj/item/bodypart/bodypart = bp
for(var/i in bodypart.wounds)
var/datum/wound/iter_wound = i
if(prob(50))
continue
- var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in C1.bodyparts
+ var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in carbon_target.bodyparts
if(!target_bodypart)
continue
iter_wound.remove_wound()
iter_wound.apply_wound(target_bodypart)
- C1.blood_volume -= 20
- if(C2.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
- C2.blood_volume += 20
+ carbon_target.blood_volume -= 20
+ if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
+ carbon_user.blood_volume += 20
return ..()
/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/rust_wave
@@ -510,7 +511,7 @@
if(target.stat == DEAD || !target.on_fire)
continue
//This is essentially a death mark, use this to finish your opponent quicker.
- if(target.InCritical())
+ if(HAS_TRAIT(target, TRAIT_CRITICAL_CONDITION))
target.death()
target.adjustFireLoss(20)
new /obj/effect/temp_visual/eldritch_smoke(target.drop_location())
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 09bc5a912f3..ce25c32427f 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -67,14 +67,7 @@
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()
@@ -259,45 +252,6 @@
if(traitor_kind == TRAITOR_HUMAN)
owner.equip_traitor(employer, silent, src)
-/datum/antagonist/traitor/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" = ITEM_SLOT_BACKPACK,
- "left pocket" = ITEM_SLOT_LPOCKET,
- "right pocket" = ITEM_SLOT_RPOCKET
- )
-
- 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()
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 3e76ca78d4b..991cb5de660 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -84,7 +84,7 @@
/obj/item/assembly/voice/proc/send_pulse()
visible_message("clicks", visible_message_flags = EMOTE_MESSAGE)
- playsound(src, 'licensed_sound/Sampling-Plus-1.0/whirthunk.ogg', 30)
+ playsound(src, 'sound/effects/whirthunk.ogg', 30)
addtimer(CALLBACK(src, .proc/pulse), 2 SECONDS)
/obj/item/assembly/voice/multitool_act(mob/living/user, obj/item/I)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 2fbfea08574..c8ad46a47f7 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -73,7 +73,7 @@
update_icon()
/obj/machinery/atmospherics/components/binary/circulator/update_icon()
- if(!is_operational())
+ if(!is_operational)
icon_state = "circ-p-[flipped]"
else if(last_pressure_delta > 0)
if(last_pressure_delta > ONE_ATMOSPHERE)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index d3c5959e2c2..915b246718f 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -42,7 +42,7 @@
var/image/cap = getpipeimage(icon, "dpvent_cap", dir, piping_layer = piping_layer)
add_overlay(cap)
- if(!on || !is_operational())
+ if(!on || !is_operational)
icon_state = "vent_off"
else
icon_state = pump_direction ? "vent_out" : "vent_in"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index d65eecbfca8..c007c8e6138 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -48,11 +48,11 @@
return ..()
/obj/machinery/atmospherics/components/binary/pump/update_icon_nopipes()
- icon_state = (on && is_operational()) ? "pump_on" : "pump_off"
+ icon_state = (on && is_operational) ? "pump_on" : "pump_off"
/obj/machinery/atmospherics/components/binary/pump/process_atmos()
// ..()
- if(!on || !is_operational())
+ if(!on || !is_operational)
return
var/datum/gas_mixture/air1 = airs[1]
@@ -147,7 +147,7 @@
/obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index cbf0cb95f2b..23ca4bd4ec3 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -67,7 +67,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_OPEN | INTERACT_MACHINE_OPEN_SILICON
/obj/machinery/atmospherics/components/binary/valve/digital/update_icon_nopipes(animation)
- if(!is_operational())
+ if(!is_operational)
normalize_cardinal_directions()
icon_state = "dvalve_nopower"
return
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index 6ad675e123f..4d0247863e8 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -47,11 +47,11 @@
return ..()
/obj/machinery/atmospherics/components/binary/volume_pump/update_icon_nopipes()
- icon_state = on && is_operational() ? "volpump_on" : "volpump_off"
+ icon_state = on && is_operational ? "volpump_on" : "volpump_off"
/obj/machinery/atmospherics/components/binary/volume_pump/process_atmos()
// ..()
- if(!on || !is_operational())
+ if(!on || !is_operational)
return
var/datum/gas_mixture/air1 = airs[1]
@@ -175,7 +175,7 @@
/obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index f663f0fc9b8..9ed689f0d2f 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -56,12 +56,12 @@
return ..()
/obj/machinery/atmospherics/components/trinary/filter/update_icon_nopipes()
- var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational()
+ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational
icon_state = "filter_[on_state ? "on" : "off"][flipped ? "_f" : ""]"
/obj/machinery/atmospherics/components/trinary/filter/process_atmos()
..()
- if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational())
+ if(!on || !(nodes[1] && nodes[2] && nodes[3]) || !is_operational)
return
//Early return
@@ -170,7 +170,7 @@
/obj/machinery/atmospherics/components/trinary/filter/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index 1fb99a2b025..b1fe8d275e1 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -48,7 +48,7 @@
return ..()
/obj/machinery/atmospherics/components/trinary/mixer/update_icon_nopipes()
- var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational()
+ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational
icon_state = "mixer_[on_state ? "on" : "off"][flipped ? "_f" : ""]"
/obj/machinery/atmospherics/components/trinary/mixer/New()
@@ -59,7 +59,7 @@
/obj/machinery/atmospherics/components/trinary/mixer/process_atmos()
..()
- if(!on || !(nodes[1] && nodes[2] && nodes[3]) && !is_operational())
+ if(!on || !(nodes[1] && nodes[2] && nodes[3]) && !is_operational)
return
//Get those gases, mah boiiii
@@ -176,7 +176,7 @@
/obj/machinery/atmospherics/components/trinary/mixer/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index b0e04976a97..1be2063863e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -14,6 +14,7 @@
circuit = /obj/item/circuitboard/machine/cryo_tube
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
occupant_typecache = list(/mob/living/carbon, /mob/living/simple_animal)
+ processing_flags = NONE
var/autoeject = TRUE
var/volume = 100
@@ -45,6 +46,8 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
. = ..()
initialize_directions = dir
+ if(is_operational)
+ begin_processing()
radio = new(src)
radio.keyslot = new radio_key
@@ -150,7 +153,7 @@
occupant_overlay.dir = SOUTH
occupant_overlay.pixel_y = 22
- if(on && !running_anim && is_operational())
+ if(on && !running_anim && is_operational)
icon_state = "pod-on"
running_anim = TRUE
run_anim(TRUE, occupant_overlay)
@@ -159,7 +162,7 @@
add_overlay(occupant_overlay)
add_overlay("cover-off")
- else if(on && is_operational())
+ else if(on && is_operational)
icon_state = "pod-on"
add_overlay("cover-on")
else
@@ -167,7 +170,7 @@
add_overlay("cover-off")
/obj/machinery/atmospherics/components/unary/cryo_cell/proc/run_anim(anim_up, image/occupant_overlay)
- if(!on || !occupant || !is_operational())
+ if(!on || !occupant || !is_operational)
running_anim = FALSE
return
cut_overlays()
@@ -184,15 +187,21 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator)
open_machine()
+
+/obj/machinery/atmospherics/components/unary/cryo_cell/on_set_is_operational(old_value)
+ if(old_value) //Turned off
+ on = FALSE
+ end_processing()
+ update_icon()
+ else //Turned on
+ begin_processing()
+
+
/obj/machinery/atmospherics/components/unary/cryo_cell/process()
..()
if(!on)
return
- if(!is_operational())
- on = FALSE
- update_icon()
- return
if(!occupant)
return
@@ -278,7 +287,7 @@
if(air1.temperature > 2000)
take_damage(clamp((air1.temperature)/200, 10, 20), BURN)
-/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user)
+/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/living/user, direction)
if(message_cooldown <= world.time)
message_cooldown = world.time + 50
to_chat(user, "[src]'s door won't budge!")
@@ -391,7 +400,7 @@
if(SOFT_CRIT)
data["occupant"]["stat"] = "Conscious"
data["occupant"]["statstate"] = "average"
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
data["occupant"]["stat"] = "Unconscious"
data["occupant"]["statstate"] = "average"
if(DEAD)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index 5c4886f1397..da677639693 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -47,7 +47,7 @@
// everything is already shifted so don't shift the cap
add_overlay(getpipeimage(icon, "inje_cap", initialize_directions))
- if(!nodes[1] || !on || !is_operational())
+ if(!nodes[1] || !on || !is_operational)
icon_state = "inje_off"
else
icon_state = "inje_on"
@@ -57,7 +57,7 @@
injecting = 0
- if(!on || !is_operational())
+ if(!on || !is_operational)
return
var/datum/gas_mixture/air_contents = airs[1]
@@ -74,7 +74,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject()
- if(on || injecting || !is_operational())
+ if(on || injecting || !is_operational)
return
var/datum/gas_mixture/air_contents = airs[1]
@@ -179,7 +179,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 0433208cb3e..2281d6a1062 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -45,7 +45,7 @@
if(panel_open)
icon_state = icon_state_open
- else if(on && is_operational())
+ else if(on && is_operational)
icon_state = icon_state_on
else
icon_state = icon_state_off
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index d92537aa094..b09a68a1da2 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -59,7 +59,7 @@
icon_state = "vent_welded"
return
- if(!nodes[1] || !on || !is_operational())
+ if(!nodes[1] || !on || !is_operational)
if(icon_state == "vent_welded")
icon_state = "vent_off"
return
@@ -86,7 +86,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/process_atmos()
..()
- if(!is_operational())
+ if(!is_operational)
return
if(!nodes[1])
on = FALSE
@@ -178,7 +178,7 @@
..()
/obj/machinery/atmospherics/components/unary/vent_pump/receive_signal(datum/signal/signal)
- if(!is_operational())
+ if(!is_operational)
return
// log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/components/unary/vent_pump/receive_signal([signal.debug_print()])")
if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
@@ -269,7 +269,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 7da78721259..5257c1c2fba 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -51,7 +51,7 @@
return ..()
/obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power()
- if(!on || welded || !is_operational() || !powered(power_channel))
+ if(!on || welded || !is_operational || !powered(power_channel))
return FALSE
var/amount = idle_power_usage
@@ -76,7 +76,7 @@
icon_state = "scrub_welded"
return
- if(!nodes[1] || !on || !is_operational())
+ if(!nodes[1] || !on || !is_operational)
icon_state = "scrub_off"
return
@@ -137,7 +137,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/process_atmos()
..()
- if(welded || !is_operational())
+ if(welded || !is_operational)
return FALSE
if(!nodes[1] || !on)
on = FALSE
@@ -217,7 +217,7 @@
adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir = 1)
/obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal)
- if(!is_operational() || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
+ if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command"))
return 0
var/atom/signal_sender = signal.data["user"]
@@ -285,7 +285,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user)
. = ..()
- if(. && on && is_operational())
+ if(. && on && is_operational)
to_chat(user, "You cannot unwrench [src], turn it off first!")
return FALSE
diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
index c16c99d0865..b1592dcaeb9 100644
--- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
@@ -120,12 +120,12 @@
back_nodes[i] = null
update_icon()
-/obj/machinery/atmospherics/pipe/layer_manifold/relaymove(mob/living/user, dir)
- if(initialize_directions & dir)
+/obj/machinery/atmospherics/pipe/layer_manifold/relaymove(mob/living/user, direction)
+ if(initialize_directions & direction)
return ..()
- if((NORTH|EAST) & dir)
+ if((NORTH|EAST) & direction)
user.ventcrawl_layer = clamp(user.ventcrawl_layer + 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX)
- if((SOUTH|WEST) & dir)
+ if((SOUTH|WEST) & direction)
user.ventcrawl_layer = clamp(user.ventcrawl_layer - 1, PIPING_LAYER_MIN, PIPING_LAYER_MAX)
to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.")
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 286a373fb6f..d20e3c2392d 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -68,7 +68,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- if(is_operational())
+ if(is_operational)
if(prob(50 / severity))
on = !on
if(prob(100 / severity))
diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
index fcfc1638831..361394d8ff1 100644
--- a/code/modules/atmospherics/machinery/portable/scrubber.dm
+++ b/code/modules/atmospherics/machinery/portable/scrubber.dm
@@ -95,7 +95,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- if(is_operational())
+ if(is_operational)
if(prob(50 / severity))
on = !on
update_icon()
@@ -176,7 +176,7 @@
icon_state = "scrubber:[on]"
/obj/machinery/portable_atmospherics/scrubber/huge/process_atmos()
- if((!anchored && !movable) || !is_operational())
+ if((!anchored && !movable) || !is_operational)
on = FALSE
update_icon()
use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index cf89a0b7293..8937e7f0616 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -181,14 +181,15 @@
spawned_mobs -= i
continue
// Anyone in crit, automatically reap
- var/mob/living/M = i
- if(M.InCritical() || M.stat == DEAD)
- ctf_dust_old(M)
+ var/mob/living/living_participant = i
+ if(HAS_TRAIT(living_participant, TRAIT_CRITICAL_CONDITION) || living_participant.stat == DEAD)
+ ctf_dust_old(living_participant)
else
// The changes that you've been hit with no shield but not
// instantly critted are low, but have some healing.
- M.adjustBruteLoss(-5)
- M.adjustFireLoss(-5)
+ living_participant.adjustBruteLoss(-5)
+ living_participant.adjustFireLoss(-5)
+
/obj/machinery/capture_the_flag/red
name = "Red CTF Controller"
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 555df752e9c..43954daa1fd 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1415,6 +1415,18 @@
/obj/item/clothing/head/helmet/monkey_sentience)
crate_name = "monkey mind magnification crate"
+/datum/supply_pack/science/cytology
+ name = "Cytology supplies crate"
+ desc = "Did out of control specimens pulverize xenobiology? Here is some more supplies for further testing."
+ cost = 1500
+ contains = list(/obj/structure/microscope,
+ /obj/item/biopsy_tool,
+ /obj/item/storage/box/petridish,
+ /obj/item/storage/box/petridish,
+ /obj/item/storage/box/swab,
+ /obj/item/construction/plumbing/research)
+ crate_name = "cytology supplies crate"
+
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Service //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -2032,6 +2044,14 @@
/obj/item/clothing/neck/petcollar)
crate_name = "pug crate"
+/datum/supply_pack/critter/bullterrier
+ name = "Bull Terrier Crate"
+ desc = "Like a normal dog, but with a head the shape of an egg. Comes with a nice collar!"
+ cost = 5000
+ contains = list(/mob/living/simple_animal/pet/dog/bullterrier,
+ /obj/item/clothing/neck/petcollar)
+ crate_name = "bull terrier crate"
+
/datum/supply_pack/critter/snake
name = "Snake Crate"
desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes."
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index b9c60c25843..625e448c5d0 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -250,7 +250,7 @@
return TRUE
if(SOFT_CRIT)
to_chat(src, "You can't commit suicide while in a critical condition!")
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
to_chat(src, "You need to be conscious to commit suicide!")
if(DEAD)
to_chat(src, "You're already dead!")
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index f1587b78109..55ddadcd0dd 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -20,7 +20,7 @@
else
entry += " - Playing as [C.mob.real_name]"
switch(C.mob.stat)
- if(UNCONSCIOUS)
+ if(UNCONSCIOUS, HARD_CRIT)
entry += " - Unconscious"
if(DEAD)
if(isobserver(C.mob))
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index dafae30e50a..514a9e2c811 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -58,8 +58,8 @@
icon_state = "black"
inhand_icon_state = "blackgloves"
- tackle_stam_cost = 35
- base_knockdown = 1.5 SECONDS
+ tackle_stam_cost = 30
+ base_knockdown = 1.25 SECONDS
tackle_range = 5
skill_mod = 2
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 21b4609a479..b04fd4cbc2d 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -31,7 +31,7 @@
playsound(user, 'sound/machines/ding.ogg', 50, TRUE)
return(FIRELOSS)
-/obj/item/clothing/head/chefhat/relaymove(mob/user, direction)
+/obj/item/clothing/head/chefhat/relaymove(mob/living/user, direction)
if(!istype(user, /mob/living/simple_animal/mouse) || !isliving(loc) || !prob(mouse_control_probability))
return
var/mob/living/L = loc
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 97e33e668bf..4a612f9041e 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -271,7 +271,7 @@
if(target_ui)
QDEL_NULL(target_ui)
-/obj/effect/chronos_cam/relaymove(mob/user, direction)
+/obj/effect/chronos_cam/relaymove(mob/living/user, direction)
if(!holder)
qdel(src)
return
diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm
index 61a965df3b2..e2a68a937d7 100644
--- a/code/modules/events/fake_virus.dm
+++ b/code/modules/events/fake_virus.dm
@@ -5,10 +5,10 @@
/datum/round_event/fake_virus/start()
var/list/fake_virus_victims = list()
- for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
- if(!H.client || H.stat == DEAD || H.InCritical() || (!SSjob.GetJob(H.mind.assigned_role) || (H.mind.assigned_role in GLOB.nonhuman_positions)))
+ for(var/mob/living/carbon/human/victim in shuffle(GLOB.player_list))
+ if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !SSjob.GetJob(victim.mind.assigned_role) || (victim.mind.assigned_role in GLOB.nonhuman_positions))
continue
- fake_virus_victims += H
+ fake_virus_victims += victim
//first we do hard status effect victims
var/defacto_min = min(3, LAZYLEN(fake_virus_victims))
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index eac3a03a133..fc4b660d5cb 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -7,15 +7,15 @@
/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.diseases) || H.undergoing_cardiac_arrest())
+ for(var/mob/living/carbon/human/victim in shuffle(GLOB.player_list))
+ if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !victim.can_heartattack() || victim.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in victim.diseases) || victim.undergoing_cardiac_arrest())
continue
- if(!SSjob.GetJob(H.mind.assigned_role) || (H.mind.assigned_role in GLOB.nonhuman_positions))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event
+ if(!SSjob.GetJob(victim.mind.assigned_role) || (victim.mind.assigned_role in GLOB.nonhuman_positions))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event
continue
- if(H.satiety <= -60) //Multiple junk food items recently
- heart_attack_contestants[H] = 3
+ if(victim.satiety <= -60) //Multiple junk food items recently
+ heart_attack_contestants[victim] = 3
else
- heart_attack_contestants[H] = 1
+ heart_attack_contestants[victim] = 1
if(LAZYLEN(heart_attack_contestants))
var/mob/living/carbon/human/winner = pickweight(heart_attack_contestants)
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index 43c3337a4b3..4b1e181d656 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -57,7 +57,7 @@
dream_sequence(dream_fragments)
/mob/living/carbon/proc/dream_sequence(list/dream_fragments)
- if(stat != UNCONSCIOUS || InCritical())
+ if(stat != UNCONSCIOUS || HAS_TRAIT(src, TRAIT_CRITICAL_CONDITION))
dreaming = FALSE
return
var/next_message = dream_fragments[1]
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 123bd594624..1165f7c04d6 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -221,7 +221,7 @@ All foods are distributed among various categories. Use common sense.
if(bonus_reagents && bonus_reagents.len)
for(var/r_id in bonus_reagents)
var/amount = bonus_reagents[r_id]
- if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
+ if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin || r_id == /datum/reagent/consumable/nutriment/protein)
reagents.add_reagent(r_id, amount, tastes)
else
reagents.add_reagent(r_id, amount)
diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
index b5667c4ab3f..bfb0ced2757 100644
--- a/code/modules/food_and_drinks/food/snacks/meat.dm
+++ b/code/modules/food_and_drinks/food/snacks/meat.dm
@@ -10,7 +10,7 @@
icon_state = "meat"
dried_type = /obj/item/reagent_containers/food/snacks/sosjerky/healthy
bitesize = 3
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/plain
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain
slices_num = 3
@@ -64,7 +64,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
icon_state = "slimemeat"
desc = "Because jello wasn't offensive enough to vegans."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/slimejelly = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/slimejelly = 3)
filling_color = "#00FFFF"
tastes = list("slime" = 1, "jelly" = 1)
foodtype = MEAT | RAW | TOXIC
@@ -112,7 +112,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly
icon_state = "flymeat"
desc = "Nothing says tasty like maggot filled radioactive mutant flesh."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/uranium = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/uranium = 3)
tastes = list("maggots" = 1, "the inside of a reactor" = 1)
foodtype = MEAT | RAW | GROSS
value = FOOD_MEAT_MUTANT
@@ -174,17 +174,29 @@
desc = "A slab of mouse meat. Best not eat it raw."
foodtype = RAW | MEAT | GROSS
+/obj/item/reagent_containers/food/snacks/meat/slab/mouse/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB)
+
/obj/item/reagent_containers/food/snacks/meat/slab/corgi
name = "corgi meat"
desc = "Tastes like... well you know..."
tastes = list("meat" = 4, "a fondness for wearing hats" = 1)
foodtype = RAW | MEAT | GROSS
+/obj/item/reagent_containers/food/snacks/meat/slab/corgi/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB)
+
/obj/item/reagent_containers/food/snacks/meat/slab/pug
name = "pug meat"
desc = "Tastes like... well you know..."
foodtype = RAW | MEAT | GROSS
+/obj/item/reagent_containers/food/snacks/meat/slab/pug/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB)
+
/obj/item/reagent_containers/food/snacks/meat/slab/killertomato
name = "killer tomato meat"
desc = "A slice from a huge tomato."
@@ -200,19 +212,22 @@
name = "bear meat"
desc = "A very manly slab of meat."
icon_state = "bearmeat"
- list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6)
filling_color = "#FFB6C1"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/bear
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/bear
tastes = list("meat" = 1, "salmon" = 1)
foodtype = RAW | MEAT
+/obj/item/reagent_containers/food/snacks/meat/slab/bear/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
/obj/item/reagent_containers/food/snacks/meat/slab/xeno
name = "xeno meat"
desc = "A slab of meat."
icon_state = "xenomeat"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 3)
bitesize = 4
filling_color = "#32CD32"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/xeno
@@ -224,7 +239,7 @@
name = "spider meat"
desc = "A slab of spider meat. That is so Kafkaesque."
icon_state = "spidermeat"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#7CFC00"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/spider
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/spider
@@ -235,7 +250,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/toxin = 5, /datum/reagent/consumable/cooking_oil = 3)
icon_state = "goliathmeat"
tastes = list("meat" = 1)
foodtype = RAW | MEAT | TOXIC
@@ -248,7 +263,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat
name = "meatwheat clump"
desc = "This doesn't look like meat, but your standards aren't that high to begin with."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1)
filling_color = rgb(150, 0, 0)
icon_state = "meatwheat_clump"
bitesize = 4
@@ -258,7 +273,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/gorilla
name = "gorilla meat"
desc = "Much meatier than monkey meat."
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 5) //Plenty of fat!
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 5) //Plenty of fat!
/obj/item/reagent_containers/food/snacks/meat/rawbacon
name = "raw piece of bacon"
@@ -266,7 +281,7 @@
icon_state = "bacon"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/bacon
bitesize = 2
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/cooking_oil = 3)
filling_color = "#B22222"
tastes = list("bacon" = 1)
foodtype = RAW | MEAT
@@ -275,8 +290,8 @@
name = "piece of bacon"
desc = "A delicious piece of bacon."
icon_state = "baconcooked"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2)
filling_color = "#854817"
tastes = list("bacon" = 1)
foodtype = MEAT | BREAKFAST
@@ -284,7 +299,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/gondola
name = "gondola meat"
desc = "According to legends of old, consuming raw gondola flesh grants one inner peace."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3)
tastes = list("meat" = 4, "tranquility" = 1)
filling_color = "#9A6750"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/gondola
@@ -294,7 +309,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/penguin
name = "penguin meat"
desc = "A slab of penguin meat."
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/cooking_oil = 3)
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/penguin
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/penguin
filling_color = "#B22222"
@@ -306,7 +321,7 @@
icon_state = "crabmeatraw"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/crab
bitesize = 3
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cooking_oil = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cooking_oil = 3)
filling_color = "#EAD079"
tastes = list("raw crab" = 1)
foodtype = RAW | MEAT
@@ -316,7 +331,7 @@
desc = "Some deliciously cooked crab meat."
icon_state = "crabmeat"
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 2)
filling_color = "#DFB73A"
tastes = list("crab" = 1)
foodtype = MEAT
@@ -324,10 +339,14 @@
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
name = "chicken meat"
desc = "A slab of raw chicken. Remember to wash your hands!"
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6) //low fat
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
tastes = list("chicken" = 1)
+/obj/item/reagent_containers/food/snacks/meat/slab/chicken/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
@@ -335,8 +354,8 @@
name = "steak"
desc = "A piece of hot spicy meat."
icon_state = "meatsteak"
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
trash = /obj/item/trash/plate
filling_color = "#B22222"
foodtype = MEAT
@@ -397,7 +416,7 @@
icon_state = "rawcutlet"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain
bitesize = 2
- list_reagents = list(/datum/reagent/consumable/nutriment = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
filling_color = "#B22222"
tastes = list("meat" = 1)
var/meat_type = "meat"
@@ -434,6 +453,10 @@
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/bear
tastes = list("meat" = 1, "salmon" = 1)
+/obj/item/reagent_containers/food/snacks/meat/rawcutlet/bear/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB)
+
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/xeno
name = "raw xeno cutlet"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno
@@ -459,6 +482,10 @@
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
tastes = list("chicken" = 1)
+/obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB)
+
//Cooked cutlets
/obj/item/reagent_containers/food/snacks/meat/cutlet
@@ -466,8 +493,8 @@
desc = "A cooked meat cutlet."
icon_state = "cutlet"
bitesize = 2
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
filling_color = "#B22222"
tastes = list("meat" = 1)
foodtype = MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm
index 36f872100fb..cd643485e93 100644
--- a/code/modules/food_and_drinks/food/snacks_burgers.dm
+++ b/code/modules/food_and_drinks/food/snacks_burgers.dm
@@ -3,14 +3,14 @@
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "hburger"
bitesize = 3
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("bun" = 2, "beef patty" = 4)
foodtype = GRAIN | MEAT //lettuce doesn't make burger a vegetable.
/obj/item/reagent_containers/food/snacks/burger/plain
name = "burger"
desc = "The cornerstone of every nutritious breakfast."
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | MEAT
value = FOOD_FAST
@@ -32,7 +32,7 @@
var/subjectjob = null
name = "human burger"
desc = "A bloody burger."
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("bun" = 2, "long pig" = 4)
foodtype = MEAT | GRAIN | GROSS
value = FOOD_FAST
@@ -53,14 +53,14 @@
/obj/item/reagent_containers/food/snacks/burger/corgi
name = "corgi burger"
desc = "You monster."
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
foodtype = GRAIN | MEAT | GROSS
value = FOOD_EXOTIC
/obj/item/reagent_containers/food/snacks/burger/appendix
name = "appendix burger"
desc = "Tastes like appendicitis."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
icon_state = "appendixburger"
tastes = list("bun" = 4, "grass" = 2)
foodtype = GRAIN | MEAT | GROSS
@@ -70,7 +70,7 @@
name = "fillet -o- carp sandwich"
desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp."
icon_state = "fishburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("bun" = 4, "fish" = 4)
foodtype = GRAIN | MEAT
value = FOOD_EXOTIC
@@ -79,7 +79,7 @@
name = "tofu burger"
desc = "What.. is that meat?"
icon_state = "tofuburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("bun" = 4, "tofu" = 4)
foodtype = GRAIN | VEGETABLES
value = FOOD_FAST
@@ -109,7 +109,7 @@
name = "xenoburger"
desc = "Smells caustic. Tastes like heresy."
icon_state = "xburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("bun" = 4, "acid" = 4)
foodtype = GRAIN | MEAT
value = FOOD_EXOTIC
@@ -118,7 +118,7 @@
name = "bearger"
desc = "Best served rawr."
icon_state = "bearger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 6)
foodtype = GRAIN | MEAT
value = FOOD_EXOTIC
@@ -126,7 +126,8 @@
name = "clown burger"
desc = "This tastes funny..."
icon_state = "clownburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/banana = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/medicine/mannitol = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | FRUIT
value = FOOD_EXOTIC
@@ -273,8 +274,8 @@
name = "big bite burger"
desc = "Forget the Big Mac. THIS is the future!"
icon_state = "bigbiteburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6)
- list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/nutriment/vitamin = 2)
w_class = WEIGHT_CLASS_NORMAL
foodtype = GRAIN | MEAT | DAIRY
value = FOOD_RARE
@@ -301,8 +302,8 @@
name = "super bite burger"
desc = "This is a mountain of a burger. FOOD!"
icon_state = "superbiteburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 40, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/protein = 38, /datum/reagent/consumable/nutriment/vitamin = 5)
w_class = WEIGHT_CLASS_NORMAL
bitesize = 7
volume = 100
@@ -314,8 +315,8 @@
name = "five alarm burger"
desc = "HOT! HOT!"
icon_state = "fivealarmburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/condensedcapsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/condensedcapsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | MEAT
value = FOOD_RARE
@@ -323,7 +324,7 @@
name = "rat burger"
desc = "Pretty much what you'd expect..."
icon_state = "ratburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | MEAT | GROSS
value = FOOD_FAST
@@ -339,7 +340,7 @@
name = "bacon burger"
desc = "The perfect combination of all things American."
icon_state = "baconburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("bacon" = 4, "bun" = 2)
foodtype = GRAIN | MEAT
value = FOOD_RARE
@@ -357,7 +358,7 @@
name = "crab burger"
desc = "A delicious patty of the crabby kind, slapped in between a bun."
icon_state = "crabburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("bun" = 2, "crab meat" = 4)
foodtype = GRAIN | MEAT
value = FOOD_RARE
@@ -366,7 +367,7 @@
name = "soylent burger"
desc = "An eco-friendly burger made using upcycled low value biomass."
icon_state = "soylentburger"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("bun" = 2, "assistant" = 4)
foodtype = GRAIN | MEAT | DAIRY
value = FOOD_EXOTIC
@@ -375,7 +376,7 @@
name = "mcrib"
desc = "An elusive rib shaped burger with limited availablity across the galaxy. Not as good as you remember it."
icon_state = "mcrib"
- bonus_reagents = list(/datum/reagent/consumable/bbqsauce = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/bbqsauce = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("bun" = 2, "pork patty" = 4)
foodtype = GRAIN | MEAT
value = FOOD_RARE
@@ -385,7 +386,7 @@
desc = "A cheap and greasy imitation of an eggs benedict."
icon_state = "mcguffin"
tastes = list("muffin" = 2, "bacon" = 3)
- bonus_reagents = list(/datum/reagent/consumable/eggyolk = 3, /datum/reagent/consumable/nutriment = 1)
+ bonus_reagents = list(/datum/reagent/consumable/eggyolk = 3, /datum/reagent/consumable/nutriment/protein = 2)
foodtype = GRAIN | MEAT | BREAKFAST
value = FOOD_RARE
@@ -394,7 +395,7 @@
desc = "A delicious chicken sandwich, it is said the proceeds from this treat helps criminalize disarming people on the space frontier."
icon_state = "chickenburger"
tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1)
- bonus_reagents = list(/datum/reagent/consumable/mayonnaise = 3, /datum/reagent/consumable/cooking_oil = 2, /datum/reagent/consumable/nutriment = 2)
+ bonus_reagents = list(/datum/reagent/consumable/mayonnaise = 3, /datum/reagent/consumable/cooking_oil = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2)
foodtype = GRAIN | MEAT | FRIED
value = FOOD_RARE
@@ -403,7 +404,7 @@
desc = "This noble burger stands proudly clad in golden cheese."
icon_state = "cheeseburger"
tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 3)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | MEAT | DAIRY
value = FOOD_FAST
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index 2dcd0d24d82..721a72ec80b 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -64,8 +64,8 @@
icon_state = "braincake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brain
slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 16, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
value = FOOD_FAST
@@ -75,7 +75,7 @@
desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
icon_state = "braincakeslice"
filling_color = "#FF69B4"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
@@ -85,7 +85,7 @@
icon_state = "cheesecake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/cheese
slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/nutriment/protein = 5)
tastes = list("cake" = 4, "cream cheese" = 3)
foodtype = GRAIN | DAIRY
value = FOOD_RARE
@@ -96,6 +96,7 @@
icon_state = "cheesecake_slice"
filling_color = "#FFFACD"
tastes = list("cake" = 4, "cream cheese" = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 1,, /datum/reagent/consumable/nutriment/vitamin = 1)
foodtype = GRAIN | DAIRY
/obj/item/reagent_containers/food/snacks/store/cake/orange
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index b9cacc569cd..d7d25f90603 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -92,10 +92,10 @@
name = "fried egg"
desc = "A fried egg, with a touch of salt and pepper."
icon_state = "friedegg"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
bitesize = 1
filling_color = "#FFFFF0"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4)
tastes = list("egg" = 4, "salt" = 1, "pepper" = 1)
foodtype = MEAT | FRIED | BREAKFAST
value = FOOD_FAST
@@ -104,9 +104,9 @@
name = "boiled egg"
desc = "A hard boiled egg."
icon_state = "egg"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#FFFFF0"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("egg" = 1)
foodtype = MEAT | BREAKFAST
value = FOOD_JUNK
@@ -116,8 +116,9 @@
desc = "That's all you can say!"
icon_state = "omelette"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+
bitesize = 1
w_class = WEIGHT_CLASS_NORMAL
tastes = list("egg" = 1, "cheese" = 1)
@@ -146,10 +147,10 @@
name = "eggs benedict"
desc = "There is only one egg on this, how rude."
icon_state = "benedict"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/nutriment/protein = 2)
trash = /obj/item/trash/plate
w_class = WEIGHT_CLASS_NORMAL
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3,/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("egg" = 1, "bacon" = 1, "bun" = 1)
foodtype = MEAT | BREAKFAST | GRAIN
value = FOOD_EXOTIC
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index 90e069bef33..78a68db36da 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -8,10 +8,10 @@
desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!"
icon_state = "cubancarp"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4)
bitesize = 3
filling_color = "#CD853F"
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 1)
tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1)
foodtype = MEAT
value = FOOD_EXOTIC
@@ -20,7 +20,7 @@
name = "carp fillet"
desc = "A fillet of spess carp meat."
icon_state = "fishfillet"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
bitesize = 6
filling_color = "#FA8072"
tastes = list("fish" = 1)
@@ -30,6 +30,8 @@
/obj/item/reagent_containers/food/snacks/carpmeat/Initialize()
. = ..()
eatverb = pick("bite","chew","gnaw","swallow","chomp")
+ if(!istype(src, /obj/item/reagent_containers/food/snacks/carpmeat/imitation))
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB)
/obj/item/reagent_containers/food/snacks/carpmeat/imitation
name = "imitation carp fillet"
@@ -39,8 +41,8 @@
name = "fish fingers"
desc = "A finger of fish."
icon_state = "fishfingers"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3)
bitesize = 1
filling_color = "#CD853F"
tastes = list("fish" = 1, "breadcrumbs" = 1)
@@ -51,8 +53,8 @@
name = "fish and chips"
desc = "I do say so myself chap."
icon_state = "fishandchips"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3)
filling_color = "#FA8072"
tastes = list("fish" = 1, "chips" = 1)
foodtype = MEAT | VEGETABLES | FRIED
@@ -64,7 +66,7 @@
name = "tofu"
desc = "We all love tofu."
icon_state = "tofu"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
filling_color = "#F0E68C"
tastes = list("tofu" = 1)
foodtype = VEGETABLES
@@ -80,7 +82,7 @@
name = "spider leg"
desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
icon_state = "spiderleg"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/toxin = 2)
cooked_type = /obj/item/reagent_containers/food/snacks/boiledspiderleg
filling_color = "#000000"
tastes = list("cobwebs" = 1)
@@ -92,8 +94,8 @@
desc = "Now you can feel like a real tourist vacationing in Ireland."
icon_state = "cornedbeef"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4)
tastes = list("meat" = 1, "cabbage" = 1)
foodtype = MEAT | VEGETABLES
value = FOOD_RARE
@@ -113,7 +115,7 @@
name = "meatball"
desc = "A great meal all round. Not a cord of wood."
icon_state = "meatball"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#800000"
tastes = list("meat" = 1)
foodtype = MEAT
@@ -124,8 +126,8 @@
desc = "A piece of mixed, long meat."
icon_state = "sausage"
filling_color = "#CD5C5C"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("meat" = 1)
slices_num = 6
slice_path = /obj/item/reagent_containers/food/snacks/salami
@@ -142,7 +144,7 @@
desc = "A slice of cured salami."
icon_state = "salami"
filling_color = "#CD4122"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
tastes = list("meat" = 1, "smoke" = 1)
foodtype = MEAT
value = FOOD_JUNK
@@ -151,7 +153,7 @@
name = "raw khinkali"
desc = "One hundred khinkalis? Do I look like a pig?"
icon_state = "khinkali"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1)
cooked_type = /obj/item/reagent_containers/food/snacks/khinkali
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
foodtype = MEAT
@@ -161,7 +163,7 @@
name = "khinkali"
desc = "One hundred khinkalis? Do I look like a pig?"
icon_state = "khinkali"
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/garlic = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1)
bitesize = 3
filling_color = "#F0F0F0"
tastes = list("meat" = 1, "onions" = 1, "garlic" = 1)
@@ -235,10 +237,10 @@
name = "enchiladas"
desc = "Viva La Mexico!"
icon_state = "enchiladas"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
bitesize = 4
filling_color = "#FFA07A"
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/capsaicin = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 6)
tastes = list("hot peppers" = 1, "meat" = 3, "cheese" = 1, "sour cream" = 1)
foodtype = MEAT
value = FOOD_EXOTIC
@@ -248,8 +250,8 @@
desc = "Even non-vegetarians will LOVE this!"
icon_state = "stewedsoymeat"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 5)
filling_color = "#D2691E"
tastes = list("soy" = 1, "vegetables" = 1)
foodtype = VEGETABLES
@@ -264,8 +266,8 @@
desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
icon_state = "spiderlegcooked"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/capsaicin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/capsaicin = 2)
filling_color = "#000000"
tastes = list("hot peppers" = 1, "cobwebs" = 1)
foodtype = MEAT
@@ -276,8 +278,8 @@
desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
icon_state = "spidereggsham"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6)
bitesize = 4
filling_color = "#7FFF00"
tastes = list("meat" = 1, "the colour green" = 1)
@@ -288,18 +290,21 @@
name = "carp sashimi"
desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself."
icon_state = "sashimi"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/capsaicin = 5)
filling_color = "#FA8072"
tastes = list("fish" = 1, "hot peppers" = 1)
foodtype = MEAT | TOXIC
value = FOOD_EXOTIC
+/obj/item/reagent_containers/food/snacks/sashimi/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB)
/obj/item/reagent_containers/food/snacks/nugget
name = "chicken nugget"
filling_color = "#B22222"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2)
tastes = list("\"chicken\"" = 1)
foodtype = MEAT
value = FOOD_FAST
@@ -314,8 +319,8 @@
name = "pig in a blanket"
desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it."
icon_state = "pigblanket"
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#800000"
tastes = list("meat" = 1, "butter" = 1)
foodtype = MEAT | DAIRY
@@ -326,8 +331,8 @@
desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
icon_state = "ribs"
w_class = WEIGHT_CLASS_NORMAL
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/bbqsauce = 5)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/bbqsauce = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/bbqsauce = 5) //loose reagents included in the recipe do not get added to the finished food automatically.
tastes = list("meat" = 3, "smokey sauce" = 1)
foodtype = MEAT
value = FOOD_EXOTIC
@@ -351,14 +356,15 @@
trash = /obj/item/stack/rods
icon_state = "kebab"
w_class = WEIGHT_CLASS_NORMAL
- list_reagents = list(/datum/reagent/consumable/nutriment = 8)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 12)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2)
tastes = list("meat" = 3, "metal" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/kebab/human
name = "human-kebab"
desc = "A human meat, on a stick."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("tender meat" = 3, "metal" = 1)
foodtype = MEAT | GROSS
value = FOOD_FAST
@@ -366,7 +372,7 @@
/obj/item/reagent_containers/food/snacks/kebab/monkey
name = "meat-kebab"
desc = "Delicious meat, on a stick."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("meat" = 3, "metal" = 1)
foodtype = MEAT
value = FOOD_FAST
@@ -374,7 +380,7 @@
/obj/item/reagent_containers/food/snacks/kebab/tofu
name = "tofu-kebab"
desc = "Vegan meat, on a stick."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 1)
tastes = list("tofu" = 3, "metal" = 1)
foodtype = VEGETABLES
value = FOOD_FAST
@@ -382,7 +388,7 @@
/obj/item/reagent_containers/food/snacks/kebab/tail
name = "lizard-tail kebab"
desc = "Severed lizard tail on a stick."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 16, /datum/reagent/consumable/nutriment/vitamin = 4) //lizard tails are not reagent containers, so the bonus_reagents need to be set higher.
tastes = list("meat" = 8, "metal" = 4, "scales" = 1)
foodtype = MEAT
value = FOOD_RARE
@@ -392,7 +398,8 @@
desc = "Not so delicious rat meat, on a stick."
icon_state = "ratkebab"
w_class = WEIGHT_CLASS_NORMAL
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("rat meat" = 1, "metal" = 1)
foodtype = MEAT | GROSS
value = FOOD_FAST
@@ -401,12 +408,12 @@
name = "double rat-kebab"
icon_state = "doubleratkebab"
tastes = list("rat meat" = 2, "metal" = 1)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
value = FOOD_RARE
/obj/item/reagent_containers/food/snacks/kebab/fiesta
name = "fiesta skewer"
icon_state = "fiestaskewer"
tastes = list("tex-mex" = 3, "cumin" = 2)
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/capsaicin = 3)
value = FOOD_EXOTIC
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index cb30aef130c..f95999032bb 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -7,7 +7,7 @@
icon_state = "cheesewheel"
slice_path = /obj/item/reagent_containers/food/snacks/cheesewedge
slices_num = 5
- list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 5) //Hard cheeses contain about 25% protein
w_class = WEIGHT_CLASS_NORMAL
tastes = list("cheese" = 1)
foodtype = DAIRY
@@ -27,7 +27,7 @@
desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far."
icon_state = "cheesewedge"
filling_color = "#FFD700"
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("cheese" = 1)
foodtype = DAIRY
value = FOOD_JUNK
@@ -140,7 +140,7 @@
desc = "Dope from a soy."
icon_state = "soydope"
trash = /obj/item/trash/plate
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1)
filling_color = "#DEB887"
tastes = list("soy" = 1)
foodtype = VEGETABLES
@@ -213,7 +213,7 @@
name = "egg wrap"
desc = "The precursor to Pigs in a Blanket."
icon_state = "eggwrap"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
filling_color = "#F0E68C"
tastes = list("egg" = 1)
@@ -224,7 +224,7 @@
name = "spider eggs"
desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health."
icon_state = "spidereggs"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin = 2)
filling_color = "#008000"
tastes = list("cobwebs" = 1)
foodtype = MEAT | TOXIC
@@ -234,7 +234,7 @@
name = "spiderling"
desc = "It's slightly twitching in your hand. Ew..."
icon_state = "spiderling"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/toxin = 4)
filling_color = "#00800"
tastes = list("cobwebs" = 1, "guts" = 2)
foodtype = MEAT | TOXIC
@@ -244,7 +244,7 @@
name = "spider lollipop"
desc = "Still gross, but at least it has a mountain of sugar on it."
icon_state = "spiderlollipop"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //lollipop, but vitamins = toxins
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //lollipop, but vitamins = toxins
filling_color = "#00800"
tastes = list("cobwebs" = 1, "sugar" = 2)
foodtype = JUNKFOOD | SUGAR
@@ -289,8 +289,9 @@
desc = "The only good recipe for eggplant."
icon_state = "eggplantparm"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+
filling_color = "#BA55D3"
tastes = list("eggplant" = 3, "cheese" = 1)
foodtype = VEGETABLES | DAIRY
@@ -311,8 +312,8 @@
name = "burrito"
desc = "Tortilla wrapped goodness."
icon_state = "burrito"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2,/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#FFEFD5"
tastes = list("torilla" = 2, "meat" = 3)
foodtype = GRAIN | MEAT
@@ -322,8 +323,8 @@
name = "cheesy burrito"
desc = "It's a burrito filled with cheese."
icon_state = "cheesyburrito"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FFD800"
tastes = list("torilla" = 2, "meat" = 3, "cheese" = 1)
foodtype = GRAIN | MEAT | DAIRY
@@ -333,8 +334,8 @@
name = "carne asada burrito"
desc = "The best burrito for meat lovers."
icon_state = "carneburrito"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#A0522D"
tastes = list("torilla" = 2, "meat" = 4)
foodtype = GRAIN | MEAT
@@ -344,8 +345,8 @@
name = "fuego plasma burrito"
desc = "A super spicy burrito."
icon_state = "fuegoburrito"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
filling_color = "#FF2000"
tastes = list("torilla" = 2, "meat" = 3, "hot peppers" = 1)
foodtype = GRAIN | MEAT
@@ -400,8 +401,8 @@
name = "cheesy nachos"
desc = "The delicious combination of nachos and melting cheese."
icon_state = "cheesynachos"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
filling_color = "#FFD700"
tastes = list("nachos" = 2, "cheese" = 1)
foodtype = VEGETABLES | FRIED | DAIRY
@@ -446,8 +447,8 @@
name = "stuffed legion"
desc = "The former skull of a damned human, filled with goliath meat. It has a decorative lava pool made of ketchup and hotsauce."
icon_state = "stuffed_legion"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/capsaicin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2)
tastes = list("death" = 2, "rock" = 1, "meat" = 1, "hot peppers" = 1)
foodtype = MEAT
value = FOOD_LEGENDARY
@@ -640,8 +641,8 @@
name = "taco"
desc = "A traditional taco with meat, cheese, and lettuce."
icon_state = "taco"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "F0D830"
tastes = list("taco" = 4, "meat" = 2, "cheese" = 2, "lettuce" = 1)
foodtype = MEAT | DAIRY | GRAIN | VEGETABLES
@@ -650,8 +651,8 @@
/obj/item/reagent_containers/food/snacks/taco/plain
desc = "A traditional taco with meat and cheese, minus the rabbit food."
icon_state = "taco_plain"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("taco" = 4, "meat" = 2, "cheese" = 2)
foodtype = MEAT | DAIRY | GRAIN
@@ -767,8 +768,8 @@
desc = "Musical fruit in a slightly less musical container."
icon_state = "beans"
trash = /obj/item/trash/can/food/beans
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 10)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/ketchup = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 9)
filling_color = "#B22222"
tastes = list("beans" = 1)
foodtype = VEGETABLES
@@ -794,7 +795,8 @@
name = "Crab Rangoon"
desc = "Has many names, like crab puffs, cheese won'tons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab."
icon_state = "crabrangoon"
- list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/nutriment = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 7, /datum/reagent/consumable/nutriment/vitamin = 5)
filling_color = "#f2efdc"
w_class = WEIGHT_CLASS_SMALL
tastes = list("cream cheese" = 4, "crab" = 3, "crispiness" = 2)
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 650d2f98faf..f4d9b14caed 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -72,8 +72,8 @@
name = "Meat Donut"
desc = "Tastes as gross as it looks."
icon_state = "donut_meat"
- bonus_reagents = list(/datum/reagent/consumable/ketchup = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/ketchup = 2)
+ bonus_reagents = list(/datum/reagent/consumable/ketchup = 1, /datum/reagent/consumable/nutriment/protein = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/ketchup = 2)
tastes = list("meat" = 1)
foodtype = JUNKFOOD | MEAT | GROSS | FRIED | BREAKFAST
is_decorated = TRUE
@@ -376,8 +376,8 @@
name = "chawanmushi"
desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
icon_state = "chawanmushi"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/nutriment/protein = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 2)
filling_color = "#FFE4E1"
tastes = list("custard" = 1)
foodtype = GRAIN | MEAT | VEGETABLES
@@ -402,7 +402,7 @@
desc = "Not made of people. Honest." //Totally people.
icon_state = "soylent_green"
trash = /obj/item/trash/waffles
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#9ACD32"
tastes = list("waffles" = 7, "people" = 1)
@@ -414,7 +414,7 @@
desc = "Not made of people. Honest." //Actually honest for once.
icon_state = "soylent_yellow"
trash = /obj/item/trash/waffles
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#9ACD32"
tastes = list("waffles" = 7, "the colour green" = 1)
@@ -439,7 +439,7 @@
name = "\improper Donk-pocket"
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
@@ -450,7 +450,7 @@
name = "warm Donk-pocket"
desc = "The heated food of choice for the seasoned traitor."
bonus_reagents = list(/datum/reagent/medicine/omnizine = 3) //The original donk pocket has the most omnizine, can't beat the original on everything...
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 3)
cooked_type = null
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtype = GRAIN
@@ -469,7 +469,7 @@
name = "\improper Spicy-pocket"
desc = "The classic snack food, now with a heat-activated spicy flair."
icon_state = "donkpocketspicy"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/capsaicin = 2)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/spicy
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "spice" = 1)
@@ -480,7 +480,7 @@
desc = "The classic snack food, now maybe a bit too spicy."
icon_state = "donkpocketspicy"
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/capsaicin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/capsaicin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/capsaicin = 2)
tastes = list("meat" = 2, "dough" = 2, "weird spices" = 2)
foodtype = GRAIN
@@ -488,7 +488,7 @@
name = "\improper Teriyaki-pocket"
desc = "An east-asian take on the classic stationside snack."
icon_state = "donkpocketteriyaki"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/soysauce = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/soysauce = 2)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/teriyaki
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2)
@@ -498,8 +498,8 @@
name = "warm Teriyaki-pocket"
desc = "An east-asian take on the classic stationside snack, now steamy and warm."
icon_state = "donkpocketteriyaki"
- bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/soysauce = 2)
+ bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/nutriment/protein = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/soysauce = 2)
tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2)
foodtype = GRAIN
@@ -507,7 +507,7 @@
name = "\improper Pizza-pocket"
desc = "Delicious, cheesy and surprisingly filling."
icon_state = "donkpocketpizza"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/tomatojuice = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/tomatojuice = 2)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/pizza
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "cheese"= 2)
@@ -518,7 +518,7 @@
desc = "Delicious, cheesy, and even better when hot."
icon_state = "donkpocketpizza"
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/tomatojuice = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/tomatojuice = 2)
tastes = list("meat" = 2, "dough" = 2, "melty cheese"= 2)
foodtype = GRAIN
@@ -564,7 +564,7 @@
name = "\improper Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this.
icon_state = "donkpocketgondola"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/tranquility = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/tranquility = 5)
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/gondola
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
@@ -575,7 +575,7 @@
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least."
icon_state = "donkpocketgondola"
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 1, /datum/reagent/tranquility = 5)
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
foodtype = GRAIN
@@ -660,8 +660,8 @@
desc = "Fresh footlong ready to go down on."
icon_state = "hotdog"
bitesize = 3
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/ketchup = 3, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/ketchup = 3, /datum/reagent/consumable/nutriment/vitamin = 3)
filling_color = "#8B0000"
tastes = list("bun" = 3, "meat" = 2)
foodtype = GRAIN | MEAT | VEGETABLES
@@ -682,7 +682,8 @@
name = "khachapuri"
desc = "Bread with egg and cheese?"
icon_state = "khachapuri"
- list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FFFF4D"
tastes = list("bread" = 1, "egg" = 1, "cheese" = 1)
foodtype = GRAIN | MEAT | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 91be3368b40..39162f8a5c1 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -71,8 +71,8 @@
name = "beary pie"
desc = "No brown bears, this is a good sign."
icon_state = "bearypie"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("pie" = 1, "meat" = 1, "salmon" = 1)
foodtype = GRAIN | SUGAR | MEAT | FRUIT
value = FOOD_EXOTIC
@@ -81,7 +81,7 @@
name = "meat-pie"
icon_state = "meatpie"
desc = "An old barber recipe, very delicious!"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("pie" = 1, "meat" = 1)
foodtype = GRAIN | MEAT
value = FOOD_RARE
@@ -90,7 +90,7 @@
name = "tofu-pie"
icon_state = "meatpie"
desc = "A delicious tofu pie."
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("pie" = 1, "tofu" = 1)
foodtype = GRAIN
@@ -129,7 +129,7 @@
icon_state = "xenomeatpie"
desc = "A delicious meatpie. Probably heretical."
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("pie" = 1, "meat" = 1, "acid" = 1)
foodtype = GRAIN | MEAT
value = FOOD_EXOTIC
diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
index 896fbbaee9c..e59eccb36c2 100644
--- a/code/modules/food_and_drinks/food/snacks_pizza.dm
+++ b/code/modules/food_and_drinks/food/snacks_pizza.dm
@@ -6,7 +6,7 @@
w_class = WEIGHT_CLASS_NORMAL
slices_num = 6
volume = 80
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 28, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
foodtype = GRAIN | DAIRY | VEGETABLES
@@ -21,7 +21,9 @@
desc = "The most cheezy pizza in galaxy."
icon_state = "pizzamargherita"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/margherita
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5)
+ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1)
foodtype = GRAIN | VEGETABLES | DAIRY
value = FOOD_FAST
@@ -43,9 +45,8 @@
desc = "Greasy pizza with delicious meat."
icon_state = "meatpizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/meat
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 8)
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 8)
- tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 8)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 8)
foodtype = GRAIN | VEGETABLES| DAIRY | MEAT
value = FOOD_FAST
@@ -63,7 +64,7 @@
icon_state = "mushroompizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom
bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 28, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushroom" = 1)
foodtype = GRAIN | VEGETABLES | DAIRY
value = FOOD_FAST
@@ -100,8 +101,8 @@
desc = "Who thought this would be a good idea?"
icon_state = "donkpocketpizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/donkpocket
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/omnizine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/omnizine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD
value = FOOD_RARE
@@ -138,7 +139,8 @@
desc = "You can really smell the sassiness."
icon_state = "sassysagepizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/sassysage
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1)
foodtype = GRAIN | VEGETABLES | DAIRY
value = FOOD_EXOTIC
@@ -156,7 +158,8 @@
desc = "The pizza equivalent of Einstein's riddle."
icon_state = "pineapplepizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/pineapple
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 7)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/pineapplejuice = 8)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 2, "ham" = 2)
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE
value = FOOD_RARE
@@ -174,7 +177,7 @@
desc = "Hello, you've reached Arnold's pizza shop. I'm not here now, I'm out killing pepperoni."
icon_state = "arnoldpizza"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/arnold
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/nutriment/protein = 9, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2)
value = FOOD_ILLEGAL
@@ -241,3 +244,17 @@
qdel(src)
return
return ..()
+
+/obj/item/reagent_containers/food/snacks/pizzaslice/moldy
+ name = "moldy pizza slice"
+ desc = "This was once a perfectly good slice of pizza pie, but now it lies here, rancid and bursting with spores. What a bummer! But we should not dwell on the past, only look towards the future."
+ icon_state = "moldy_slice"
+ filling_color = "#e9d075"
+ bitesize = 4
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/peptides = 3, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/toxin/amatoxin = 2)
+ tastes = list("stale crust" = 1, "rancid cheese" = 2, "mushroom" = 1)
+ foodtype = GRAIN | VEGETABLES | DAIRY | GROSS
+
+/obj/item/reagent_containers/food/snacks/pizzaslice/moldy/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOLD, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 25)
diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm
index 9a863d0a2fb..a005432e961 100644
--- a/code/modules/food_and_drinks/food/snacks_salad.dm
+++ b/code/modules/food_and_drinks/food/snacks_salad.dm
@@ -38,7 +38,7 @@
desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it."
icon_state = "validsalad"
bonus_reagents = list(/datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("leaves" = 1, "potato" = 1, "meat" = 1, "valids" = 1)
foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT
value = FOOD_RARE
@@ -107,6 +107,7 @@
desc = "Everybody loves rice pudding!"
icon_state = "ricepudding"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("rice" = 1, "sweetness" = 1)
foodtype = GRAIN | DAIRY
value = FOOD_FAST
@@ -116,7 +117,8 @@
name = "rice and pork"
desc = "Well, it looks like pork..."
icon_state = "riceporkbowl"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("rice" = 1, "meat" = 1)
foodtype = GRAIN | MEAT
value = FOOD_FAST
@@ -125,7 +127,8 @@
name = "egg bowl"
desc = "A bowl of rice with a fried egg."
icon_state = "eggbowl"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("rice" = 1, "egg" = 1)
foodtype = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017
value = FOOD_RARE //No that's wrong ninja what the hell ~ArcaneMusic 2k20
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index fb47f121789..5a3137a1636 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "sandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
cooked_type = /obj/item/reagent_containers/food/snacks/toastedsandwich
tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1)
foodtype = GRAIN | VEGETABLES
@@ -18,7 +18,7 @@
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/carbon = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/carbon = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/carbon = 2)
tastes = list("toast" = 1)
foodtype = GRAIN
value = FOOD_FAST
@@ -29,8 +29,8 @@
icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("toast" = 1, "cheese" = 1)
foodtype = GRAIN | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
index d2fae57b696..8c44928802a 100644
--- a/code/modules/food_and_drinks/food/snacks_soup.dm
+++ b/code/modules/food_and_drinks/food/snacks_soup.dm
@@ -35,7 +35,8 @@
name = "meatball soup"
desc = "You've got balls kid, BALLS!"
icon_state = "meatballsoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("meat" = 1)
foodtype = MEAT
value = FOOD_RARE
@@ -54,8 +55,8 @@
name = "tomato soup"
desc = "Smells like copper."
icon_state = "tomatosoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6)
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/blood = 10, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/blood = 10, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("iron" = 1)
foodtype = GROSS
value = FOOD_EXOTIC
@@ -65,8 +66,8 @@
desc = "A savory dish of alien wing wang in soy."
icon_state = "wingfangchu"
trash = /obj/item/reagent_containers/glass/bowl
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/soysauce = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/soysauce = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/soysauce = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
tastes = list("soy" = 1)
foodtype = MEAT
value = FOOD_EXOTIC
@@ -94,7 +95,8 @@
name = "nettle soup"
desc = "To think, the botanist would've beat you to death with one of these."
icon_state = "nettlesoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("nettles" = 1)
foodtype = VEGETABLES
value = FOOD_EXOTIC
@@ -104,7 +106,7 @@
desc = "The mystery is, why aren't you eating it?"
icon_state = "mysterysoup"
var/extra_reagent = null
- list_reagents = list(/datum/reagent/consumable/nutriment = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 5)
tastes = list("chaos" = 1)
value = FOOD_EXOTIC
@@ -119,8 +121,8 @@
name = "hot chili"
desc = "A five alarm Texan Chili!"
icon_state = "hotchili"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/capsaicin = 3, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("hot peppers" = 1)
foodtype = VEGETABLES | MEAT
value = FOOD_RARE
@@ -129,8 +131,8 @@
name = "cold chili"
desc = "This slush is barely a liquid!"
icon_state = "coldchili"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/frostoil = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/frostoil = 3, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("tomato" = 1, "mint" = 1)
foodtype = VEGETABLES | MEAT
value = FOOD_EXOTIC
@@ -149,8 +151,8 @@
name = "monkey's delight"
desc = "A delicious soup with dumplings and hunks of monkey meat simmered to perfection, in a broth that tastes faintly of bananas."
icon_state = "monkeysdelight"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 8, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("the jungle" = 1, "banana" = 1)
foodtype = FRUIT
value = FOOD_RARE
@@ -169,7 +171,8 @@
name = "eyeball soup"
desc = "It looks back at you..."
icon_state = "eyeballsoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/liquidgibs = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/liquidgibs = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("tomato" = 1, "squirming" = 1)
foodtype = MEAT | GROSS
value = FOOD_RARE
@@ -178,7 +181,8 @@
name = "milosoup"
desc = "The universes best soup! Yum!!!"
icon_state = "milosoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
tastes = list("milo" = 1) // wtf is milo
foodtype = VEGETABLES
value = FOOD_FAST
@@ -262,7 +266,8 @@
name = "french onion soup"
desc = "Good enough to make a grown mime cry."
icon_state = "onionsoup"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/tomatojuice = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/tomatojuice = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
tastes = list("caramelized onions" = 1)
foodtype = VEGETABLES
value = FOOD_FAST
@@ -271,7 +276,8 @@
name = "bisque"
desc = "A classic entree from Space-France."
icon_state = "bisque"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 6)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("creamy texture" = 1, "crab" = 4)
foodtype = MEAT
value = FOOD_EXOTIC
@@ -291,7 +297,7 @@
desc = "A spicy vegetable curry made with the humble bungo fruit, Exotic!"
icon_state = "bungocurry"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/bungojuice = 6)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 5)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bungojuice = 6, /datum/reagent/consumable/capsaicin = 5)
tastes = list("bungo" = 2, "hot curry" = 4, "tropical sweetness" = 1)
filling_color = "#E6A625"
foodtype = VEGETABLES | FRUIT | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
index 73dc0011cca..975c2982340 100644
--- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm
+++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
@@ -62,10 +62,10 @@
desc = "Now that's a nic'e meatball!"
icon_state = "meatballspaghetti"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1,/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/nutriment/vitamin = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
cooked_type = null
- tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+ tastes = list("pasta" = 1, "meat" = 1)
foodtype = GRAIN | MEAT
value = FOOD_FAST
@@ -74,10 +74,10 @@
desc = "A lawyers favourite."
icon_state = "spesslaw"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/protein = 5, /datum/reagent/consumable/nutriment/vitamin = 3)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/protein = 20, /datum/reagent/consumable/nutriment/vitamin = 3)
cooked_type = null
- tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
+ tastes = list("pasta" = 1, "meat" = 1)
value = FOOD_RARE
/obj/item/reagent_containers/food/snacks/spaghetti/chowmein
@@ -85,8 +85,8 @@
desc = "A nice mix of noodles and fried vegetables."
icon_state = "chowmein"
trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 6)
cooked_type = null
tastes = list("noodle" = 1, "tomato" = 1)
value = FOOD_RARE
@@ -96,7 +96,7 @@
desc = "Nutritious, beefy and noodly."
icon_state = "beefnoodle"
trash = /obj/item/reagent_containers/glass/bowl
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/liquidgibs = 3)
cooked_type = null
tastes = list("noodle" = 1, "meat" = 1)
foodtype = GRAIN | MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index 0a316c0fbe8..ab16d77d641 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -50,7 +50,7 @@
icon_state = "sosjerky"
desc = "Beef jerky made from the finest space cows."
trash = /obj/item/trash/sosjerky
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/sodiumchloride = 2)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/sodiumchloride = 2)
junkiness = 25
filling_color = "#8B0000"
tastes = list("dried meat" = 1)
@@ -60,7 +60,7 @@
/obj/item/reagent_containers/food/snacks/sosjerky/healthy
name = "homemade beef jerky"
desc = "Homemade beef jerky made from the finest space cows."
- list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment/protein = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
junkiness = 0
value = FOOD_FAST
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 7ce6592bb9a..62e17b9020e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -57,7 +57,7 @@
/obj/machinery/gibber/container_resist_act(mob/living/user)
go_out()
-/obj/machinery/gibber/relaymove(mob/living/user)
+/obj/machinery/gibber/relaymove(mob/living/user, direction)
go_out()
/obj/machinery/gibber/attack_hand(mob/user)
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 1b45c0fbb6e..824e1176937 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -238,7 +238,7 @@
HE.safety(active)
/obj/machinery/computer/holodeck/proc/load_program(area/A, force = FALSE, add_delay = TRUE)
- if(!is_operational())
+ if(!is_operational)
A = offline_program
force = TRUE
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index 9ad2d12e1dc..a576a55c60e 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -35,12 +35,13 @@
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- ..()
if(visualsOnly)
- return
+ return ..()
- var/datum/job/lawyer/J = SSjob.GetJobType(jobtype)
- J.lawyers++
- if(J.lawyers>1)
+ var/static/use_purple_suit = FALSE //If there is one lawyer, they get the default blue suit. If another lawyer joins the round, they start with a purple suit.
+ if(use_purple_suit)
uniform = /obj/item/clothing/under/rank/civilian/lawyer/purpsuit
suit = /obj/item/clothing/suit/toggle/lawyer/purple
+ else
+ use_purple_suit = TRUE
+ ..()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 35e7474d2a5..81fd4710e94 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -56,8 +56,8 @@
var/datum/db_query/query_library_count_books = SSdbcore.NewQuery({"
SELECT COUNT(id) FROM [format_table_name("library")]
WHERE isnull(deleted)
- AND author LIKE '%' + :author + '%'
- AND title LIKE '%' + :title + '%'
+ AND author LIKE CONCAT('%',:author,'%')
+ AND title LIKE CONCAT('%',:title,'%')
AND (:category = 'Any' OR category = :category)
"}, list("author" = author, "title" = title, "category" = category))
if(!query_library_count_books.warn_execute())
@@ -80,8 +80,8 @@
SELECT author, title, category, id
FROM [format_table_name("library")]
WHERE isnull(deleted)
- AND author LIKE '%' + :author + '%'
- AND title LIKE '%' + :title + '%'
+ AND author LIKE CONCAT('%',:author,'%')
+ AND title LIKE CONCAT('%',:title,'%')
AND (:category = 'Any' OR category = :category)
LIMIT :skip, :take
"}, list("author" = author, "title" = title, "category" = category, "skip" = booksperpage * search_page, "take" = booksperpage))
diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm
index 4dda9f6f465..b61842784f3 100644
--- a/code/modules/library/skill_learning/skill_station.dm
+++ b/code/modules/library/skill_learning/skill_station.dm
@@ -44,7 +44,7 @@
if(working)
. += "working"
-/obj/machinery/skill_station/relaymove(mob/user)
+/obj/machinery/skill_station/relaymove(mob/living/user, direction)
open_machine()
/obj/machinery/skill_station/open_machine()
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index 9583918c6c2..2668becd1eb 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -16,9 +16,11 @@
return ..()
//While players are only allowed to build in the base area, but consoles starting outside the base can move into the base area to begin work.
-/mob/camera/ai_eye/remote/base_construction/relaymove(mob/user, direct)
- dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated
- ..()
+
+/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction)
+ dir = direction //This camera eye is visible as a drone, and needs to keep the dir updated
+ return ..()
+
/obj/item/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
name = "internal RCD"
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 8779d97648e..05a4dec912a 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -473,7 +473,7 @@
var/obj/item/bodypart/BP = new path ()
BP.owner = src
BP.held_index = i
- bodyparts += BP
+ add_bodypart(BP)
hand_bodyparts[i] = BP
..() //Don't redraw hands until we have organs for them
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 9d61a9039e0..c09fef670ad 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -8,7 +8,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/canmove = TRUE
-/obj/effect/dummy/phased_mob/slaughter/relaymove(mob/user, direction)
+/obj/effect/dummy/phased_mob/slaughter/relaymove(mob/living/user, direction)
forceMove(get_step(src,direction))
/obj/effect/dummy/phased_mob/slaughter/ex_act()
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 6798f7c650a..9b3d62f61cd 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -219,7 +219,7 @@
else
. += "\The [src] indicates that the brain is active."
-/obj/item/mmi/relaymove(mob/user)
+/obj/item/mmi/relaymove(mob/living/user, direction)
return //so that the MMI won't get a warning about not being able to move if it tries to move
/obj/item/mmi/proc/brain_check(mob/user)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index d79036b57b9..4deaa1ee8f6 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -114,7 +114,9 @@ Des: Removes all infected images from the alien.
return
/mob/living/carbon/alien/canBeHandcuffed()
- return 1
+ if(num_hands < 2)
+ return FALSE
+ return TRUE
/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0)
return initial(pixel_y)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 25a1b2b2613..e6fe7f1346a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -18,8 +18,14 @@
var/sneaking = 0 //For sneaky-sneaky mode and appropriate slowdown
var/drooling = 0 //For Neruotoxic spit overlays
deathsound = 'sound/voice/hiss6.ogg'
- bodyparts = list(/obj/item/bodypart/chest/alien, /obj/item/bodypart/head/alien, /obj/item/bodypart/l_arm/alien,
- /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien)
+ bodyparts = list(
+ /obj/item/bodypart/chest/alien,
+ /obj/item/bodypart/head/alien,
+ /obj/item/bodypart/l_arm/alien,
+ /obj/item/bodypart/r_arm/alien,
+ /obj/item/bodypart/r_leg/alien,
+ /obj/item/bodypart/l_leg/alien,
+ )
/mob/living/carbon/alien/humanoid/Initialize()
. = ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
index 1d0842b5f7a..6ca74172a48 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm
@@ -12,7 +12,7 @@
else
icon_state = "alien[caste]_dead"
- else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed())
+ else if((stat == UNCONSCIOUS && !asleep) || stat == HARD_CRIT || stat == SOFT_CRIT || IsParalyzed())
icon_state = "alien[caste]_unconscious"
else if(leap_on_click)
icon_state = "alien[caste]_pounce"
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index bd21aa06291..de5eafc5b28 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -11,13 +11,22 @@
health = 25
hardcrit_threshold = HEALTH_THRESHOLD_CRIT
+ rotate_on_lying = FALSE
+
+ default_num_legs = 1
+ num_legs = 1 //Alien larvas always have a movable apendage.
+ usable_legs = 1 //Alien larvas always have a movable apendage.
+ default_num_hands = 0
+
+ bodyparts = list(
+ /obj/item/bodypart/chest/larva,
+ /obj/item/bodypart/head/larva,
+ )
+
var/amount_grown = 0
var/max_grown = 100
var/time_of_birth
- rotate_on_lying = 0
- bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva)
-
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/Initialize()
@@ -74,3 +83,7 @@
/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who)
to_chat(src, "You don't have the dexterity to do this!")
return
+
+
+/mob/living/carbon/alien/larva/canBeHandcuffed()
+ return TRUE
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 61ae8acf204..b0f0e6363ac 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -172,8 +172,9 @@
/mob/living/carbon/restrained(ignore_grab)
. = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
+
/mob/living/carbon/proc/canBeHandcuffed()
- return 0
+ return FALSE
/mob/living/carbon/show_inv(mob/user)
@@ -681,7 +682,7 @@
severity = 9
if(-INFINITY to -95)
severity = 10
- if(!InFullCritical())
+ if(stat != HARD_CRIT)
var/visionseverity = 4
switch(health)
if(-8 to -4)
@@ -804,18 +805,20 @@
if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH))
death()
return
- if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
+ if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))
+ set_stat(HARD_CRIT)
+ else if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT))
set_stat(UNCONSCIOUS)
+ else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
+ set_stat(SOFT_CRIT)
else
- if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
- set_stat(SOFT_CRIT)
- else
- set_stat(CONSCIOUS)
+ set_stat(CONSCIOUS)
update_mobility()
update_damage_hud()
update_health_hud()
med_hud_set_status()
+
//called when we get cuffed/uncuffed
/mob/living/carbon/proc/update_handcuffed()
if(handcuffed)
@@ -931,22 +934,55 @@
/mob/living/carbon/fakefireextinguish()
remove_overlay(FIRE_LAYER)
+
/mob/living/carbon/proc/create_bodyparts()
var/l_arm_index_next = -1
var/r_arm_index_next = 0
- for(var/X in bodyparts)
- var/obj/item/bodypart/O = new X()
- O.owner = src
- bodyparts.Remove(X)
- bodyparts.Add(O)
- if(O.body_part == ARM_LEFT)
- l_arm_index_next += 2
- O.held_index = l_arm_index_next //1, 3, 5, 7...
- hand_bodyparts += O
- else if(O.body_part == ARM_RIGHT)
- r_arm_index_next += 2
- O.held_index = r_arm_index_next //2, 4, 6, 8...
- hand_bodyparts += O
+ for(var/bodypart_path in bodyparts)
+ var/obj/item/bodypart/bodypart_instance = new bodypart_path()
+ bodypart_instance.owner = src
+ bodyparts.Remove(bodypart_path)
+ add_bodypart(bodypart_instance)
+ switch(bodypart_instance.body_part)
+ if(ARM_LEFT)
+ l_arm_index_next += 2
+ bodypart_instance.held_index = l_arm_index_next //1, 3, 5, 7...
+ hand_bodyparts += bodypart_instance
+ if(ARM_RIGHT)
+ r_arm_index_next += 2
+ bodypart_instance.held_index = r_arm_index_next //2, 4, 6, 8...
+ hand_bodyparts += bodypart_instance
+
+
+///Proc to hook behavior on bodypart additions.
+/mob/living/carbon/proc/add_bodypart(obj/item/bodypart/new_bodypart)
+ bodyparts += new_bodypart
+
+ switch(new_bodypart.body_part)
+ if(LEG_LEFT, LEG_RIGHT)
+ set_num_legs(num_legs + 1)
+ if(!new_bodypart.bodypart_disabled)
+ set_usable_legs(usable_legs + 1)
+ if(ARM_LEFT, ARM_RIGHT)
+ set_num_hands(num_hands + 1)
+ if(!new_bodypart.bodypart_disabled)
+ set_usable_hands(usable_hands + 1)
+
+
+///Proc to hook behavior on bodypart removals.
+/mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart)
+ bodyparts -= old_bodypart
+
+ switch(old_bodypart.body_part)
+ if(LEG_LEFT, LEG_RIGHT)
+ set_num_legs(num_legs - 1)
+ if(!old_bodypart.bodypart_disabled)
+ set_usable_legs(usable_legs - 1)
+ if(ARM_LEFT, ARM_RIGHT)
+ set_num_hands(num_hands - 1)
+ if(!old_bodypart.bodypart_disabled)
+ set_usable_hands(usable_hands - 1)
+
/mob/living/carbon/do_after_coefficent()
. = ..()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 4402b9ea2eb..2ea7700ca74 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -480,7 +480,7 @@
/// Check ourselves to see if we've got any shrapnel, return true if we do. This is a much simpler version of what humans do, we only indicate we're checking ourselves if there's actually shrapnel
/mob/living/carbon/proc/check_self_for_injuries()
- if(stat == DEAD || stat == UNCONSCIOUS)
+ if(stat >= UNCONSCIOUS)
return
var/embeds = FALSE
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 7385403352e..a877729c0cb 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -6,6 +6,10 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD)
has_limbs = 1
held_items = list(null, null)
+ num_legs = 0 //Populated on init through list/bodyparts
+ usable_legs = 0 //Populated on init through list/bodyparts
+ num_hands = 0 //Populated on init through list/bodyparts
+ usable_hands = 0 //Populated on init through list/bodyparts
var/list/internal_organs = list() ///List of [/obj/item/organ] in the mob. They don't go in the contents for some reason I don't want to know.
var/list/internal_organs_slot= list() ///Same as [above][/mob/living/carbon/var/internal_organs], but stores "slot ID" - "organ" pairs for easy access.
var/silent = 0 ///Can't talk. Value goes down every life proc. NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
@@ -44,8 +48,14 @@
var/tinttotal = 0 /// Total level of visualy impairing items
///Gets filled up in [create_bodyparts()][/mob/living/carbon/proc/create_bodyparts]
- var/list/bodyparts = list(/obj/item/bodypart/chest, /obj/item/bodypart/head, /obj/item/bodypart/l_arm,
- /obj/item/bodypart/r_arm, /obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg)
+ var/list/bodyparts = list(
+ /obj/item/bodypart/chest,
+ /obj/item/bodypart/head,
+ /obj/item/bodypart/l_arm,
+ /obj/item/bodypart/r_arm,
+ /obj/item/bodypart/r_leg,
+ /obj/item/bodypart/l_leg,
+ )
var/list/hand_bodyparts = list() ///a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index a7a683a764e..18b18009bda 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -30,3 +30,43 @@
adjust_nutrition(-(HUNGER_FACTOR/10))
if(m_intent == MOVE_INTENT_RUN)
adjust_nutrition(-(HUNGER_FACTOR/10))
+
+
+/mob/living/carbon/set_usable_legs(new_value)
+ . = ..()
+ if(isnull(.))
+ return
+ if(. == 0)
+ if(usable_legs != 0) //From having no usable legs to having some.
+ REMOVE_TRAIT(src, TRAIT_FLOORED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ else if(usable_legs == 0 && !(movement_type & (FLYING | FLOATING))) //From having usable legs to no longer having them.
+ ADD_TRAIT(src, TRAIT_FLOORED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ if(!usable_hands)
+ ADD_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+
+
+/mob/living/carbon/set_usable_hands(new_value)
+ . = ..()
+ if(isnull(.))
+ return
+ if(. == 0)
+ if(usable_hands != 0) //From having no usable hands to having some.
+ REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ else if(usable_hands == 0) //From having usable hands to no longer having them.
+ if(!usable_legs && !(movement_type & (FLYING | FLOATING)))
+ ADD_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+
+
+/mob/living/carbon/setMovetype(newval)
+ . = ..()
+ if(isnull(.))
+ return
+ if(. & !(FLYING | FLOATING))
+ if(movement_type & (FLYING | FLOATING)) //From not flying to flying.
+ REMOVE_TRAIT(src, TRAIT_FLOORED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ else if(!(movement_type & (FLYING | FLOATING)) && !usable_legs) //From flying to no longer flying.
+ ADD_TRAIT(src, TRAIT_FLOORED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
+ if(!usable_hands)
+ ADD_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 408c4bbf124..464e47a22a6 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -42,7 +42,7 @@
cooldown = 6 SECONDS
/datum/emote/living/carbon/crack/can_run_emote(mob/living/carbon/user, status_check = TRUE , intentional)
- if(user.get_num_arms() <= 1)
+ if(user.usable_hands < 2)
return FALSE
return ..()
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 12ecaffcd3f..a0ed1a43504 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -37,7 +37,7 @@
var/list/disabled = list()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
- if(BP.disabled)
+ if(BP.bodypart_disabled)
disabled += BP
missing -= BP.body_zone
for(var/obj/item/I in BP.embedded_objects)
@@ -125,10 +125,11 @@
. += msg.Join("")
if(!appears_dead)
- if(stat == UNCONSCIOUS)
- . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep."
- else if(InCritical())
- . += "[t_His] breathing is shallow and labored."
+ switch(stat)
+ if(SOFT_CRIT)
+ . += "[t_His] breathing is shallow and labored."
+ if(UNCONSCIOUS, HARD_CRIT)
+ . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep."
var/trait_exam = common_trait_examine()
if (!isnull(trait_exam))
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 1a17d1d0603..09aa0abee62 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -51,9 +51,8 @@
if(gloves && !(ITEM_SLOT_GLOVES in obscured))
. += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands."
else if(FR && length(FR.blood_DNA))
- var/hand_number = get_num_arms(FALSE)
- if(hand_number)
- . += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!"
+ if(num_hands)
+ . += "[t_He] [t_has] [num_hands > 1 ? "" : "a"] blood-stained hand[num_hands > 1 ? "s" : ""]!"
//handcuffed?
@@ -142,7 +141,7 @@
var/list/disabled = list()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
- if(BP.disabled)
+ if(BP.bodypart_disabled)
disabled += BP
missing -= BP.body_zone
for(var/obj/item/I in BP.embedded_objects)
@@ -339,13 +338,14 @@
msg += "[t_He] [t_has] a holy aura about [t_him].\n"
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted)
- if(stat == UNCONSCIOUS)
- msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
- else
- if(HAS_TRAIT(src, TRAIT_DUMB))
- msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
- if(InCritical())
+ switch(stat)
+ if(UNCONSCIOUS, HARD_CRIT)
+ msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
+ if(SOFT_CRIT)
msg += "[t_He] [t_is] barely conscious.\n"
+ if(CONSCIOUS)
+ if(HAS_TRAIT(src, TRAIT_DUMB))
+ msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if(getorgan(/obj/item/organ/brain))
if(!key)
msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 046fb020acd..13c8f37e926 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -694,7 +694,7 @@
check_self_for_injuries()
/mob/living/carbon/human/check_self_for_injuries()
- if(stat == DEAD || stat == UNCONSCIOUS)
+ if(stat >= UNCONSCIOUS)
return
var/list/combined_msg = list()
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index ba46c3d124f..62237843e99 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -4,10 +4,10 @@
/mob/living/carbon/human/canBeHandcuffed()
- if(get_num_arms(FALSE) >= 2)
- return TRUE
- else
+ if(num_hands < 2)
return FALSE
+ return TRUE
+
//gets assignment from ID or ID inside PDA or PDA itself
//Useful when player do something with computers
diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm
index fe32c33cf0a..194766acdca 100644
--- a/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -175,7 +175,7 @@ There are several things that need to be remembered:
if(!gloves && blood_in_hands)
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
- if(get_num_arms(FALSE) < 2)
+ if(num_hands < 2)
if(has_left_hand(FALSE))
bloody_overlay.icon_state = "bloodyhands_left"
else if(has_right_hand(FALSE))
@@ -255,7 +255,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_inv_shoes()
remove_overlay(SHOES_LAYER)
- if(get_num_legs(FALSE) <2)
+ if(num_legs < 2)
return
if(client && hud_used)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 199ea66505d..df83aea6a9b 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -663,7 +663,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
- if(H.socks && H.get_num_legs(FALSE) >= 2 && !(DIGITIGRADE in species_traits))
+ if(H.socks && H.num_legs >= 2 && !(DIGITIGRADE in species_traits))
var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
if(socks)
standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
@@ -920,9 +920,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!I.species_exception || !is_type_in_list(src, I.species_exception))
return FALSE
- var/num_arms = H.get_num_arms(FALSE)
- var/num_legs = H.get_num_legs(FALSE)
-
switch(slot)
if(ITEM_SLOT_HANDS)
if(H.get_empty_held_indexes())
@@ -959,7 +956,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_GLOVES) )
return FALSE
- if(num_arms < 2)
+ if(H.num_hands < 2)
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
if(ITEM_SLOT_FEET)
@@ -967,7 +964,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_FEET) )
return FALSE
- if(num_legs < 2)
+ if(H.num_legs < 2)
return FALSE
if(DIGITIGRADE in species_traits)
if(!disable_warning)
@@ -1086,7 +1083,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!istype(I, /obj/item/restraints/handcuffs))
return FALSE
- if(num_arms < 2)
+ if(H.num_hands < 2)
return FALSE
return TRUE
if(ITEM_SLOT_LEGCUFFED)
@@ -1094,7 +1091,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
if(!istype(I, /obj/item/restraints/legcuffs))
return FALSE
- if(num_legs < 2)
+ if(H.num_legs < 2)
return FALSE
return TRUE
if(ITEM_SLOT_BACKPACK)
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 2a9422be7a4..fd6dd45a67c 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -17,9 +17,13 @@
for(var/X in C.bodyparts)
var/obj/item/bodypart/O = X
O.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE)
+ O.brute_reduction = 5
+ O.burn_reduction = 4
/datum/species/android/on_species_loss(mob/living/carbon/C)
. = ..()
for(var/X in C.bodyparts)
var/obj/item/bodypart/O = X
O.change_bodypart_status(BODYPART_ORGANIC,FALSE, TRUE)
+ O.brute_reduction = initial(O.brute_reduction)
+ O.burn_reduction = initial(O.burn_reduction)
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 3d5f5fd34d4..e51f0a1658e 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -57,7 +57,7 @@
if(!limbs_to_consume.len)
H.losebreath++
return
- if(H.get_num_legs(FALSE)) //Legs go before arms
+ if(H.num_legs) //Legs go before arms
limbs_to_consume -= list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM)
consumed_limb = H.get_bodypart(pick(limbs_to_consume))
consumed_limb.drop_limb()
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 5e4ec8b810f..a2b3d7e2dbe 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -59,7 +59,7 @@
//They must be restrained, beheaded or gibbed to stop being a threat.
if(regen_cooldown < world.time)
var/heal_amt = heal_rate
- if(C.InCritical())
+ if(HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION))
heal_amt *= 2
C.heal_overall_damage(heal_amt,heal_amt)
C.adjustToxLoss(-heal_amt)
@@ -67,7 +67,7 @@
var/datum/wound/iter_wound = i
if(prob(4-iter_wound.severity))
iter_wound.remove_wound()
- if(!C.InCritical() && prob(4))
+ if(!HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION) && prob(4))
playsound(C, pick(spooks), 50, TRUE, 10)
//Congrats you somehow died so hard you stopped being a zombie
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 85e1cd6fcb0..b7d0e223392 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -14,8 +14,14 @@
unique_name = TRUE
can_be_shoved_into = TRUE
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
- bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
- /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
+ bodyparts = list(
+ /obj/item/bodypart/chest/monkey,
+ /obj/item/bodypart/head/monkey,
+ /obj/item/bodypart/l_arm/monkey,
+ /obj/item/bodypart/r_arm/monkey,
+ /obj/item/bodypart/r_leg/monkey,
+ /obj/item/bodypart/l_leg/monkey,
+ )
hud_type = /datum/hud/monkey
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
@@ -119,6 +125,8 @@
return FALSE
/mob/living/carbon/monkey/canBeHandcuffed()
+ if(num_hands < 2)
+ return FALSE
return TRUE
/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index c5bfae2647d..fc0f1fcaf7c 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -246,8 +246,8 @@
message_param = initial(message_param) // reset
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.get_num_arms() == 0)
- if(H.get_num_legs() != 0)
+ if(H.usable_hands == 0)
+ if(H.usable_legs != 0)
message_param = "tries to point at %t with a leg, falling down in the process!"
H.Paralyze(20)
else
diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm
index c1b608ab46e..f3054ca9af6 100644
--- a/code/modules/mob/living/inhand_holder.dm
+++ b/code/modules/mob/living/inhand_holder.dm
@@ -66,7 +66,7 @@
qdel(src)
return TRUE
-/obj/item/clothing/head/mob_holder/relaymove(mob/user)
+/obj/item/clothing/head/mob_holder/relaymove(mob/living/user, direction)
release()
/obj/item/clothing/head/mob_holder/container_resist_act()
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index 4b5cc7989f5..d3301d638d6 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -14,7 +14,7 @@
///Called when TRAIT_KNOCKEDOUT is removed from the mob.
/mob/living/proc/on_knockedout_trait_loss(datum/source)
- if(stat < DEAD)
+ if(stat <= UNCONSCIOUS)
update_stat()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bae1267cdd2..13d65eac617 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -381,30 +381,28 @@
visible_message("[src] points at [A].", "You point at [A].")
return TRUE
+
/mob/living/verb/succumb(whispered as null)
set hidden = TRUE
- if (InCritical() && !HAS_TRAIT(src, TRAIT_NODEATH))
- log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", LOG_ATTACK)
- adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD)
- updatehealth()
- if(!whispered)
- to_chat(src, "You have given up life and succumbed to death.")
- death()
+ if (!HAS_TRAIT(src, TRAIT_CRITICAL_CONDITION) || HAS_TRAIT(src, TRAIT_NODEATH))
+ return
+ log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", LOG_ATTACK)
+ adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD)
+ updatehealth()
+ if(!whispered)
+ to_chat(src, "You have given up life and succumbed to death.")
+ death()
+
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_stasis = FALSE)
if(stat || HAS_TRAIT(src, TRAIT_INCAPACITATED) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS(src)))
return TRUE
/mob/living/canUseStorage()
- if (get_num_arms() <= 0)
+ if (usable_hands <= 0)
return FALSE
return TRUE
-/mob/living/proc/InCritical()
- return (health <= crit_threshold && (stat == SOFT_CRIT || stat == UNCONSCIOUS))
-
-/mob/living/proc/InFullCritical()
- return (health <= HEALTH_THRESHOLD_FULLCRIT && stat == UNCONSCIOUS)
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
//affects them once clothing is factored in. ~Errorage
@@ -1193,6 +1191,7 @@
/mob/living/can_be_pulled()
return ..() && !(buckled && buckled.buckle_prevents_pull)
+
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
//Robots, animals and brains have their own version so don't worry about them
/mob/living/proc/update_mobility()
@@ -1200,16 +1199,13 @@
var/stat_conscious = (stat == CONSCIOUS) || stat_softcrit
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
var/restrained = restrained()
- var/has_legs = get_num_legs()
- var/has_arms = get_num_arms()
var/paralyzed = IsParalyzed()
- var/ignore_legs = get_leg_ignore()
- var/canmove = !HAS_TRAIT(src, TRAIT_IMMOBILIZED) && (has_arms || ignore_legs || has_legs)
+ var/canmove = !HAS_TRAIT(src, TRAIT_IMMOBILIZED)
if(canmove)
mobility_flags |= MOBILITY_MOVE
else
mobility_flags &= ~MOBILITY_MOVE
- var/canstand_involuntary = !HAS_TRAIT(src, TRAIT_FLOORED) && (ignore_legs || has_legs)
+ var/canstand_involuntary = !HAS_TRAIT(src, TRAIT_FLOORED)
var/canstand = canstand_involuntary && !resting
if(buckled && buckled.buckle_lying != -1)
@@ -1233,9 +1229,7 @@
else
mobility_flags |= MOBILITY_UI|MOBILITY_PULL
-
-
- var/canitem = !paralyzed && !IsStun() && stat_conscious && !chokehold && !restrained && has_arms
+ var/canitem = !paralyzed && !IsStun() && stat_conscious && !chokehold && !restrained && usable_hands
if(canitem)
mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE)
else
@@ -1249,18 +1243,21 @@
unset_machine()
// Movespeed mods based on arms/legs quantity
- if(!get_leg_ignore())
+ if(movement_type & (FLYING | FLOATING))
+ remove_movespeed_modifier(/datum/movespeed_modifier/limbless)
+ else
var/limbless_slowdown = 0
// These checks for <2 should be swapped out for something else if we ever end up with a species with more than 2
- if(has_legs < 2)
- limbless_slowdown += 6 - (has_legs * 3)
- if(!has_legs && has_arms < 2)
- limbless_slowdown += 6 - (has_arms * 3)
+ if(usable_legs < default_num_legs)
+ limbless_slowdown += (default_num_legs * 3) - (usable_legs * 3)
+ if(!usable_legs && usable_hands < default_num_hands)
+ limbless_slowdown += (default_num_hands * 3) - (usable_hands * 3)
if(limbless_slowdown)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown)
else
remove_movespeed_modifier(/datum/movespeed_modifier/limbless)
+
///Called when mob changes from a standing position into a prone while lacking the ability to stand up at the moment, through update_mobility()
/mob/living/proc/on_fall()
return
@@ -1641,19 +1638,36 @@
if(pulledby)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT)
if(UNCONSCIOUS)
- cure_blind(UNCONSCIOUS_TRAIT)
+ if(stat != HARD_CRIT)
+ cure_blind(UNCONSCIOUS_TRAIT)
+ if(HARD_CRIT)
+ if(stat != UNCONSCIOUS)
+ cure_blind(UNCONSCIOUS_TRAIT)
switch(stat) //Current stat.
if(CONSCIOUS)
if(. >= UNCONSCIOUS)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT)
REMOVE_TRAIT(src, TRAIT_FLOORED, UNCONSCIOUS_TRAIT)
+ REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
if(SOFT_CRIT)
if(pulledby)
ADD_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) //adding trait sources should come before removing to avoid unnecessary updates
if(. >= UNCONSCIOUS)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT)
+ ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
if(UNCONSCIOUS)
- become_blind(UNCONSCIOUS_TRAIT)
+ if(. != HARD_CRIT)
+ become_blind(UNCONSCIOUS_TRAIT)
+ if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
+ ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
+ else
+ REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
+ if(HARD_CRIT)
+ if(. != UNCONSCIOUS)
+ become_blind(UNCONSCIOUS_TRAIT)
+ ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
+ if(DEAD)
+ REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT)
///Reports the event of the change in value of the buckled variable.
@@ -1687,3 +1701,35 @@
/// Only defined for carbons who can wear masks and helmets, we just assume other mobs have visible faces
/mob/living/proc/is_face_visible()
return TRUE
+
+
+///Proc to modify the value of num_legs and hook behavior associated to this event.
+/mob/living/proc/set_num_legs(new_value)
+ if(num_legs == new_value)
+ return
+ . = num_legs
+ num_legs = new_value
+
+
+///Proc to modify the value of usable_legs and hook behavior associated to this event.
+/mob/living/proc/set_usable_legs(new_value)
+ if(usable_legs == new_value)
+ return
+ . = usable_legs
+ usable_legs = new_value
+
+
+///Proc to modify the value of num_hands and hook behavior associated to this event.
+/mob/living/proc/set_num_hands(new_value)
+ if(num_hands == new_value)
+ return
+ . = num_hands
+ num_hands = new_value
+
+
+///Proc to modify the value of usable_hands and hook behavior associated to this event.
+/mob/living/proc/set_usable_hands(new_value)
+ if(usable_hands == new_value)
+ return
+ . = usable_hands
+ usable_hands = new_value
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 42ddfe20aa2..f1ef55650dc 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -67,6 +67,20 @@
var/metabolism_efficiency = 1 ///more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
var/has_limbs = 0 ///does the mob have distinct limbs?(arms,legs, chest,head)
+ ///How many legs does this mob have by default. This shouldn't change at runtime.
+ var/default_num_legs = 2
+ ///How many legs does this mob currently have. Should only be changed through set_num_legs()
+ var/num_legs = 2
+ ///How many usable legs this mob currently has. Should only be changed through set_usable_legs()
+ var/usable_legs = 2
+
+ ///How many hands does this mob have by default. This shouldn't change at runtime.
+ var/default_num_hands = 2
+ ///How many hands hands does this mob currently have. Should only be changed through set_num_hands()
+ var/num_hands = 2
+ ///How many usable hands does this mob currently have. Should only be changed through set_usable_hands()
+ var/usable_hands = 2
+
var/list/pipes_shown = list()
var/last_played_vent
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index ce4043c59c9..a20a5d3c354 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -82,9 +82,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return new_msg
/mob/living/say(message, bubble_type,list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
- var/static/list/crit_allowed_modes = list(WHISPER_MODE = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
- var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
-
var/ic_blocked = FALSE
if(client && !forced && CHAT_FILTER_CHECK(message))
//The filter doesn't act on the sanitized message, but the raw message.
@@ -104,45 +101,34 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/original_message = message
message = get_message_mods(message, message_mods)
var/datum/saymode/saymode = SSradio.saymodes[message_mods[RADIO_KEY]]
- var/in_critical = InCritical()
if(!message)
return
+
if(message_mods[RADIO_EXTENSION] == MODE_ADMIN)
- if(client)
- client.cmd_admin_say(message)
+ client?.cmd_admin_say(message)
return
if(message_mods[RADIO_EXTENSION] == MODE_DEADMIN)
- if(client)
- client.dsay(message)
+ client?.dsay(message)
return
- if(stat == DEAD)
- say_dead(original_message)
- return
+ switch(stat)
+ if(SOFT_CRIT)
+ message_mods[WHISPER_MODE] = MODE_WHISPER
+ if(UNCONSCIOUS)
+ if(!(message_mods[MODE_CHANGELING] || message_mods[MODE_ALIEN]))
+ return
+ if(HARD_CRIT)
+ if(!(message_mods[WHISPER_MODE] || message_mods[MODE_CHANGELING] || message_mods[MODE_ALIEN]))
+ return
+ if(DEAD)
+ say_dead(original_message)
+ return
if(check_emote(original_message, forced) || !can_speak_basic(original_message, ignore_spam, forced))
return
- if(in_critical) //There are cheaper ways to do this, but they're less flexible, and this isn't ran all that often
- var/end = TRUE
- for(var/index in message_mods)
- if(crit_allowed_modes[index])
- end = FALSE
- break
- if(end)
- return
- else if(stat == UNCONSCIOUS)
- var/end = TRUE
- for(var/index in message_mods)
- if(unconscious_allowed_modes[index])
- end = FALSE
- break
- if(end)
- return
-
-
language = message_mods[LANGUAGE_EXTENSION]
if(!language)
@@ -156,12 +142,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/succumbed = FALSE
- var/fullcrit = InFullCritical()
- if((InCritical() && !fullcrit) || message_mods[WHISPER_MODE] == MODE_WHISPER)
+ if(message_mods[WHISPER_MODE] == MODE_WHISPER)
message_range = 1
- message_mods[WHISPER_MODE] = MODE_WHISPER
- src.log_talk(message, LOG_WHISPER)
- if(fullcrit)
+ log_talk(message, LOG_WHISPER)
+ if(stat == HARD_CRIT)
var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health)
// If we cut our message short, abruptly end it with a-..
var/message_len = length_char(message)
@@ -171,7 +155,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
message_mods[WHISPER_MODE] = MODE_WHISPER_CRIT
succumbed = TRUE
else
- src.log_talk(message, LOG_SAY, forced_by=forced)
+ log_talk(message, LOG_SAY, forced_by=forced)
message = treat_message(message) // unfortunately we still need this
var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_SAY, args)
@@ -243,7 +227,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
deaf_type = 2 // Since you should be able to hear yourself without looking
// Create map text prior to modifying message for goonchat
- if (client?.prefs.chat_on_map && stat != UNCONSCIOUS && (client.prefs.see_chat_non_mob || ismob(speaker)) && can_hear())
+ if (client?.prefs.chat_on_map && !(stat == UNCONSCIOUS || stat == HARD_CRIT) && (client.prefs.see_chat_non_mob || ismob(speaker)) && can_hear())
create_chat_message(speaker, message_language, raw_message, spans)
// Recompose message for AI hrefs, language incomprehension.
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 8966f1f2b68..cf847de7146 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -74,7 +74,7 @@
if(health <= HEALTH_THRESHOLD_DEAD)
death()
return
- else if(stat == UNCONSCIOUS)
+ else if(stat >= UNCONSCIOUS)
set_stat(CONSCIOUS)
diag_hud_set_status()
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index 112b983d1b7..9121a1e4a97 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -39,7 +39,7 @@
. += "It appears to be an [deployed ? "active" : "empty"] AI shell."
else if(!client)
. += "It appears to be in stand-by mode." //afk
- if(UNCONSCIOUS)
+ if(SOFT_CRIT, UNCONSCIOUS, HARD_CRIT)
. += "It doesn't seem to be responding."
if(DEAD)
. += "It looks like its system is corrupted and requires a reset."
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b0a539fca6d..775910e580c 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1044,7 +1044,7 @@
if(!do_after(src, 5, target = M))
return
if(iscarbon(M) && !M.incapacitated() && !riding_datum.equip_buckle_inhands(M, 1))
- if(M.get_num_arms() <= 0)
+ if(M.usable_hands == 0)
M.visible_message("[M] can't climb onto [src] because [M.p_they()] don't have any usable arms!")
else
M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!")
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index a2163d85a10..9074221a63d 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -751,7 +751,7 @@
bloodiness += 4
// player on mulebot attempted to move
-/mob/living/simple_animal/bot/mulebot/relaymove(mob/user)
+/mob/living/simple_animal/bot/mulebot/relaymove(mob/living/user, direction)
if(user.incapacitated())
return
if(load == user)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index d9fe624691d..4972a860dbf 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -224,7 +224,7 @@
var/refund = 0
if(QDELETED(L) || (L.stat == DEAD && prev_stat != DEAD)) //they're dead, you killed them
refund += kill_refund
- else if(L.InCritical() && prev_stat == CONSCIOUS) //you knocked them into critical
+ else if(HAS_TRAIT(L, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) //you knocked them into critical
refund += crit_refund
if(L.stat != DEAD && prev_stat != DEAD)
refund += attack_refund
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 3d3ffaf646c..9ccb93591ba 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -46,6 +46,10 @@
/mob/living/simple_animal/pet/cat/Initialize()
. = ..()
verbs += /mob/living/proc/lay_down
+ add_cell_sample()
+
+/mob/living/simple_animal/pet/cat/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/pet/cat/update_mobility()
..()
@@ -80,6 +84,8 @@
unique_pet = TRUE
held_state = "original"
+/mob/living/simple_animal/pet/cat/original/add_cell_sample()
+ return
/mob/living/simple_animal/pet/cat/kitten
name = "kitten"
desc = "D'aaawwww."
@@ -261,6 +267,9 @@
deathsound = "bodyfall"
held_state = "cak"
+/mob/living/simple_animal/pet/cat/cak/add_cell_sample()
+ return
+
/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
..()
var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 0cef8673dd7..8c74ec337fc 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -24,6 +24,10 @@
footstep_type = FOOTSTEP_MOB_CLAW
+/mob/living/simple_animal/pet/dog/Initialize()
+ . = ..()
+ add_cell_sample()
+
/mob/living/simple_animal/pet/dog/Life()
..()
@@ -98,6 +102,9 @@
var/shaved = FALSE
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
+/mob/living/simple_animal/pet/dog/corgi/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
/mob/living/simple_animal/pet/dog/corgi/Destroy()
QDEL_NULL(inventory_head)
QDEL_NULL(inventory_back)
@@ -128,10 +135,26 @@
collar_type = "pug"
held_state = "pug"
+/mob/living/simple_animal/pet/dog/pug/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
/mob/living/simple_animal/pet/dog/pug/mcgriff
name = "McGriff"
desc = "This dog can tell someting smells around here, and that something is CRIME!"
+/mob/living/simple_animal/pet/dog/bullterrier
+ name = "\improper bull terrier"
+ real_name = "bull terrier"
+ desc = "It's a bull terrier."
+ icon = 'icons/mob/pets.dmi'
+ icon_state = "bullterrier"
+ icon_living = "bullterrier"
+ icon_dead = "bullterrier_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3) // Would feel redundant to add more new dog meats.
+ gold_core_spawnable = FRIENDLY_SPAWN
+ collar_type = "bullterrier"
+ held_state = "bullterrier"
+
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi
name = "Exotic Corgi"
desc = "As cute as it is colorful!"
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index e45f18a7abe..f78ad951e6f 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -149,8 +149,12 @@
/mob/living/simple_animal/cow/Initialize()
udder = new()
+ add_cell_sample()
. = ..()
+/mob/living/simple_animal/cow/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_COW, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
/mob/living/simple_animal/cow/Destroy()
qdel(udder)
udder = null
@@ -274,6 +278,10 @@
. = ..()
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
+ add_cell_sample()
+
+/mob/living/simple_animal/chick/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/chick/Life()
. =..()
@@ -342,6 +350,10 @@
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
++chicken_count
+ add_cell_sample()
+
+/mob/living/simple_animal/chicken/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/chicken/Destroy()
--chicken_count
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index f041ea545ce..bc2d2296693 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -40,7 +40,10 @@
icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
+ add_cell_sample()
+/mob/living/simple_animal/mouse/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10)
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
@@ -177,6 +180,10 @@
foodtype = GROSS | MEAT | RAW
grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5)
+/obj/item/reagent_containers/food/snacks/deadmouse/Initialize()
+ . = ..()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10)
+
/obj/item/reagent_containers/food/snacks/deadmouse/examine(mob/user)
. = ..()
if (reagents?.has_reagent(/datum/reagent/yuck) || reagents?.has_reagent(/datum/reagent/fuel))
diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm
index 01182fcf9d5..6f7f76f7449 100644
--- a/code/modules/mob/living/simple_animal/friendly/snake.dm
+++ b/code/modules/mob/living/simple_animal/friendly/snake.dm
@@ -39,6 +39,12 @@
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
+/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize()
+ . = ..()
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target)
. = oview(vision_range, targets_from) //get list of things in vision range
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 4dd3a60c82b..23ac9bfe57c 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -262,9 +262,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if(amount > 0)
to_chat(summoner, "Your [name] is under attack! You take damage!")
summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!")
- if(summoner.stat == UNCONSCIOUS)
- to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")
- summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss
+ switch(summoner.stat)
+ if(UNCONSCIOUS, HARD_CRIT)
+ to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")
+ summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss
update_health_hud()
/mob/living/simple_animal/hostile/guardian/ex_act(severity, target)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 056a448f349..19633468a30 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -51,6 +51,10 @@
/mob/living/simple_animal/hostile/bear/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/bear/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/bear/Life()
. = ..()
@@ -147,6 +151,9 @@
attack_sound = 'sound/weapons/slap.ogg'
attack_verb_continuous = "slaps"
+/mob/living/simple_animal/hostile/bear/butter/add_cell_sample()
+ return //You cannot grow a real bear from butter.
+
/mob/living/simple_animal/hostile/bear/butter/Life() //Heals butter bear really fast when he takes damage.
if(stat)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
index 7fbbc37664a..441c3062431 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
@@ -2,7 +2,7 @@
name = "\improper A Perfectly Generic Boss Placeholder"
desc = ""
robust_searching = 1
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
status_flags = 0
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index d4014bdba25..ff5f58e3911 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -74,6 +74,10 @@
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
carp_randomify(rarechance)
update_icons()
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/carp/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/carp/proc/carp_randomify(rarechance)
if(random_color)
@@ -163,6 +167,9 @@
tame_chance = 0
bonus_tame_chance = 0
+/mob/living/simple_animal/hostile/carp/holocarp/add_cell_sample()
+ return
+
/mob/living/simple_animal/hostile/carp/megacarp
icon = 'icons/mob/broadMobs.dmi'
name = "Mega Space Carp"
@@ -195,6 +202,10 @@
melee_damage_upper += rand(10,20)
maxHealth += rand(30,60)
move_to_delay = rand(3,7)
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGACARP, CELL_VIRUS_TABLE_GENERIC_MOB)
+
+/mob/living/simple_animal/hostile/carp/megacarp/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGACARP, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/carp/megacarp/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
index fbcf5dfc7fb..63254b39bfb 100644
--- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
+++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm
@@ -9,7 +9,7 @@
speak_chance = 0
turns_per_move = 5
speed = 0
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
maxHealth = 100
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm
index 43a26bd1158..74fe430447b 100644
--- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm
@@ -33,6 +33,13 @@
faction = list("neutral")
var/squish_chance = 50
+/mob/living/simple_animal/hostile/cockroach/Initialize()
+ . = ..()
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/cockroach/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_COCKROACH, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7)
+
/obj/projectile/glockroachbullet
damage = 10 //same damage as a hivebot
damage_type = BRUTE
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 399279503da..c9c2e131cc0 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -15,7 +15,7 @@
speed = 0
maxHealth = 80
health = 80
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
harm_intent_damage = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index 63a752a04e0..fd109706d7a 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -35,7 +35,7 @@
possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM)
faction = list("jungle")
robust_searching = TRUE
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
minbodytemp = 270
maxbodytemp = 350
unique_name = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 78cfbb89214..52c99698d15 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -42,7 +42,8 @@
var/search_objects_timer_id //Timer for regaining our old search_objects value after being attacked
var/search_objects_regain_time = 30 //the delay between being attacked and gaining our old search_objects value back
var/list/wanted_objects = list() //A typecache of objects types that will be checked against to attack, should we have search_objects enabled
- var/stat_attack = CONSCIOUS //Mobs with stat_attack to UNCONSCIOUS will attempt to attack things that are unconscious, Mobs with stat_attack set to DEAD will attempt to attack the dead.
+ ///Mobs ignore mob/living targets with a stat lower than that of stat_attack. If set to DEAD, then they'll include corpses in their targets, if to HARD_CRIT they'll keep attacking until they kill, and so on.
+ var/stat_attack = CONSCIOUS
var/stat_exclusive = FALSE //Mobs with this set to TRUE will exclusively attack things defined by stat_attack, stat_attack DEAD means they will only attack corpses
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
@@ -327,7 +328,7 @@
FindTarget()
-/mob/living/simple_animal/hostile/proc/AttackingTarget()
+/mob/living/simple_animal/hostile/proc/AttackingTarget(atom/attacked_target)
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target)
in_melee = TRUE
return target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index 3e761423185..540b61b3333 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -20,7 +20,7 @@
pixel_x = -16
layer = LARGE_MOB_LAYER
speed = 10
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
var/hopping = FALSE
var/hop_cooldown = 0 //Strictly for player controlled leapers
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
index 6995c066efa..17e1bb988a4 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
@@ -24,7 +24,7 @@
ranged_cooldown_time = 10
pass_flags = LETPASSTHROW
robust_searching = TRUE
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
attack_sound = 'sound/weapons/rapierhit.ogg'
deathsound = 'sound/voice/mook_death.ogg'
aggro_vision_range = 15 //A little more aggressive once in combat to balance out their really low HP
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
index 7e406a0f8a8..870c3cd0c56 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -28,7 +28,7 @@
projectiletype = /obj/projectile/seedling
projectilesound = 'sound/weapons/pierce.ogg'
robust_searching = TRUE
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
move_resist = MOVE_FORCE_EXTREMELY_STRONG
var/combatant_state = SEEDLING_STATE_NEUTRAL
var/obj/seedling_weakpoint/weak_point
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index b27ba353c3c..773c52f09af 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -165,14 +165,18 @@
GLOB.necropolis_gate.toggle_the_gate(null, TRUE) //very clever.
return ..()
+
///In addition to parent functionality, this will also turn the target into a small legion if they are unconcious.
/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
. = ..()
- if(. && ishuman(target))
- var/mob/living/L = target
- if(L.stat == UNCONSCIOUS)
- var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
- A.infest(L)
+ if(!. || !ishuman(target))
+ return
+ var/mob/living/living_target = target
+ switch(living_target.stat)
+ if(UNCONSCIOUS, HARD_CRIT)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/legion = new(loc)
+ legion.infest(living_target)
+
///Resets the charge buffs.
/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 36bfd006d25..4601d83a42c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -108,7 +108,7 @@
a_intent = INTENT_HARM
speak_emote = list("telepathically cries")
attack_sound = 'sound/weapons/bladeslice.ogg'
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
movement_type = FLYING
robust_searching = 1
crusher_loot = /obj/item/crusher_trophy/watcher_wing
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 43bbdb268b1..dce179b1b4a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -16,7 +16,7 @@
aggro_vision_range = 18
environment_smash = ENVIRONMENT_SMASH_NONE //This is to prevent elites smashing up the mining station (entirely), we'll make sure they can smash minerals fine below.
harm_intent_damage = 0 //Punching elites gets you nowhere
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
layer = LARGE_MOB_LAYER
sentience_type = SENTIENCE_BOSS
var/chosen_attack = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
index f922c2ba3f2..05a9db5f9a2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
@@ -76,7 +76,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/canmove = TRUE
-/obj/effect/dummy/phased_mob/goldgrub/relaymove(mob/user, direction)
+/obj/effect/dummy/phased_mob/goldgrub/relaymove(mob/living/user, direction)
forceMove(get_step(src,direction))
/obj/effect/dummy/phased_mob/goldgrub/ex_act()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index a5bb92b7bea..bf479c56e56 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -100,7 +100,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1)
loot = list()
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
food_type = list(/obj/item/reagent_containers/food/snacks/customizable/salad/ashsalad, /obj/item/reagent_containers/food/snacks/customizable/soup/ashsoup, /obj/item/reagent_containers/food/snacks/grown/ash_flora)//use lavaland plants to feed the lavaland monster
tame_chance = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index a108525d116..a14420b570c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -29,7 +29,7 @@
a_intent = INTENT_HELP
ventcrawler = VENTCRAWLER_ALWAYS
gold_core_spawnable = FRIENDLY_SPAWN
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
gender = NEUTER
stop_automated_movement = FALSE
stop_automated_movement_when_pulled = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index da2a3710150..ab82502021f 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -117,7 +117,7 @@
loot = list(/obj/item/organ/regenerative_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
del_on_death = 1
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
var/dwarf_mob = FALSE
var/mob/living/carbon/human/stored_mob
@@ -183,16 +183,25 @@
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "is shrugged off by"
del_on_death = TRUE
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
var/can_infest_dead = FALSE
+
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
- if(isturf(loc))
- for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
- if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD))
- infest(H)
- ..()
+ . = ..()
+ if(stat == DEAD || !isturf(loc))
+ return
+ for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile
+ switch(victim.stat)
+ if(UNCONSCIOUS, HARD_CRIT)
+ infest(victim)
+ return //This will qdelete the legion.
+ if(DEAD)
+ if(can_infest_dead)
+ infest(victim)
+ return //This will qdelete the legion.
+
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
visible_message("[name] burrows into the flesh of [H]!")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
index 26c65574da9..bc36008ed2a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
@@ -36,7 +36,7 @@
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
deathmessage = "fades as the energies that tied it to this world dissipate."
deathsound = 'sound/magic/demon_dies.ogg'
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
movement_type = FLYING
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
index 4f162bc5cf7..80f39f8eb3c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice whelp.dm
@@ -33,7 +33,7 @@
crusher_loot = /obj/item/crusher_trophy/tail_spike
deathmessage = "collapses on its side."
deathsound = 'sound/magic/demon_dies.ogg'
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// How far the whelps fire can go
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
index 83aa4b55292..4bdb6e4071d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
@@ -29,7 +29,7 @@
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1)
loot = list()
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// Message for when the polar bear starts to attack faster
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
index 1f821e8c486..3d6e9a5384b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
@@ -31,7 +31,7 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2)
loot = list()
crusher_loot = /obj/item/crusher_trophy/watcher_wing
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = TRUE
footstep_type = FOOTSTEP_MOB_CLAW
/// Message for when the wolf decides to start running away
diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
index 7d104a94597..4417e68e2ec 100644
--- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
+++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
@@ -10,7 +10,7 @@
speak_chance = 0
turns_per_move = 5
speed = 0
- stat_attack = UNCONSCIOUS
+ stat_attack = HARD_CRIT
robust_searching = 1
maxHealth = 100
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index 150628e3932..6605bf613ff 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -45,7 +45,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/canmove = TRUE
-/obj/effect/dummy/phased_mob/creature/relaymove(mob/user, direction)
+/obj/effect/dummy/phased_mob/creature/relaymove(mob/living/user, direction)
forceMove(get_step(src,direction))
/obj/effect/dummy/phased_mob/creature/ex_act()
diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm
new file mode 100644
index 00000000000..f0db31f0bd0
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm
@@ -0,0 +1,506 @@
+///Oozes are slime-esque creatures, they are highly gluttonous creatures primarily intended for player controll.
+/mob/living/simple_animal/hostile/ooze
+ name = "Ooze"
+ icon = 'icons/mob/vatgrowing.dmi'
+ icon_state = "gelatinous"
+ icon_dead = "gelatinous_dead"
+ mob_biotypes = MOB_ORGANIC
+ pass_flags = PASSTABLE | PASSGRILLE
+ ventcrawler = VENTCRAWLER_ALWAYS
+ gender = NEUTER
+ emote_see = list("jiggles", "bounces in place")
+ speak_emote = list("blorbles")
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ hud_type = /datum/hud/ooze
+ minbodytemp = 250
+ maxbodytemp = INFINITY
+ faction = list("slime")
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ health = 200
+ maxHealth = 200
+ attack_verb_continuous = "slimes"
+ attack_verb_simple = "slime"
+ attack_sound = 'sound/effects/blobattack.ogg'
+ a_intent = INTENT_HARM
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
+ mob_size = MOB_SIZE_LARGE
+ initial_language_holder = /datum/language_holder/slime
+
+ ///Oozes have their own nutrition. Changes based on them eating
+ var/ooze_nutrition = 50
+ var/ooze_nutrition_loss = -0.15
+ var/ooze_metabolism_modifier = 2
+
+/mob/living/simple_animal/hostile/ooze/Initialize()
+ . = ..()
+ create_reagents(300)
+ add_cell_sample()
+ AddComponent(/datum/component/footstep, FOOTSTEP_MOB_SLIME, 7.5)
+
+/mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user)
+ if(!check_edible(I))
+ return ..()
+ eat_atom(I)
+
+/mob/living/simple_animal/hostile/ooze/AttackingTarget(atom/attacked_target)
+ if(!check_edible(attacked_target))
+ return ..()
+ eat_atom(attacked_target)
+
+/mob/living/simple_animal/hostile/ooze/UnarmedAttack(atom/A)
+ if(!check_edible(A))
+ return ..()
+ eat_atom(A)
+
+///Handles nutrition gain/loss of mob and also makes it take damage if it's too low on nutrition, only happens for sentient mobs.
+/mob/living/simple_animal/hostile/ooze/Life()
+ . = ..()
+
+ if(!mind && stat != DEAD)//no mind no change
+ return
+
+ var/nutrition_change = ooze_nutrition_loss
+
+ //Eat a bit of all the reagents we have. Gaining nutrition for actual nutritional ones.
+ for(var/i in reagents.reagent_list)
+ var/datum/reagent/reagent = i
+ var/consumption_amount = min(reagents.get_reagent_amount(reagent.type), ooze_metabolism_modifier * REAGENTS_METABOLISM)
+ if(istype(reagent, /datum/reagent/consumable))
+ var/datum/reagent/consumable/consumable = reagent
+ nutrition_change += consumption_amount * consumable.nutriment_factor
+ reagents.remove_reagent(reagent.type, consumption_amount)
+ adjust_ooze_nutrition(nutrition_change)
+
+ if(ooze_nutrition <= 0)
+ adjustBruteLoss(0.5)
+
+///Returns whether or not the supplied movable atom is edible.
+/mob/living/simple_animal/hostile/ooze/proc/check_edible(atom/movable/potential_food)
+ if(ismob(potential_food))
+ return FALSE
+ if(istype(potential_food, /obj/item/reagent_containers/food))
+ var/obj/item/reagent_containers/food/meal = potential_food
+ return (meal.foodtype & MEAT) //Dont forget to add edible component compat here later
+
+///Does ooze_nutrition + supplied amount and clamps it within 0 and 500
+/mob/living/simple_animal/hostile/ooze/proc/adjust_ooze_nutrition(amount)
+ ooze_nutrition = clamp(ooze_nutrition + amount, 0, 500)
+ updateNutritionDisplay()
+
+///Tries to transfer the atoms reagents then delete it
+/mob/living/simple_animal/hostile/ooze/proc/eat_atom(obj/item/eaten_atom)
+ eaten_atom.reagents.trans_to(src, eaten_atom.reagents.total_volume, transfered_by = src)
+ src.visible_message("You eat [eaten_atom].")
+ playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE)
+ qdel(eaten_atom)
+
+///Updates the display that shows the mobs nutrition
+/mob/living/simple_animal/hostile/ooze/proc/updateNutritionDisplay()
+ if(hud_used) //clientless oozes
+ hud_used.alien_plasma_display.maptext = "
'+(n?e:Y(e,!0))+"\n":""+(n?e:Y(e,!0))+"\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return t&&(t=""+t+""),""+e+""},t.br=function(){return this.options.xhtml?""+Q(u.message+"",!0)+"";throw u}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=J,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,r=function(t){var r=n[t];n[t]=function(){for(var o=arguments.length,i=new Array(o),a=0;a
'+(n?e:Y(e,!0))+"\n":""+(n?e:Y(e,!0))+"\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},t.table=function(e,t){return t&&(t=""+t+""),""+e+""},t.br=function(){return this.options.xhtml?""+Q(u.message+"",!0)+"";throw u}}return ne.options=ne.setOptions=function(e){return X(ne.defaults,e),ee(ne.defaults),ne},ne.getDefaults=J,ne.defaults=te,ne.use=function(e){var t=X({},e);if(e.renderer&&function(){var n=ne.defaults.renderer||new U,r=function(t){var r=n[t];n[t]=function(){for(var o=arguments.length,i=new Array(o),a=0;a