diff --git a/Dockerfile b/Dockerfile
index a28b231eab..a037093576 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM tgstation/byond:512.1467 as base
+FROM tgstation/byond:512.1484 as base
FROM base as build_base
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index e1b1b43e8d..cfad7691b4 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -11774,11 +11774,15 @@
/area/engine/atmospherics_engine)
"aAb" = (
/turf/closed/wall,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aAc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aAd" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -12358,7 +12362,9 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBh" = (
/obj/item/twohanded/required/kirbyplants/random,
/obj/machinery/light/small{
@@ -12367,26 +12373,27 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBi" = (
/obj/structure/table,
/obj/item/clothing/suit/apron/overalls,
/obj/item/cultivator,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBj" = (
/obj/machinery/biogenerator,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBk" = (
/obj/structure/table,
-/obj/item/seeds/poppy/lily{
- pixel_x = 4;
- pixel_y = 4
- },
-/obj/item/seeds/poppy/geranium,
/obj/effect/decal/cleanable/dirt,
/obj/item/reagent_containers/food/snacks/grown/wheat,
/obj/item/reagent_containers/food/snacks/grown/corn,
@@ -12395,15 +12402,23 @@
/obj/machinery/airalarm{
pixel_y = 23
},
+/obj/item/seeds/poppy/lily{
+ pixel_x = 4;
+ pixel_y = 4
+ },
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBl" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/tea,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBm" = (
/obj/item/twohanded/required/kirbyplants/random,
/obj/machinery/status_display{
@@ -12411,7 +12426,9 @@
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBn" = (
/obj/structure/table,
/obj/item/stack/packageWrap,
@@ -12422,7 +12439,9 @@
/obj/item/reagent_containers/food/snacks/grown/cherries,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBo" = (
/obj/item/twohanded/required/kirbyplants/random,
/obj/machinery/light/small{
@@ -12432,14 +12451,18 @@
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBp" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/poppy,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aBq" = (
/obj/structure/cable/white{
icon_state = "2-4"
@@ -13032,26 +13055,34 @@
/turf/closed/wall/r_wall,
/area/engine/atmospherics_engine)
"aCv" = (
-/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aCw" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/watermelon,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aCx" = (
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aCy" = (
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aCz" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -13658,15 +13689,21 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aDy" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aDz" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aDA" = (
/obj/structure/sink{
dir = 4;
@@ -13677,7 +13714,9 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aDB" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -14188,37 +14227,38 @@
/turf/open/space,
/area/space/nearstation)
"aEB" = (
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
icon_state = "2-4"
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aEC" = (
/obj/structure/cable/white{
icon_state = "4-8"
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aED" = (
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aEE" = (
/obj/structure/cable/white{
icon_state = "2-8"
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
-"aEF" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aEG" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -14854,14 +14894,18 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFK" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/harebell,
/obj/machinery/light/small,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFL" = (
/obj/structure/table,
/obj/item/shovel/spade,
@@ -14875,23 +14919,27 @@
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white,
/obj/machinery/power/apc{
- dir = 2;
- name = "Abandoned Garden APC";
areastring = "/area/hydroponics/garden/abandoned";
+ dir = 2;
+ name = "Maintenance Garden APC";
pixel_y = -26
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFM" = (
-/obj/machinery/seed_extractor,
/obj/machinery/status_display{
pixel_y = -32
},
-/obj/item/reagent_containers/glass/bucket,
/obj/effect/turf_decal/delivery,
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/poppy/geranium,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFN" = (
/obj/structure/table,
/obj/item/plant_analyzer,
@@ -14899,12 +14947,16 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFP" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -14912,7 +14964,9 @@
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFQ" = (
/obj/structure/table,
/obj/item/crowbar,
@@ -14920,7 +14974,9 @@
/obj/item/reagent_containers/glass/bucket,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFR" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/tower,
@@ -14929,7 +14985,9 @@
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aFS" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -15021,6 +15079,9 @@
location = "Bar"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/eastleft{
+ req_access_txt = "25"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aGc" = (
@@ -15922,9 +15983,10 @@
/area/engine/atmospherics_engine)
"aHl" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/barricade/wooden,
/turf/open/floor/plating,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aHm" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -15933,7 +15995,6 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/barricade/wooden,
/obj/effect/turf_decal/stripes/line{
dir = 2
},
@@ -15941,7 +16002,9 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aHn" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Maintenance Hatch";
@@ -15951,7 +16014,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/structure/barricade/wooden,
/obj/effect/turf_decal/stripes/line{
dir = 2
},
@@ -15959,13 +16021,16 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aHo" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/barricade/wooden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/hydroponics/garden/abandoned)
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"aHp" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -16808,7 +16873,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aIK" = (
/obj/structure/cable/white{
@@ -16818,10 +16884,18 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aIL" = (
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
icon_state = "4-8"
},
@@ -17687,7 +17761,14 @@
/area/engine/atmospherics_engine)
"aKg" = (
/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aKh" = (
/obj/effect/decal/cleanable/dirt,
@@ -17704,7 +17785,11 @@
/area/maintenance/port/fore)
"aKi" = (
/obj/structure/closet,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aKj" = (
/obj/effect/decal/cleanable/dirt,
@@ -17715,16 +17800,20 @@
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aKk" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"aKl" = (
/obj/effect/landmark/event_spawn,
/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -21299,6 +21388,9 @@
location = "Theatre"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/westleft{
+ req_access_txt = "46"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/theatre)
"aQj" = (
@@ -26153,6 +26245,9 @@
dir = 4
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/eastright{
+ req_one_access_txt = "48,50"
+ },
/turf/open/floor/plasteel,
/area/quartermaster/office)
"aXg" = (
@@ -29213,6 +29308,9 @@
location = "Kitchen"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/eastleft{
+ req_access_txt = "28"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bcd" = (
@@ -30865,6 +30963,9 @@
location = "Hydroponics"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/westleft{
+ req_access_txt = "35"
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"beW" = (
@@ -36055,6 +36156,9 @@
/obj/structure/plasticflaps/opaque,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northright{
+ req_access_txt = "48"
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"bnB" = (
@@ -39195,13 +39299,6 @@
name = "Hydroponics Desk";
req_access_txt = "35"
},
-/obj/item/seeds/lime{
- pixel_x = 6
- },
-/obj/item/seeds/watermelon,
-/obj/item/seeds/grape{
- pixel_x = -6
- },
/obj/item/reagent_containers/food/snacks/grown/wheat,
/obj/item/reagent_containers/food/snacks/grown/watermelon,
/obj/item/reagent_containers/food/snacks/grown/banana,
@@ -41789,6 +41886,9 @@
location = "Atmospherics"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/westleft{
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bwH" = (
@@ -71753,6 +71853,9 @@
location = "Security"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northleft{
+ req_access_txt = "63"
+ },
/turf/open/floor/plasteel,
/area/security/range)
"cqh" = (
@@ -82547,6 +82650,9 @@
location = "Engineering"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northright{
+ req_access_txt = "10"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cIr" = (
@@ -87734,6 +87840,9 @@
location = "Medbay"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/westleft{
+ req_access_txt = "5"
+ },
/turf/open/floor/plasteel,
/area/medical/storage)
"cRl" = (
@@ -114081,6 +114190,9 @@
location = "Robotics"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/northright{
+ req_access_txt = "47"
+ },
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"dKl" = (
@@ -126680,6 +126792,23 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/science/research)
+"ibC" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/lime{
+ pixel_x = 6
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
+"iiH" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"ijB" = (
/obj/structure/reagent_dispensers/keg/aphro/strong,
/obj/item/reagent_containers/glass/beaker,
@@ -127109,6 +127238,14 @@
dir = 1
},
/area/science/circuit)
+"mdk" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"mkm" = (
/obj/machinery/atmospherics/components/binary/valve,
/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{
@@ -127211,6 +127348,29 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"oaP" = (
+/obj/machinery/seed_extractor,
+/obj/item/reagent_containers/glass/bucket,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
+"obe" = (
+/obj/structure/cable/white{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"owr" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -127224,6 +127384,29 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
+"owI" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
+"ozr" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/hydroponics/soil,
+/obj/item/seeds/grape,
+/turf/open/floor/plasteel,
+/area/hydroponics/garden/abandoned{
+ name = "Maintenance Garden"
+ })
"oIl" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -127273,6 +127456,19 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
+"oOb" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/door/window{
+ req_one_access_txt = "48,50"
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/quartermaster/sorting)
"oSD" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/manifold/general/visible{
@@ -127363,6 +127559,15 @@
},
/turf/open/floor/plating,
/area/science/research/abandoned)
+"pHf" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"pQm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -127466,6 +127671,13 @@
/obj/machinery/door/poddoor/incinerator_toxmix,
/turf/open/floor/engine/vacuum,
/area/science/mixing)
+"tbC" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"tmi" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -127479,6 +127691,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"tAi" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"tCh" = (
/turf/closed/wall,
/area/science/misc_lab)
@@ -127582,6 +127802,18 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/science/circuit)
+"whX" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/fore)
"wAA" = (
/obj/structure/sign/nanotrasen,
/turf/closed/wall/r_wall,
@@ -156627,7 +156859,7 @@ arB
aug
alg
alg
-aAd
+whX
aKg
alf
aMO
@@ -156884,7 +157116,7 @@ aAb
aAb
aAb
aAb
-arB
+pHf
aKh
alf
aMN
@@ -157138,11 +157370,11 @@ aAb
aBg
aCv
aDx
-aCw
+aCv
aFJ
aAb
aIH
-aoY
+tAi
alf
aMP
aDw
@@ -157393,8 +157625,8 @@ axI
ayU
aAb
aBh
-aCw
-aCw
+aCv
+aCv
aCv
aFK
aHl
@@ -157650,13 +157882,13 @@ axJ
aoY
aAb
aBi
-aCw
+aCv
aCw
aEB
aFL
aAb
-arB
-alg
+aIH
+tbC
avm
arB
arB
@@ -157908,11 +158140,11 @@ alf
aAb
aBj
aCv
-aCw
+oaP
aEC
aFM
aAb
-alg
+aIH
ary
aLz
aLz
@@ -158165,11 +158397,11 @@ alg
aAb
aBk
aCv
-aCw
+ozr
aEC
aFN
aAb
-arA
+aIH
aKi
aLz
aMQ
@@ -158421,13 +158653,13 @@ axL
ayV
aAb
aBl
-aCw
+aCv
aDy
aED
aFO
aHm
aII
-aKj
+mdk
aLz
aMR
aOq
@@ -158678,13 +158910,13 @@ axM
ayW
aAb
aBm
-aCw
-aCw
+aCv
+aCv
aEE
aFP
aHn
aIJ
-aKj
+iiH
aLz
aMS
aOr
@@ -158936,12 +159168,12 @@ ayX
aAb
aBn
aCx
-aCw
-aCw
+ibC
+aCv
aFQ
aAb
-asQ
-arB
+owI
+iiH
aLz
aMT
aOs
@@ -159194,7 +159426,7 @@ aAc
aBo
aCy
aDz
-aEF
+aDz
aFR
aHo
aIK
@@ -159449,7 +159681,7 @@ alf
alf
aAb
aBp
-aCw
+aCv
aDA
aCv
aFJ
@@ -159712,7 +159944,7 @@ aAb
aAb
aAb
aIL
-arB
+tbC
aLz
aLz
aLz
@@ -159969,7 +160201,7 @@ aEG
aFS
aHp
aIM
-aEG
+obe
aLB
aFS
aEG
@@ -167677,7 +167909,7 @@ aCP
avQ
aFe
aGp
-aHH
+oOb
aJg
aKF
aLP
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index a4d41b02b6..9db8094779 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -50,7 +50,7 @@
#define isgolem(A) (is_species(A, /datum/species/golem))
#define islizard(A) (is_species(A, /datum/species/lizard))
#define isplasmaman(A) (is_species(A, /datum/species/plasmaman))
-#define ispodperson(A) (is_species(A, /datum/species/podperson))
+#define ispodperson(A) (is_species(A, /datum/species/pod))
#define isflyperson(A) (is_species(A, /datum/species/fly))
#define isjellyperson(A) (is_species(A, /datum/species/jelly))
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 1d1dda6d99..6143047275 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -116,6 +116,8 @@
#define BIOWARE_GENERIC "generic"
#define BIOWARE_NERVES "nerves"
#define BIOWARE_CIRCULATION "circulation"
+#define BIOWARE_LIGAMENTS "ligaments"
+#define BIOWARE_DISSECTION "dissected"
//Health hud screws for carbon mobs
#define SCREWYHUD_NONE 0
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index a4bca2f2c8..e198041c6e 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -95,6 +95,8 @@
#define TRAIT_NOHUNGER "no_hunger"
#define TRAIT_EASYDISMEMBER "easy_dismember"
#define TRAIT_LIMBATTACHMENT "limb_attach"
+#define TRAIT_NOLIMBDISABLE "no_limb_disable"
+#define TRAIT_EASYLIMBDISABLE "easy_limb_disable"
#define TRAIT_TOXINLOVER "toxinlover"
#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 5983fa3ae5..a0d9226e14 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -116,7 +116,7 @@ SUBSYSTEM_DEF(job)
if(player.mind && job.title in player.mind.restricted_roles)
JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue
- if(player.client.prefs.job_preferences[job.title] == level)
+ if(player.client.prefs.job_preferences["[job.title]"] == level)
JobDebug("FOC pass, Player: [player], Level:[level]")
candidates += player
return candidates
@@ -182,7 +182,7 @@ SUBSYSTEM_DEF(job)
if((job.current_positions >= job.total_positions) && job.total_positions != -1)
continue
var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len)
+ if(!candidates?.len)
continue
var/mob/dead/new_player/candidate = pick(candidates)
if(AssignRole(candidate, command_position))
@@ -200,7 +200,7 @@ SUBSYSTEM_DEF(job)
if((job.current_positions >= job.total_positions) && job.total_positions != -1)
continue
var/list/candidates = FindOccupationCandidates(job, level)
- if(!candidates.len)
+ if(!candidates?.len)
continue
var/mob/dead/new_player/candidate = pick(candidates)
AssignRole(candidate, command_position)
@@ -246,7 +246,7 @@ SUBSYSTEM_DEF(job)
initial_players_to_assign = unassigned.len
- JobDebug("DO, Len: [unassigned.len]")
+ JobDebug("DO, Len: [unassigned?.len]")
if(unassigned.len == 0)
return validate_required_jobs(required_jobs)
@@ -270,7 +270,7 @@ SUBSYSTEM_DEF(job)
JobDebug("DO, Running Overflow Check 1")
var/datum/job/overflow = GetJob(SSjob.overflow_role)
var/list/overflow_candidates = FindOccupationCandidates(overflow, JP_LOW)
- JobDebug("AC1, Candidates: [overflow_candidates.len]")
+ JobDebug("AC1, Candidates: [overflow_candidates?.len]")
for(var/mob/dead/new_player/player in overflow_candidates)
JobDebug("AC1 pass, Player: [player]")
AssignRole(player, SSjob.overflow_role)
@@ -333,7 +333,7 @@ SUBSYSTEM_DEF(job)
continue
// If the player wants that job on this level, then try give it to him.
- if(player.client.prefs.job_preferences[job.title] == level)
+ if(player.client.prefs.job_preferences["[job.title]"] == level)
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]")
@@ -540,7 +540,7 @@ SUBSYSTEM_DEF(job)
if(job.required_playtime_remaining(player.client))
young++
continue
- switch(player.client.prefs.job_preferences[job.title])
+ switch(player.client.prefs.job_preferences["[job.title]"])
if(JP_HIGH)
high++
if(JP_MEDIUM)
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index 4976891543..4b4cce3794 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -61,7 +61,7 @@
teamsize = 1
opendoors = FALSE
enforce_human = FALSE
- roles = /datum/antagonist/greybois
+ roles = list(/datum/antagonist/greybois)
leader_role = /datum/antagonist/greybois/greygod
rename_team = "Emergency Assistants"
polldesc = "an Emergency Assistant"
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index f9fa2544b8..564f308df3 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -6,6 +6,7 @@
dir_in = 1 //Facing North.
max_integrity = 250
deflect_chance = 5
+ force = 20
armor = list("melee" = 25, "bullet" = 20, "laser" = 30, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 25000
infra_luminosity = 6
@@ -13,6 +14,7 @@
internal_damage_threshold = 35
max_equip = 3
step_energy_drain = 3
+ leg_overload_coeff = 300
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
@@ -20,6 +22,7 @@
icon_state = "darkgygax"
max_integrity = 300
deflect_chance = 15
+ force = 25
armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
max_temperature = 35000
leg_overload_coeff = 100
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index f9affc230d..10b84917bb 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -180,8 +180,13 @@
slot_flags = ITEM_SLOT_BELT
force = 12 //9 hit crit
w_class = WEIGHT_CLASS_NORMAL
- var/cooldown = 0
+ var/cooldown = 13
var/on = TRUE
+ var/last_hit = 0
+ var/stun_stam_cost_coeff = 1.25
+ var/hardstun_ds = 1
+ var/softstun_ds = 0
+ var/stam_dmg = 30
/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user)
if(!on)
@@ -207,12 +212,10 @@
if(!isliving(target))
return
if (user.a_intent == INTENT_HARM)
- if(!..())
- return
- if(!iscyborg(target))
+ if(!..() || !iscyborg(target))
return
else
- if(cooldown <= world.time)
+ if(last_hit < world.time)
if(ishuman(target))
var/mob/living/carbon/human/H = target
if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
@@ -220,7 +223,7 @@
if(check_martial_counter(H, user))
return
playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
- target.Knockdown(60)
+ target.Knockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
log_combat(user, target, "stunned", src)
src.add_fingerprint(user)
target.visible_message("[user] has knocked down [target] with [src]!", \
@@ -229,7 +232,7 @@
target.LAssailant = null
else
target.LAssailant = user
- cooldown = world.time
+ last_hit = world.time + cooldown
user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
/obj/item/melee/classic_baton/telescopic
@@ -245,7 +248,7 @@
item_flags = NONE
force = 0
on = FALSE
- total_mass = TOTAL_MASS_SMALL_ITEM
+ total_mass = TOTAL_MASS_NORMAL_ITEM
/obj/item/melee/classic_baton/telescopic/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 6e41527b24..cf5d685b4a 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -1,7 +1,7 @@
/obj/item/storage/box/syndicate
/obj/item/storage/box/syndicate/PopulateContents()
- switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
+ switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "baseball" = 1, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
if("bloodyspai") // 30 tc now this is more right
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
new /obj/item/clothing/mask/chameleon(src) // Goes with above
@@ -52,7 +52,7 @@
new /obj/item/clothing/under/suit_jacket/really_black(src)
new /obj/item/screwdriver/power(src) //2 tc item
- if("murder") // 35 tc now
+ if("murder") // 35 tc
new /obj/item/melee/transforming/energy/sword/saber(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/card/emag(src)
@@ -62,6 +62,17 @@
new /obj/item/clothing/glasses/phantomthief/syndicate(src)
new /obj/item/reagent_containers/syringe/stimulants(src)
+ if("baseball") // 42~ tc
+ new /obj/item/melee/baseball_bat/ablative/syndi(src) //Lets say 12 tc, lesser sleeping carp
+ new /obj/item/clothing/glasses/sunglasses/garb(src) //Lets say 2 tc
+ new /obj/item/card/emag(src) //6 tc
+ new /obj/item/clothing/shoes/sneakers/noslip(src) //2tc
+ new /obj/item/encryptionkey/syndicate(src) //1tc
+ new /obj/item/autosurgeon/anti_drop(src) //Lets just say 7~
+ new /obj/item/clothing/under/syndicate/baseball(src) //3tc
+ new /obj/item/clothing/head/soft/baseball(src) //Lets say 4 tc
+ new /obj/item/reagent_containers/hypospray/medipen/stimulants/baseball(src) //lets say 5tc
+
if("implant") // 67+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
new /obj/item/implanter/freedom(src)
new /obj/item/implanter/uplink/precharged(src)
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 70bfebb799..f891a48df6 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -31,7 +31,7 @@
name = "brass crowbar"
desc = "A brass crowbar. It feels faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "crowbar_brass"
+ icon_state = "crowbar_clock"
toolspeed = 0.5
/obj/item/crowbar/bronze
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 68946f73cd..6cbede78a8 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -81,7 +81,7 @@
name = "brass screwdriver"
desc = "A screwdriver made of brass. The handle feels freezing cold."
resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "screwdriver_brass"
+ icon_state = "screwdriver_clock"
item_state = "screwdriver_brass"
toolspeed = 0.5
random_color = FALSE
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 9b622a14c4..fb38e4335e 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -360,7 +360,7 @@
name = "brass welding tool"
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "brasswelder"
+ icon_state = "clockwelder"
item_state = "brasswelder"
/obj/item/weldingtool/bronze
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 527891afdb..e40ae8bdc1 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -63,9 +63,9 @@
/obj/item/wirecutters/brass
name = "brass wirecutters"
- desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
+ desc = "A pair of eloquent wirecutters made of brass. The handle feels freezing cold to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "cutters_brass"
+ icon_state = "cutters_clock"
random_color = FALSE
toolspeed = 0.5
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 8ff960825a..462eb22aaa 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -32,7 +32,7 @@
name = "brass wrench"
desc = "A brass wrench. It's faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
- icon_state = "wrench_brass"
+ icon_state = "wrench_clock"
toolspeed = 0.5
/obj/item/wrench/bronze
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index c6384e7438..4cb6fc74c0 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -522,7 +522,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
throwforce = 14
obj_flags = UNIQUE_RENAME
var/chaplain_spawnable = TRUE
- total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/melee/baseball_bat/chaplain/Initialize()
. = ..()
@@ -578,6 +578,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, 1)
return 1
+/obj/item/melee/baseball_bat/ablative/syndi
+ name = "syndicate major league bat"
+ desc = "A metal bat made by the syndicate for the major league team."
+ force = 18 //Spear damage...
+ throwforce = 30
+
/obj/item/melee/flyswatter
name = "flyswatter"
desc = "Useful for killing insects of all sizes."
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
index 819dbafd6a..98164de099 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
@@ -1,5 +1,5 @@
/datum/surgery/organ_extraction
- name = "experimental dissection"
+ name = "experimental organ replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
possible_locs = list(BODY_ZONE_CHEST)
ignore_clothes = 1
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 686d5d3572..f9fc7b9221 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1039,7 +1039,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/available_in_days = job.available_in_days(user.client)
HTML += "[rank]
\[IN [(available_in_days)] DAYS\] | "
continue
- if((job_preferences[SSjob.overflow_role] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
+ if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
HTML += "[rank] | "
continue
if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs
@@ -1054,7 +1054,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/prefUpperLevel = -1 // level to assign on left click
var/prefLowerLevel = -1 // level to assign on right click
- switch(job_preferences[job.title])
+ switch(job_preferences["[job.title]"])
if(JP_HIGH)
prefLevelLabel = "High"
prefLevelColor = "slateblue"
@@ -1079,7 +1079,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
HTML += ""
if(rank == SSjob.overflow_role)//Overflow is special
- if(job_preferences[SSjob.overflow_role] == JP_LOW)
+ if(job_preferences["[SSjob.overflow_role]"] == JP_LOW)
HTML += "Yes"
else
HTML += "No"
@@ -1115,11 +1115,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (level == JP_HIGH) // to high
//Set all other high to medium
for(var/j in job_preferences)
- if(job_preferences[j] == JP_HIGH)
- job_preferences[j] = JP_MEDIUM
+ if(job_preferences["[j]"] == JP_HIGH)
+ job_preferences["[j]"] = JP_MEDIUM
//technically break here
- job_preferences[job.title] = level
+ job_preferences["[job.title]"] = level
return TRUE
/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
@@ -1147,7 +1147,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
jpval = JP_HIGH
if(role == SSjob.overflow_role)
- if(job_preferences[job.title] == JP_LOW)
+ if(job_preferences["[job.title]"] == JP_LOW)
jpval = null
else
jpval = JP_LOW
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c900349843..ebd135916c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 22
+#define SAVEFILE_VERSION_MAX 23
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -49,8 +49,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
pda_style = "mono"
if(current_version < 20)
pda_color = "#808000"
- if(current_version < 21)
+ if((current_version < 21) && features["meat_type"] && (features["meat_type"] == null))
+ features["meat_type"] = "Mammalian"
+ if(current_version < 22)
+
job_preferences = list() //It loaded null from nonexistant savefile field.
+
var/job_civilian_high = 0
var/job_civilian_med = 0
var/job_civilian_low = 0
@@ -101,9 +105,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else if(job_engsec_low & fval)
new_value = JP_LOW
if(new_value)
- job_preferences[initial(J.title)] = new_value
- if((current_version < 22) && features["meat_type"] && (features["meat_type"] == null))
- features["meat_type"] = "Mammalian"
+ job_preferences["[initial(J.title)]"] = new_value
+ else if(current_version < 23) // we are fixing a gamebreaking bug.
+ job_preferences = list() //It loaded null from nonexistant savefile field.
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -457,9 +461,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
- shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color))
+ shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
- socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color))
+ socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color))
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 3, 0)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
@@ -485,7 +489,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
for(var/j in job_preferences)
- if(job_preferences[j] != JP_LOW && job_preferences[j] != JP_MEDIUM && job_preferences[j] != JP_HIGH)
+ if(job_preferences["[j]"] != JP_LOW && job_preferences["[j]"] != JP_MEDIUM && job_preferences["[j]"] != JP_HIGH)
job_preferences -= j
all_quirks = SANITIZE_LIST(all_quirks)
diff --git a/code/modules/clothing/glasses/vg_glasses.dm b/code/modules/clothing/glasses/vg_glasses.dm
index 449b34b22e..a51a03242c 100644
--- a/code/modules/clothing/glasses/vg_glasses.dm
+++ b/code/modules/clothing/glasses/vg_glasses.dm
@@ -6,21 +6,18 @@
name = "purple sunglasses"
icon_state = "sun_purple"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/sunglasses/star
name = "star-shaped sunglasses"
desc = "Novelty sunglasses, both lenses are in the shape of a star."
icon_state = "sun_star"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/sunglasses/rockstar
name = "red star-shaped sunglasses"
desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones."
icon_state = "sun_star_silver"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/gglasses
name = "Green Glasses"
@@ -28,7 +25,6 @@
icon_state = "gglasses"
item_state = "gglasses"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
@@ -36,7 +32,6 @@
icon_state = "rwelding-g"
item_state = "rwelding-g"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi'
actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 1
diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm
index 7b0e68264f..df4a21d6c1 100644
--- a/code/modules/clothing/head/cit_hats.dm
+++ b/code/modules/clothing/head/cit_hats.dm
@@ -4,4 +4,3 @@
icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi'
icon_state = "hunter"
item_state = "hunter_worn"
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 5c7514541d..b14b0575f9 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -129,3 +129,14 @@
icon_state = "emtsoft"
item_color = "emt"
dog_fashion = null
+
+/obj/item/clothing/head/soft/baseball
+ name = "baseball cap"
+ desc = "It's a robust baseball hat, this one belongs to syndicate major league team."
+ icon_state = "baseballsoft"
+ item_color = "baseballsoft"
+ item_state = "baseballsoft"
+ flags_inv = HIDEEYES|HIDEFACE
+ armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
+ strip_delay = 90 //You dont take a Major Leage cap
+ dog_fashion = null
\ No newline at end of file
diff --git a/code/modules/clothing/head/vg_hats.dm b/code/modules/clothing/head/vg_hats.dm
index efeb5291db..dc245cd39a 100644
--- a/code/modules/clothing/head/vg_hats.dm
+++ b/code/modules/clothing/head/vg_hats.dm
@@ -1,4 +1,3 @@
-
/obj/item/clothing/head/helmet/dredd
name = "Judge Helmet"
desc = "Judge, Jury, and Executioner."
@@ -12,7 +11,6 @@
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
dog_fashion = null
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/aviatorhelmet
name = "Aviator Helmet"
@@ -21,15 +19,12 @@
item_state = "aviator_helmet"
icon_state = "aviator_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/biker
name = "Biker's Helmet"
desc = "This helmet should protect you from russians and masked vigilantes."
armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0)
icon_state = "biker_helmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
/obj/item/clothing/head/helmet/richard
@@ -38,7 +33,6 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
icon_state = "richard"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
/obj/item/clothing/head/helmet/megahelmet
@@ -47,7 +41,6 @@
icon_state = "megahelmet"
item_state = "megahelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 1
/obj/item/clothing/head/helmet/protohelmet
@@ -56,7 +49,6 @@
icon_state = "protohelmet"
item_state = "protohelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 1
/obj/item/clothing/head/helmet/megaxhelmet
@@ -65,7 +57,6 @@
icon_state = "megaxhelmet"
item_state = "megaxhelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/joehelmet
name = "Sniper Helmet"
@@ -74,7 +65,6 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
item_state = "joehelmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/helmet/doomguy
name = "Doomguy's helmet"
@@ -83,7 +73,6 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
item_state = "doom"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/neorussian
@@ -92,8 +81,6 @@
icon_state = "nr_helmet"
item_state = "nr_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
-
/obj/item/clothing/head/stalhelm
name = "Stalhelm"
@@ -101,7 +88,6 @@
icon_state = "stalhelm"
item_state = "stalhelm"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/panzer
name = "Panzer Cap"
@@ -109,7 +95,6 @@
icon_state = "panzercap"
item_state = "panzercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/naziofficer
name = "Officer Cap"
@@ -117,8 +102,6 @@
icon_state = "officercap"
item_state = "officercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
-
/obj/item/clothing/head/russobluecamohat
name = "russian blue camo beret"
@@ -133,7 +116,6 @@
icon_state = "russofurhat"
item_state = "russofurhat"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/squatter_hat
name = "slav squatter hat"
@@ -141,7 +123,6 @@
item_state = "squatter_hat"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
desc = "Cyka blyat."
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/snake
name = "snake head"
@@ -149,8 +130,6 @@
icon_state = "snakehead"
item_state = "snakehead"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
-
/obj/item/clothing/head/mummy_rags
name = "mummy rags"
desc = "Ancient rags taken off from some mummy."
@@ -158,7 +137,6 @@
item_state = "mummy"
item_color = "mummy"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
/obj/item/clothing/head/clownpiece
@@ -167,7 +145,6 @@
icon_state = "clownpiece"
item_state = "clownpiece"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/mitre
name = "mitre"
@@ -175,7 +152,6 @@
icon_state = "mitre"
item_state = "mitre"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
/obj/item/clothing/head/tinfoil
name = "tinfoil hat"
@@ -183,7 +159,6 @@
icon_state = "foilhat"
item_state = "paper"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
siemens_coefficient = 2
/obj/item/clothing/head/celtic
@@ -192,4 +167,3 @@
icon_state = "celtic_crown"
item_state = "celtic_crown"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
diff --git a/code/modules/clothing/masks/vg_masks.dm b/code/modules/clothing/masks/vg_masks.dm
index 7de27fb780..29b65a6b8e 100644
--- a/code/modules/clothing/masks/vg_masks.dm
+++ b/code/modules/clothing/masks/vg_masks.dm
@@ -3,18 +3,15 @@
desc = "Some pranksters are truly magical."
icon_state = "wizzclown"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
/obj/item/clothing/mask/chapmask
name = "venetian mask"
desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut."
icon_state = "chapmask"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
/obj/item/clothing/mask/neorussian
name = "neo-Russian mask"
desc = "Somehow, it makes you act and look way more polite than usual."
icon_state = "nr_mask"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi'
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 4659de3e6a..7fe527fec3 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -62,6 +62,16 @@
desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
icon_state = "galoshes_dry"
+/obj/item/clothing/shoes/sneakers/noslip
+ desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface."
+ name = "black shoes"
+ icon_state = "black"
+ permeability_coefficient = 0.30
+ clothing_flags = NOSLIP
+ strip_delay = 50
+ equip_delay_other = 50
+ resistance_flags = NONE
+
/obj/item/clothing/shoes/galoshes/dry/step_action()
var/turf/open/t_loc = get_turf(src)
SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY)
@@ -69,10 +79,8 @@
/obj/item/clothing/shoes/clown_shoes
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
name = "clown shoes"
- icon_state = "clown"
- item_state = "clown_shoes"
+ icon_state = "clown_shoes"
slowdown = SHOES_SLOWDOWN+1
- item_color = "clown"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
/obj/item/clothing/shoes/clown_shoes/Initialize()
@@ -98,7 +106,6 @@
name = "jackboots"
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
icon_state = "jackboots"
- item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
item_color = "hosred"
@@ -115,7 +122,6 @@
name = "winter boots"
desc = "Boots lined with 'synthetic' animal fur."
icon_state = "winterboots"
- item_state = "winterboots"
permeability_coefficient = 0.15
cold_protection = FEET|LEGS
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -127,7 +133,6 @@
name = "work boots"
desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
icon_state = "workboots"
- item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
permeability_coefficient = 0.15
@@ -145,7 +150,6 @@
name = "\improper Nar'Sien invoker boots"
desc = "A pair of boots worn by the followers of Nar'Sie."
icon_state = "cult"
- item_state = "cult"
item_color = "cult"
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -178,7 +182,6 @@
name = "roman sandals"
desc = "Sandals with buckled leather straps on it."
icon_state = "roman"
- item_state = "roman"
strip_delay = 100
equip_delay_other = 100
permeability_coefficient = 0.9
@@ -187,14 +190,12 @@
name = "griffon boots"
desc = "A pair of costume boots fashioned after bird talons."
icon_state = "griffinboots"
- item_state = "griffinboots"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
/obj/item/clothing/shoes/bhop
name = "jump boots"
desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement."
icon_state = "jetboots"
- item_state = "jetboots"
item_color = "hosred"
resistance_flags = FIRE_PROOF
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
@@ -252,7 +253,6 @@
name = "Wheely-Heels"
desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
icon_state = "wheelys"
- item_state = "wheelys"
actions_types = list(/datum/action/item_action/wheelys)
var/wheelToggle = FALSE //False means wheels are not popped out
var/obj/vehicle/ridden/scooter/wheelys/W
@@ -291,7 +291,6 @@
name = "Kindle Kicks"
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
icon_state = "kindleKicks"
- item_state = "kindleKicks"
actions_types = list(/datum/action/item_action/kindleKicks)
var/lightCycle = 0
var/active = FALSE
diff --git a/code/modules/clothing/shoes/vg_shoes.dm b/code/modules/clothing/shoes/vg_shoes.dm
index 931c25b823..627a061181 100644
--- a/code/modules/clothing/shoes/vg_shoes.dm
+++ b/code/modules/clothing/shoes/vg_shoes.dm
@@ -5,7 +5,6 @@
icon_state = "leather"
item_color = "leather"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/magboots/deathsquad
@@ -14,7 +13,6 @@
icon_state = "DS-magboots0"
magboot_state = "DS-magboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -23,7 +21,6 @@
name = "atmospherics magboots"
icon_state = "atmosmagboots0"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
magboot_state = "atmosmagboots"
resistance_flags = FIRE_PROOF
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -33,7 +30,6 @@
desc = "Simon's Shoes."
icon_state = "simonshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/kneesocks
@@ -41,7 +37,6 @@
desc = "A pair of girly knee-high socks."
icon_state = "kneesock"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/jestershoes
@@ -49,7 +44,6 @@
desc = "As worn by the clowns of old."
icon_state = "jestershoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/aviatorboots
@@ -57,7 +51,6 @@
desc = "Boots suitable for just about any occasion."
icon_state = "aviator_boots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/libertyshoes
@@ -65,7 +58,6 @@
desc = "Freedom isn't free, neither were these shoes."
icon_state = "libertyshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/megaboots
@@ -73,7 +65,6 @@
desc = "Large armored boots, very weak to large spikes."
icon_state = "megaboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/protoboots
@@ -81,7 +72,6 @@
desc = "Functionally identical to the DRN-001 model's boots, but in red."
icon_state = "protoboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/megaxboots
@@ -89,7 +79,6 @@
desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike."
icon_state = "megaxboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/joeboots
@@ -97,7 +86,6 @@
desc = "Nearly identical to the Prototype's boots, except in black."
icon_state = "joeboots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/doomguy
@@ -105,7 +93,6 @@
desc = "If you look closely, you might see skull fragments still buried in these boots."
icon_state = "doom"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/rottenshoes
@@ -113,7 +100,6 @@
desc = "These shoes seem perfect for sneaking around."
icon_state = "rottenshoes"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/sandal/slippers
@@ -121,7 +107,6 @@
icon_state = "slippers"
desc = "For the wizard that puts comfort first. Who's going to laugh?"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/slippers_worn
@@ -129,7 +114,6 @@
desc = "Fluffy..."
icon_state = "slippers_worn"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/jackboots/neorussian
@@ -137,5 +121,4 @@
desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit."
icon_state = "nr_boots"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
\ No newline at end of file
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 2ad1bba042..39025a1189 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -5,6 +5,7 @@
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
slot_flags = ITEM_SLOT_OCLOTHING
+ body_parts_covered = CHEST
var/blood_overlay_type = "suit"
var/togglename = null
var/suittoggled = FALSE
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 0840288eee..19050dc36f 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,6 +1,5 @@
/obj/item/clothing/suit/armor
allowed = null
- body_parts_covered = CHEST
cold_protection = CHEST|GROIN
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index c3276213e1..b8287c7f4c 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -7,7 +7,7 @@
icon_state = "qmcloak"
item_state = "qmcloak"
w_class = WEIGHT_CLASS_SMALL
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ body_parts_covered = CHEST|LEGS|ARMS
/obj/item/clothing/head/cloakhood
name = "cloak hood"
@@ -62,7 +62,7 @@
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
- body_parts_covered = CHEST|GROIN|ARMS
+ body_parts_covered = CHEST|ARMS|LEGS
/obj/item/clothing/head/hooded/cloakhood/goliath
name = "goliath cloak hood"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 36965afd07..4318839845 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -153,6 +153,7 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
+ body_parts_covered = NONE
//Security
/obj/item/clothing/suit/security/officer
@@ -215,3 +216,4 @@
item_state = "techpriesthood"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS
+ mutantrace_variation = MUTANTRACE_VARIATION
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index ddffe5fe6e..942fdaed73 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -67,6 +67,7 @@
item_state = "death"
flags_1 = CONDUCT_1
fire_resist = T0C+5200
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -75,6 +76,7 @@
desc = "this pretty much looks ridiculous" //Needs no fixing
icon_state = "justice"
item_state = "justice"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -100,14 +102,14 @@
desc = "A fancy purple apron for a stylish person."
icon_state = "purplebartenderapron"
item_state = "purplebartenderapron"
- body_parts_covered = CHEST|GROIN|LEGS
+ body_parts_covered = CHEST
/obj/item/clothing/suit/syndicatefake
name = "black and red space suit replica"
icon_state = "syndicate-black-red"
item_state = "syndicate-black-red"
desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
- w_class = WEIGHT_CLASS_NORMAL
+ body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
resistance_flags = NONE
@@ -154,7 +156,7 @@
icon_state = "owl_wings"
item_state = "owl_wings"
togglename = "wings"
- body_parts_covered = ARMS|CHEST
+ body_parts_covered = ARMS
actions_types = list(/datum/action/item_action/toggle_wings)
/obj/item/clothing/suit/toggle/owlwings/Initialize()
@@ -209,6 +211,7 @@
desc = "Your classic, non-racist poncho."
icon_state = "classicponcho"
item_state = "classicponcho"
+ body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/poncho/green
name = "green poncho"
@@ -245,7 +248,7 @@
desc = "A costume made from 'synthetic' carp scales, it smells."
icon_state = "carp_casual"
item_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too
allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun)
@@ -265,9 +268,7 @@
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
icon_state = "ian"
item_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS
- //cold_protection = CHEST|GROIN|ARMS
- //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET
allowed = list()
hoodtype = /obj/item/clothing/head/hooded/ian_hood
dog_fashion = /datum/dog_fashion/back
@@ -277,8 +278,6 @@
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
icon_state = "ian"
body_parts_covered = HEAD
- //cold_protection = HEAD
- //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
/obj/item/clothing/suit/hooded/bee_costume // It's Hip!
@@ -304,7 +303,7 @@
desc = "A horribly bloated suit made from human skins."
icon_state = "lingspacesuit"
item_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS
allowed = list()
actions_types = list(/datum/action/item_action/toggle_human_head)
hoodtype = /obj/item/clothing/head/hooded/human_head
@@ -345,18 +344,21 @@
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in."
icon_state = "ianshirt"
item_state = "ianshirt"
+ body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/nerdshirt
name = "gamer shirt"
desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?"
icon_state = "nerdshirt"
item_state = "nerdshirt"
+ body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
name = "Vape Naysh shirt"
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
icon_state = "vapeshirt"
item_state = "vapeshirt"
+ body_parts_covered = CHEST|GROIN
/obj/item/clothing/suit/jacket
name = "bomber jacket"
@@ -364,7 +366,7 @@
icon_state = "bomberjacket"
item_state = "brownjsuit"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio)
- body_parts_covered = CHEST|GROIN|ARMS
+ body_parts_covered = CHEST|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -389,6 +391,7 @@
desc = "A thick jacket with a rubbery, water-resistant shell."
icon_state = "pufferjacket"
item_state = "hostrench"
+ body_parts_covered = CHEST|GROIN|ARMS
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/jacket/puffer/vest
@@ -436,18 +439,21 @@
desc = "Looks like this belongs in a very old movie set."
icon_state = "draculacoat"
item_state = "draculacoat"
+ body_parts_covered = CHEST|ARMS
/obj/item/clothing/suit/drfreeze_coat
name = "doctor freeze's labcoat"
desc = "A labcoat imbued with the power of features and freezes."
icon_state = "drfreeze_coat"
item_state = "drfreeze_coat"
+ body_parts_covered = CHEST|GROIN|ARMS
/obj/item/clothing/suit/gothcoat
name = "gothic coat"
desc = "Perfect for those who want stalk in a corner of a bar."
icon_state = "gothcoat"
item_state = "gothcoat"
+ body_parts_covered = CHEST|ARMS|HAND_LEFT //peculiar
/obj/item/clothing/suit/xenos
name = "xenos suit"
@@ -586,6 +592,7 @@
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
icon_state = "bedsheet"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
@@ -594,6 +601,7 @@
desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_cuirass_old"
+ body_parts_covered = CHEST|GROIN|LEGS
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
/obj/item/clothing/suit/ghost_sheet
@@ -606,4 +614,5 @@
throw_range = 2
w_class = WEIGHT_CLASS_TINY
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
alternate_worn_layer = UNDER_HEAD_LAYER
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 9893edf248..4e3e1aa0cc 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -67,3 +67,14 @@
icon_state = "syndicate_combat"
item_color = "syndicate_combat"
can_adjust = FALSE
+
+/obj/item/clothing/under/syndicate/baseball
+ name = "major league, number unknown"
+ desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game"
+ icon_state = "syndicatebaseball"
+ item_state = "syndicatebaseball"
+ item_color = "syndicatebaseball"
+ has_sensor = NO_SENSORS
+ armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ alt_covers_chest = TRUE
+
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index f87eebe35b..8d63d68878 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -381,6 +381,33 @@
id = "neurotoxin"
results = list("neurotoxin" = 2)
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
+ //FermiChem vars: Easy to make, but hard to make potent
+ OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
+ OptimalTempMax = 950 // Upper end for above
+ ExplodeTemp = 999 //Temperature at which reaction explodes
+ OptimalpHMin = 4.6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
+ OptimalpHMax = 5.2 // Higest value for above
+ ReactpHLim = 5 // How far out pH wil react, giving impurity place (Exponential phase)
+ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
+ CurveSharpT = 2 // How sharp the temperature exponential curve is (to the power of value)
+ CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
+ ThermicConstant = 10 //Temperature change per 1u produced
+ HIonRelease = 0.02 //pH change per 1u reaction
+ RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect
+ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
+ FermiExplode = FALSE //If the chemical explodes in a special way
+ PurityMin = 0 //The minimum purity something has to be above, otherwise it explodes.
+
+/datum/chemical_reaction/neurotoxin/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ var/datum/reagent/consumable/ethanol/neurotoxin/Nt = locate(/datum/reagent/consumable/ethanol/neurotoxin) in my_atom.reagents.reagent_list
+ var/cached_volume = Nt.volume
+ if(Nt.purity < 0.5)
+ holder.remove_reagent(src.id, cached_volume)
+ holder.add_reagent("neuroweak", cached_volume)
+
+/datum/chemical_reaction/neurotoxin/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//reduced size
+ volume = volume/10
+ ..()
/datum/chemical_reaction/snowwhite
name = "Snow White"
@@ -807,4 +834,4 @@
id = "commander_and_chief"
results = list("commander_and_chief" = 50)
required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10)
- mix_message = "When your powers combine, I am Captain Pl-..."
\ No newline at end of file
+ mix_message = "When your powers combine, I am Captain Pl-..."
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index b08fadefcb..994d082585 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -28,9 +28,9 @@
var/datum/job/previewJob
var/highest_pref = 0
for(var/job in job_preferences)
- if(job_preferences[job] > highest_pref)
+ if(job_preferences["[job]"] > highest_pref)
previewJob = SSjob.GetJob(job)
- highest_pref = job_preferences[job]
+ highest_pref = job_preferences["[job]"]
if(previewJob)
// Silicons only need a very basic preview since there is no customization for them.
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index ff4878aa13..5af295a5dd 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -348,10 +348,15 @@
if(temp)
var/update = 0
var/dmg = rand(M.force/2, M.force)
+ var/atom/throw_target = get_edge_target_turf(src, M.dir)
switch(M.damtype)
if("brute")
- if(M.force > 20)
- Unconscious(20)
+ if(M.force > 35) // durand and other heavy mechas
+ Knockdown(50)
+ src.throw_at(throw_target, rand(1,5), 7)
+ else if(M.force >= 20 && !IsKnockdown()) // lightweight mechas like gygax
+ Knockdown(30)
+ src.throw_at(throw_target, rand(1,3), 7)
update |= temp.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if("fire")
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3027af626e..58426a8ad0 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1351,10 +1351,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot(ORGAN_SLOT_THRUSTERS)
if(!istype(J) && istype(C))
J = C.jetpack
- if(istype(J) && J.full_speed && J.allow_thrust(0.01, H)) //Prevents stacking
- . -= 2
- else if(istype(T) && T.allow_thrust(0.01, H))
- . -= 2
+ if(istype(J) && J.full_speed && J.allow_thrust(0.005, H)) //Prevents stacking
+ . -= 0.4
+ else if(istype(T) && T.allow_thrust(0.005, H))
+ . -= 0.4
if(!ignoreslow && gravity)
if(H.wear_suit)
diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm
index 620f0b2543..146090b366 100644
--- a/code/modules/mob/living/carbon/human/species_types/corporate.dm
+++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm
@@ -16,5 +16,5 @@
blacklisted = 1
use_skintones = 0
species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS)
- inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
+ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER)
sexes = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index e325cbb4f4..ac18580e9b 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -4,7 +4,7 @@
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
species_traits = list(NOTRANSSTING,NOGENITALS,NOAROUSAL) //all of these + whatever we inherit from the real species
- inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
dangerous_existence = 1
blacklisted = 1
@@ -12,7 +12,7 @@
damage_overlay_type = "synth"
limbs_id = "synth"
var/list/initial_species_traits = list(NOTRANSSTING) //for getting these values back for assume_disguise()
- var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 36e4e18817..7a3405cc09 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -475,7 +475,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
/mob/living/carbon/handle_status_effects()
..()
if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active
- adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -3) : -1.5)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
+ adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
if(!recoveringstam && incomingstammult != 1)
incomingstammult = max(0.01, incomingstammult)
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 0ddcd90f08..63a83ac96b 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -193,7 +193,7 @@
var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
legcuffs.color = legcuffed.color
- overlays_standing[HANDCUFF_LAYER] = legcuffs
+ overlays_standing[LEGCUFF_LAYER] = legcuffs
apply_overlay(LEGCUFF_LAYER)
throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index 115b14b63b..1bda62e064 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -2,7 +2,6 @@
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
- item_state = "secshoes"
permeability_coefficient = 0.01
clothing_flags = NOSLIP
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 61273d181d..0cdfec0754 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -496,7 +496,12 @@
//Standard reaction mechanics:
else
- if (C.FermiChem == TRUE)//Just to make sure
+ if (C.FermiChem == TRUE)//Just to make sure, should only proc when grenades are combining.
+ if (chem_temp > C.ExplodeTemp) //To allow fermigrenades
+ var/datum/chemical_reaction/fermi/Ferm = selected_reaction
+ fermiIsReacting = FALSE
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, ("[Ferm] explosion"))
+ Ferm.FermiExplode(src, my_atom, volume = total_volume, temp = chem_temp, pH = pH)
return 0
for(var/B in cached_required_reagents) //
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index c5ff9bb70b..85cf5e5011 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -397,9 +397,9 @@
state = "Gas"
var/const/P = 3 //The number of seconds between life ticks
var/T = initial(R.metabolization_rate) * (60 / P)
- if(istype(R, /datum/reagent/fermi))
+ var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.id)
+ if(Rcr && Rcr.FermiChem)
fermianalyze = TRUE
- var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.id)
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
var/datum/reagent/targetReagent = beaker.reagents.has_reagent("[R.id]")
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index c21629ce8f..520148848c 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -33,18 +33,20 @@
var/addiction_stage4_end = 40
var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick.
var/self_consuming = FALSE
+ var/metabolizing = FALSE
+ var/invisible = FALSE //Set to true if it doesn't appear on handheld health analyzers.
//Fermichem vars:
var/purity = 1 //How pure a chemical is from 0 - 1.
var/addProc = FALSE //If the chemical should force an on_new() call
- var/turf/loc = null //Should be the creation location!
+ var/turf/loc = null //Should be the creation location!
var/pH = 7 //pH of the specific reagent, used for calculating the sum pH of a holder.
+ var/SplitChem = FALSE //If the chem splits on metabolism
var/ImpureChem = "fermiTox"// What chemical is metabolised with an inpure reaction
var/InverseChemVal = 0.25 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising
var/InverseChem = "fermiTox"// What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/DoNotSplit = FALSE // If impurity is handled within the main chem itself
var/OnMobMergeCheck = FALSE //Call on_mob_life proc when reagents are merging.
- var/metabolizing = FALSE
- var/invisible = FALSE //Set to true if it doesn't appear on handheld health analyzers.
+
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
@@ -74,7 +76,27 @@
return
// Called when this reagent is first added to a mob
-/datum/reagent/proc/on_mob_add(mob/living/L)
+/datum/reagent/proc/on_mob_add(mob/living/L, amount)
+ if(SplitChem)
+ var/mob/living/carbon/M = L
+ if(!M)
+ return
+ if(purity < 0)
+ CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
+ if (purity == 1 || DoNotSplit == TRUE)
+ log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]")
+ return
+ else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem
+ M.reagents.remove_reagent(id, amount, FALSE)
+ M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
+ log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [InverseChem]")
+ return
+ else
+ var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem
+ M.reagents.remove_reagent(id, (impureVol), FALSE)
+ M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
+ log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]")
+ log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [ImpureChem]")
return
// Called when this reagent is removed while inside a mob
@@ -97,7 +119,32 @@
return
// Called when two reagents of the same are mixing.
-/datum/reagent/proc/on_merge(data)
+/datum/reagent/proc/on_merge(data, amount, mob/living/carbon/M, purity)
+ if(SplitChem)
+ if(!ishuman(M))
+ return
+ if (purity < 0)
+ CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
+ if (purity == 1 || DoNotSplit == TRUE)
+ log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [id] in themselves")
+ return
+ else if (InverseChemVal > purity)
+ M.reagents.remove_reagent(id, amount, FALSE)
+ M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
+ for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
+ if(R.name == "")
+ R.name = name//Negative effects are hidden
+ log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [InverseChem]")
+ return
+ else
+ var/impureVol = amount * (1 - purity)
+ M.reagents.remove_reagent(id, impureVol, FALSE)
+ M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
+ for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
+ if(R.name == "")
+ R.name = name//Negative effects are hidden
+ log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]")
+ log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [ImpureChem]")
return
/datum/reagent/proc/on_update(atom/A)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 615d06f481..2aa3c366da 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -1373,6 +1373,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/neurotoxin
name = "Neurotoxin"
+ id = "neurotoxin"
description = "A strong neurotoxin that puts the subject into a death-like state."
color = "#2E2E61" // rgb: 46, 46, 97
boozepwr = 50
@@ -1382,6 +1383,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "neurotoxinglass"
glass_name = "Neurotoxin"
glass_desc = "A drink that is guaranteed to knock you silly."
+ SplitChem = TRUE
+ ImpureChem = "neuroweak"
+ InverseChemVal = 0 //Clear conversion
+ InverseChem = "neuroweak"
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
@@ -1390,12 +1395,12 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.set_drugginess(50)
M.dizziness +=2
M.adjustBrainLoss(1*REM, 150)
- if(prob(20))
+ if(prob(20) && !holder.has_reagent("neuroweak"))
M.adjustStaminaLoss(10)
M.drop_all_held_items()
to_chat(M, "You cant feel your hands!")
if(current_cycle > 5)
- if(prob(20))
+ if(prob(20) && !holder.has_reagent("neuroweak"))
var/t = pickt()
ADD_TRAIT(M, t, type)
M.adjustStaminaLoss(10)
@@ -1417,6 +1422,25 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.adjustStaminaLoss(10)
..()
+/datum/reagent/consumable/ethanol/neuroweak
+ name = "Neuro-Smash"
+ id = "neuroweak"
+ description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins."
+ boozepwr = 60
+ pH = 8
+
+/datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M)
+ if(holder.has_reagent("neurotoxin"))
+ M.adjustBrainLoss(-1*REM, 150)
+ M.reagents.remove_reagent("neurotoxin", 1.5 * REAGENTS_METABOLISM, FALSE)
+ if(holder.has_reagent("fentanyl"))
+ M.adjustBrainLoss(-1*REM, 150)
+ M.reagents.remove_reagent("fentanyl", 0.75 * REAGENTS_METABOLISM, FALSE)
+ else
+ M.adjustBrainLoss(-0.5*REM, 150)
+ M.dizziness +=2
+ ..()
+
/datum/reagent/consumable/ethanol/hippies_delight
name = "Hippie's Delight"
id = "hippiesdelight"
@@ -2133,7 +2157,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "commander_and_chief"
glass_name = "Commander and Chief"
glass_desc = "The gems of this majestic chalice represent the departments and their Heads."
-
+
/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M)
if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM))
M.heal_bodypart_damage(2,2,2)
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 42b4d983d3..dd51ce2bc7 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -13,6 +13,7 @@
glass_icon_state = "glass_orange"
glass_name = "glass of orange juice"
glass_desc = "Vitamins! Yay!"
+ pH = 3.3
/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M)
if(M.getOxyLoss() && prob(30))
@@ -45,6 +46,7 @@
glass_icon_state = "glass_green"
glass_name = "glass of lime juice"
glass_desc = "A glass of sweet-sour lime juice."
+ pH = 2.2
/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M)
if(M.getToxLoss() && prob(20))
@@ -125,6 +127,7 @@
glass_icon_state = "lemonglass"
glass_name = "glass of lemon juice"
glass_desc = "Sour..."
+ pH = 2
/datum/reagent/consumable/banana
name = "Banana Juice"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 34d26a974e..ae3b4f58fb 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -103,3 +103,9 @@
update_pack_name()
else
return ..()
+
+/obj/item/reagent_containers/blood/bluespace
+ name = "bluespace blood pack"
+ desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip."
+ icon_state = "bsbloodpack"
+ volume = 600 //its a blood bath!
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 82d95cea40..a96ba006c9 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -127,6 +127,21 @@
else
to_chat(usr, "It is spent.")
+/obj/item/reagent_containers/hypospray/medipen/stimulants
+ name = "illegal stimpack medipen"
+ desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained"
+ volume = 50
+ amount_per_transfer_from_this = 10
+ list_reagents = list("stimulants" = 50)
+
+/obj/item/reagent_containers/hypospray/medipen/stimulants/baseball
+ name = "the reason the syndicate major league team wins."
+ desc = "They say drugs never win, but look where you are now, then where they are."
+ icon_state = "baseballstim"
+ volume = 50
+ amount_per_transfer_from_this = 50
+ list_reagents = list("stimulants" = 50)
+
/obj/item/reagent_containers/hypospray/medipen/stimpack //goliath kiting
name = "stimpack medipen"
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor."
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index d3db4f75b3..301d2de279 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -192,6 +192,16 @@
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+/datum/design/bsblood_bag
+ name = "Blue Space Empty Blood Bag"
+ desc = "A large sterilized plastic bag for blood."
+ id = "bsblood_bag"
+ build_path = /obj/item/reagent_containers/blood/bluespace
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 2500, MAT_PLASTIC = 4500, MAT_BLUESPACE = 250)
+ category = list("Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/cloning_disk
name = "Cloning Data Disk"
desc = "Produce additional disks for storing genetic data."
@@ -713,6 +723,13 @@
research_icon = 'icons/obj/surgery.dmi'
research_icon_state = "surgery_any"
var/surgery
+
+/datum/design/surgery/experimental_dissection
+ name = "Experimental Dissection"
+ desc = "A surgical procedure which deeply analyzes the biology of a corpse, and automatically adds new findings to the research database."
+ id = "surgery_exp_dissection"
+ surgery = /datum/surgery/advanced/bioware/experimental_dissection
+ research_icon_state = "surgery_chest"
/datum/design/surgery/lobotomy
name = "Lobotomy"
@@ -784,6 +801,22 @@
surgery = /datum/surgery/advanced/bioware/vein_threading
research_icon_state = "surgery_chest"
+/datum/design/surgery/ligament_hook
+ name = "Ligament Hook"
+ desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \
+ However this weakens the connection, making them easier to detach as well."
+ id = "surgery_ligament_hook"
+ surgery = /datum/surgery/advanced/bioware/ligament_hook
+ research_icon_state = "surgery_chest"
+
+/datum/design/surgery/ligament_reinforcement
+ name = "Ligament Reinforcement"
+ desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \
+ However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage."
+ id = "surgery_ligament_reinforcement"
+ surgery = /datum/surgery/advanced/bioware/ligament_reinforcement
+ research_icon_state = "surgery_chest"
+
/datum/design/surgery/necrotic_revival
name = "Necrotic Revival"
desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone."
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index e66b900035..ffda9c22d3 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -115,7 +115,7 @@
display_name = "Advanced Surgery"
description = "When simple medicine doesn't cut it."
prereq_ids = list("adv_biotech")
- design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox")
+ design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox", "surgery_exp_dissection")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -124,7 +124,7 @@
display_name = "Experimental Surgery"
description = "When evolution isn't fast enough."
prereq_ids = list("adv_surgery")
- design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_nerve_splice","surgery_nerve_ground","surgery_viral_bond")
+ design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 5000
@@ -272,7 +272,7 @@
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
- design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
+ design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
export_price = 5000
@@ -998,7 +998,7 @@
description = "Things used by the greys."
prereq_ids = list("biotech","engineering")
boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien,
- /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor,
+ /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
/obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 20000
@@ -1012,7 +1012,7 @@
prereq_ids = list("alientech", "adv_biotech")
design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery")
boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien,
- /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor,
+ /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
/obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 20000
@@ -1024,7 +1024,7 @@
description = "Alien engineering tools"
prereq_ids = list("alientech", "adv_engi")
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
- boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor,
+ boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
/obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 20000
@@ -1088,4 +1088,4 @@
for(var/i in processing)
var/datum/techweb_node/TN = i
TW.add_point_list(TN.research_costs)
- return TW.printout_points()
+ return TW.printout_points()
\ No newline at end of file
diff --git a/code/modules/surgery/advanced/bioware/experimental_dissection.dm b/code/modules/surgery/advanced/bioware/experimental_dissection.dm
new file mode 100644
index 0000000000..6266480baf
--- /dev/null
+++ b/code/modules/surgery/advanced/bioware/experimental_dissection.dm
@@ -0,0 +1,72 @@
+/datum/surgery/advanced/bioware/experimental_dissection
+ name = "Experimental Dissection"
+ desc = "A surgical procedure which deeply analyzes the biology of a corpse, and automatically adds new findings to the research database."
+ steps = list(/datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/dissection,
+ /datum/surgery_step/close)
+ possible_locs = list(BODY_ZONE_CHEST)
+ bioware_target = BIOWARE_DISSECTION
+
+/datum/surgery/advanced/bioware/experimental_dissection/can_start(mob/user, mob/living/carbon/target)
+ . = ..()
+ if(iscyborg(user))
+ return FALSE //robots cannot be creative
+ //(also this surgery shouldn't be consistently successful, and cyborgs have a 100% success rate on surgery)
+ if(target.stat != DEAD)
+ return FALSE
+
+/datum/surgery_step/dissection
+ name = "dissection"
+ implements = list(/obj/item/scalpel = 60, /obj/item/kitchen/knife = 30, /obj/item/shard = 15)
+ time = 125
+
+/datum/surgery_step/dissection/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You start dissecting [target].",
+ "[user] starts dissecting [target].",
+ "[user] starts dissecting [target].")
+
+/datum/surgery_step/dissection/proc/check_value(mob/living/carbon/target)
+ if(isalienroyal(target))
+ return 10000
+ else if(isalienadult(target))
+ return 5000
+ else if(ismonkey(target))
+ return 1000
+ else if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(H.dna && H.dna.species)
+ if(isabductor(H))
+ return 8000
+ if(isgolem(H) || iszombie(H))
+ return 4000
+ if(isjellyperson(H) || ispodperson(H))
+ return 3000
+ return 2000
+
+/datum/surgery_step/dissection/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You dissect [target], and add your discoveries to the research database!",
+ "[user] dissects [target], adding [user.p_their()] discoveries to the research database!",
+ "[user] dissects [target]!")
+ SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = check_value(target)))
+ var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST)
+ target.apply_damage(80, BRUTE, L)
+ new /datum/bioware/dissected(target)
+ return TRUE
+
+/datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You dissect [target], but do not find anything particularly interesting.",
+ "[user] dissects [target], however it seems [user.p_they()] didn't find anything useful.",
+ "[user] dissects [target], but looks a little dissapointed.")
+ SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = (check_value(target) * 0.2)))
+ var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST)
+ target.apply_damage(80, BRUTE, L)
+ new /datum/bioware/dissected(target)
+ return TRUE
+
+/datum/bioware/dissected
+ name = "Dissected"
+ desc = "This body has been dissected and analyzed. It is no longer worth experimenting on."
+ mod_type = BIOWARE_DISSECTION
\ No newline at end of file
diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm
new file mode 100644
index 0000000000..2c154436e6
--- /dev/null
+++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm
@@ -0,0 +1,45 @@
+/datum/surgery/advanced/bioware/ligament_hook
+ name = "Ligament Hook"
+ desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \
+ However this weakens the connection, making them easier to detach as well."
+ steps = list(/datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/reshape_ligaments,
+ /datum/surgery_step/close)
+ possible_locs = list(BODY_ZONE_CHEST)
+ bioware_target = BIOWARE_LIGAMENTS
+
+/datum/surgery_step/reshape_ligaments
+ name = "reshape ligaments"
+ accept_hand = TRUE
+ time = 125
+
+/datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You start reshaping [target]'s ligaments into a hook-like shape.",
+ "[user] starts reshaping [target]'s ligaments into a hook-like shape.",
+ "[user] starts manipulating [target]'s ligaments.")
+
+/datum/surgery_step/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You finish reshaping [target]'s ligaments into a connective hook!",
+ "[user] finishes reshaping [target]'s ligaments into a connective hook!",
+ "[user] finishes manipulating [target]'s ligaments!")
+ new /datum/bioware/hooked_ligaments(target)
+ return TRUE
+
+/datum/bioware/hooked_ligaments
+ name = "Hooked Ligaments"
+ desc = "The ligaments and nerve endings that connect the torso to the limbs are formed into a hook-like shape, so limbs can be attached without requiring surgery, but are easier to sever."
+ mod_type = BIOWARE_LIGAMENTS
+
+/datum/bioware/hooked_ligaments/on_gain()
+ ..()
+ ADD_TRAIT(owner, TRAIT_LIMBATTACHMENT, "ligament_hook")
+ ADD_TRAIT(owner, TRAIT_EASYDISMEMBER, "ligament_hook")
+
+/datum/bioware/hooked_ligaments/on_lose()
+ ..()
+ REMOVE_TRAIT(owner, TRAIT_LIMBATTACHMENT, "ligament_hook")
+ REMOVE_TRAIT(owner, TRAIT_EASYDISMEMBER, "ligament_hook")
\ No newline at end of file
diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm
new file mode 100644
index 0000000000..ac034fcea7
--- /dev/null
+++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm
@@ -0,0 +1,45 @@
+/datum/surgery/advanced/bioware/ligament_reinforcement
+ name = "Ligament Reinforcement"
+ desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \
+ However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage."
+ steps = list(/datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/reinforce_ligaments,
+ /datum/surgery_step/close)
+ possible_locs = list(BODY_ZONE_CHEST)
+ bioware_target = BIOWARE_LIGAMENTS
+
+/datum/surgery_step/reinforce_ligaments
+ name = "reinforce ligaments"
+ accept_hand = TRUE
+ time = 125
+
+/datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You start reinforcing [target]'s ligaments.",
+ "[user] starts reinforcing [target]'s ligaments.",
+ "[user] starts manipulating [target]'s ligaments.")
+
+/datum/surgery_step/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You finish reinforcing [target]'s ligaments!",
+ "[user] finishes reinforcing [target]'s ligaments!",
+ "[user] finishes manipulating [target]'s ligaments!")
+ new /datum/bioware/reinforced_ligaments(target)
+ return TRUE
+
+/datum/bioware/reinforced_ligaments
+ name = "Reinforced Ligaments"
+ desc = "The ligaments and nerve endings that connect the torso to the limbs are protected by a mix of bone and tissues, and are much harder to separate from the body, but are also easier to disable."
+ mod_type = BIOWARE_LIGAMENTS
+
+/datum/bioware/reinforced_ligaments/on_gain()
+ ..()
+ ADD_TRAIT(owner, TRAIT_NODISMEMBER, "reinforced_ligaments")
+ ADD_TRAIT(owner, TRAIT_EASYLIMBDISABLE, "reinforced_ligaments")
+
+/datum/bioware/reinforced_ligaments/on_lose()
+ ..()
+ REMOVE_TRAIT(owner, TRAIT_NODISMEMBER, "reinforced_ligaments")
+ REMOVE_TRAIT(owner, TRAIT_EASYLIMBDISABLE, "reinforced_ligaments")
\ No newline at end of file
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 7c7111181f..b46be627fb 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -231,7 +231,7 @@
return BODYPART_DISABLED_PARALYSIS
if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER))
. = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled
- if((get_damage(TRUE) >= max_damage))
+ if((get_damage(TRUE) >= max_damage) || (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) && (get_damage(TRUE) >= (max_damage * 0.6)))) //Easy limb disable disables the limb at 40% health instead of 0%
return BODYPART_DISABLED_DAMAGE
if(disabled && (get_damage(TRUE) <= (max_damage * 0.5)))
return BODYPART_NOT_DISABLED
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index 0ba6fd7fcd..2cc5c554c6 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -99,6 +99,9 @@
/obj/item/autosurgeon/reviver
starting_organ = /obj/item/organ/cyberimp/chest/reviver
+/obj/item/autosurgeon/anti_drop
+ starting_organ = /obj/item/organ/cyberimp/brain/anti_drop
+
/obj/item/autosurgeon/penis
desc = "A single use autosurgeon that contains a penis. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
diff --git a/html/changelogs/AutoChangeLog-pr-9099.yml b/html/changelogs/AutoChangeLog-pr-9099.yml
new file mode 100644
index 0000000000..d3caa658f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9099.yml
@@ -0,0 +1,6 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - tweak: "tweaked Neurotoxin"
+ - balance: "added more depth to Neurotoxin"
+ - bugfix: "fixed the inability to create Neurotoxin"
diff --git a/html/changelogs/AutoChangeLog-pr-9122.yml b/html/changelogs/AutoChangeLog-pr-9122.yml
new file mode 100644
index 0000000000..1d3ff248fb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9122.yml
@@ -0,0 +1,6 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "fun"
+ - rscdel: "bad stuff"
+ - balance: "mech bad"
diff --git a/html/changelogs/AutoChangeLog-pr-9203.yml b/html/changelogs/AutoChangeLog-pr-9203.yml
new file mode 100644
index 0000000000..0ad87d26c1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9203.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - imageadd: "redid brass tools to look better*"
diff --git a/html/changelogs/AutoChangeLog-pr-9263.yml b/html/changelogs/AutoChangeLog-pr-9263.yml
new file mode 100644
index 0000000000..36a03fa125
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9263.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "new traitor bundle"
diff --git a/html/changelogs/AutoChangeLog-pr-9269.yml b/html/changelogs/AutoChangeLog-pr-9269.yml
new file mode 100644
index 0000000000..693588208e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9269.yml
@@ -0,0 +1,5 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - tweak: "re-enables femichem explosions in grenades."
+ - tweak: "adds nuance to the SDGF and hatmium explosions."
diff --git a/html/changelogs/AutoChangeLog-pr-9282.yml b/html/changelogs/AutoChangeLog-pr-9282.yml
new file mode 100644
index 0000000000..5a27defb41
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9282.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed a few dozen suits' body coverage inconsistencies. These changes shouldn't affect armor and utility vests for most."
diff --git a/html/changelogs/AutoChangeLog-pr-9283.yml b/html/changelogs/AutoChangeLog-pr-9283.yml
new file mode 100644
index 0000000000..33e02f8539
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9283.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscdel: "Removed old things!"
diff --git a/html/changelogs/AutoChangeLog-pr-9292.yml b/html/changelogs/AutoChangeLog-pr-9292.yml
new file mode 100644
index 0000000000..33168f9c43
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9292.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed clown shoes and work boots."
diff --git a/html/changelogs/AutoChangeLog-pr-9293.yml b/html/changelogs/AutoChangeLog-pr-9293.yml
new file mode 100644
index 0000000000..a99bf1ab41
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9293.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed some overlay bug that happens when legcuffed and then handcuffed."
diff --git a/html/changelogs/AutoChangeLog-pr-9295.yml b/html/changelogs/AutoChangeLog-pr-9295.yml
new file mode 100644
index 0000000000..a96540c11b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9295.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Slowed down police baton and tele baton speed by 75%, should be still be faster than the legacy speed (2 seconds) by 0.6 seconds. Telescopic batons' stamina cost per swing is now on par with police batons, ergo more expensive."
diff --git a/html/changelogs/AutoChangeLog-pr-9296.yml b/html/changelogs/AutoChangeLog-pr-9296.yml
new file mode 100644
index 0000000000..101ec1aaa8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9296.yml
@@ -0,0 +1,9 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Increases the number of plots to 9 (from 5)"
+ - rscadd: "Additional lighting placed directly outside the garden"
+ - tweak: "Cleans up the area to reflect use. Moves the seed extractor to a more central location"
+ - tweak: "Relocates the seed packs on botany's counter to the garden
+removal: Removes wooden barricades outside the garden"
+ - config: "Renames \"Abandoned Garden\" area designation to \"Maintenance Garden\", but does not replace the icon in Dream Maker"
diff --git a/html/changelogs/AutoChangeLog-pr-9298.yml b/html/changelogs/AutoChangeLog-pr-9298.yml
new file mode 100644
index 0000000000..8301acbbd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9298.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed undershirts n socks colors prefs."
diff --git a/html/changelogs/AutoChangeLog-pr-9302.yml b/html/changelogs/AutoChangeLog-pr-9302.yml
new file mode 100644
index 0000000000..4f6ed4d336
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9302.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Things that access job_preferences now explicitly access keys, which means it no longer attempts to access invalid indices and runtimes as a result."
diff --git a/html/changelogs/AutoChangeLog-pr-9304.yml b/html/changelogs/AutoChangeLog-pr-9304.yml
new file mode 100644
index 0000000000..f4a919c52f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9304.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Blue space blood bag"
diff --git a/html/changelogs/AutoChangeLog-pr-9306.yml b/html/changelogs/AutoChangeLog-pr-9306.yml
new file mode 100644
index 0000000000..0a560c8090
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9306.yml
@@ -0,0 +1,5 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - tweak: "voidcells can now unlock alien tech"
+ - balance: "rebalanced tech trees (not really)"
diff --git a/html/changelogs/AutoChangeLog-pr-9307.yml b/html/changelogs/AutoChangeLog-pr-9307.yml
new file mode 100644
index 0000000000..de787a4274
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9307.yml
@@ -0,0 +1,4 @@
+author: "BurgerLUA"
+delete-after: True
+changes:
+ - balance: "Rebalanced special jetpacks."
diff --git a/html/changelogs/AutoChangeLog-pr-9310.yml b/html/changelogs/AutoChangeLog-pr-9310.yml
new file mode 100644
index 0000000000..34ded5a0db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9310.yml
@@ -0,0 +1,4 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - rscadd: "Added windoors to all the flaps on delta."
diff --git a/html/changelogs/AutoChangeLog-pr-9312.yml b/html/changelogs/AutoChangeLog-pr-9312.yml
new file mode 100644
index 0000000000..487b79393b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9312.yml
@@ -0,0 +1,9 @@
+author: "XDTM"
+delete-after: True
+changes:
+ - rscadd: "Added the experimental dissection surgery, which can be performed once per corpse to gain techweb points."
+ - rscadd: "Rarer specimens are more valuable, so xenos and rare species are more efficient subjects."
+ - rscadd: "Added two new surgery procedures, under the Experimental Surgery techweb node."
+ - rscadd: "Ligament Hook makes it so you can attach limbs manually (like skeletons) but makes dismemberment more likely as well."
+ - rscadd: "Ligament Reinforcement prevents dismemberment, but makes limbs easier to disable through damage."
+ - tweak: "Golem limbs can now be disabled, although they are still undismemberable."
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index e7598f35c9..118688aaba 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 09bfd9e0a2..25183c5cea 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 2b39acd3d8..90d96492f2 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index ef6c9b3f06..c5e10b01df 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index f783331c19..2506d9e629 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
index 3a5b9fd706..82b4c2e543 100644
Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 717937c034..da8ff0a20b 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index e151808cb1..77029e36b6 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 40844c9a29..b456f31a95 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi
index 80e681399a..59bc7a8e7c 100644
Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index c983201d5f..6130c67eb3 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/game/machinery/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
deleted file mode 100644
index c45eb48caa..0000000000
--- a/modular_citadel/code/game/machinery/plasmacases.dm
+++ /dev/null
@@ -1,24 +0,0 @@
-/obj/structure/guncase/plasma
- name = "plasma rifle locker"
- desc = "A locker that holds plasma rifles. Only opens in dire emergencies."
- icon_state = "ecase"
- case_type = "egun"
- gun_category = /obj/item/gun/energy/plasma
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //because fuck you, powergaming nerds.
-
-/obj/structure/guncase/plasma/attackby(obj/item/W, mob/user, params)
- return
-
-/obj/structure/guncase/plasma/MouseDrop(over_object, src_location, over_location)
- if(GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA)
- . = ..()
- else
- to_chat(usr, "The storage unit will only unlock during a Red or Delta security alert.")
-
-/obj/structure/guncase/plasma/attack_hand(mob/user)
- return MouseDrop(user)
-
-/obj/structure/guncase/plasma/emag_act()
- . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
- if(!.)
- to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/devices/genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm
deleted file mode 100644
index 5efebf4860..0000000000
--- a/modular_citadel/code/game/objects/items/devices/genemods.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-//Will include consumable gene mods in the future.
-
-/obj/item/genemod
- name = "genetic modifier"
- desc = "Microbodies which can grow, morph, or otherwise change an organism into something else."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "dnainjector"
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_TINY
- var/applied_region = "chest"
- var/list/add_mutations = list()
- var/list/remove_mutations = list()
-
- var/list/add_mutations_static = list()
- var/list/remove_mutations_static = list()
-
- var/used = 0
-
-/obj/item/genemod/proc/use(mob/living/carbon/human/target)
- return
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/melee/misc.dm b/modular_citadel/code/game/objects/items/melee/misc.dm
deleted file mode 100644
index 48c221696e..0000000000
--- a/modular_citadel/code/game/objects/items/melee/misc.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/obj/item/melee/classic_baton
- var/last_hit = 0
- var/stun_stam_cost_coeff = 1.25
- var/hardstun_ds = 1
- var/softstun_ds = 0
- var/stam_dmg = 30
- cooldown = 0
- total_mass = 3.75
-
-/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user)
- if(!on)
- return ..()
-
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit
- to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
- return //CIT CHANGE - ditto
-
- add_fingerprint(user)
- if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
- to_chat(user, "You club yourself over the head.")
- user.Knockdown(60 * force)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
- else
- user.take_bodypart_damage(2*force)
- return
- if(iscyborg(target))
- ..()
- return
- if(!isliving(target))
- return
- if (user.a_intent == INTENT_HARM)
- if(!..())
- return
- if(!iscyborg(target))
- return
- else
- if(last_hit + cooldown < world.time)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
- return
- if(check_martial_counter(H, user))
- return
- playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
- target.Knockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
- log_combat(user, target, "stunned", src)
- src.add_fingerprint(user)
- target.visible_message("[user] has knocked down [target] with [src]!", \
- "[user] has knocked down [target] with [src]!")
- if(!iscarbon(user))
- target.LAssailant = null
- else
- target.LAssailant = user
- last_hit = world.time
- user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
diff --git a/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
deleted file mode 100644
index 6afa92af65..0000000000
--- a/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
- for(var/datum/mind/crewMind in SSticker.minds)
- if(prob(5) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
- generate_miscreant_objectives(crewMind)
- else
- if(CONFIG_GET(flag/allow_crew_objectives))
- generate_individual_objectives(crewMind)
- return
-
-/datum/controller/subsystem/ticker/proc/generate_individual_objectives(var/datum/mind/crewMind)
- if(!(CONFIG_GET(flag/allow_crew_objectives)))
- return
- if(!crewMind)
- return
- if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
- return
- if(!crewMind.assigned_role)
- return
- var/list/validobjs = crewobjjobs["[ckey(crewMind.assigned_role)]"]
- if(!validobjs || !validobjs.len)
- return
- var/selectedObj = pick(validobjs)
- var/datum/objective/crew/newObjective = new selectedObj
- if(!newObjective)
- return
- newObjective.owner = crewMind
- crewMind.objectives += newObjective
- to_chat(crewMind, "As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. Performing traitorous acts in pursuit of your objective may result in termination of your employment.")
- to_chat(crewMind, "Your optional objective: [newObjective.explanation_text]")
-
-/datum/objective/crew/
- var/jobs = ""
- explanation_text = "Yell on the development discussion channel on Citadels discord if this ever shows up. Something just broke here, dude"
-
-/datum/objective/crew/proc/setup()
diff --git a/modular_citadel/code/modules/antagonists/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm
deleted file mode 100644
index 5726167820..0000000000
--- a/modular_citadel/code/modules/antagonists/cit_miscreants.dm
+++ /dev/null
@@ -1,52 +0,0 @@
-/datum/controller/subsystem/ticker/proc/generate_miscreant_objectives(var/datum/mind/crewMind)
- if(!GLOB.miscreants_allowed)
- return
- if(!crewMind)
- return
- if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
- return
- if(!crewMind.assigned_role)
- return
- if(!(ROLE_MISCREANT in crewMind.current.client.prefs.be_special))
- return
- if(jobban_isbanned(crewMind, "Syndicate"))
- return
- var/list/objectiveTypes = miscreantobjlist
- if(!objectiveTypes.len)
- return
- var/selectedType = pick(objectiveTypes)
- var/datum/objective/miscreant/newObjective = new selectedType
- if(!newObjective)
- return
- newObjective.owner = crewMind
- crewMind.objectives += newObjective
- crewMind.special_role = "miscreant"
- to_chat(crewMind, "You are a Miscreant.")
- to_chat(crewMind, "Pursuing your objective is entirely optional, as the completion of your objective is unable to be tracked. Performing traitorous acts not directly related to your objective may result in permanent termination of your employment.")
- to_chat(crewMind, "Your objective: [newObjective.explanation_text]")
-
-/datum/objective/miscreant
- explanation_text = "Something broke. Horribly. Dear god, im so sorry. Yell about this in the development discussion channel of citadels discord."
-
-/* Goon's Miscreant Objectives */
-
-
-/datum/objective/miscreant/incompetent
- explanation_text = "Be as useless and incompetent as possible without getting killed."
-
-/datum/objective/miscreant/litterbug
- explanation_text = "Make a huge mess wherever you go."
-
-/datum/objective/miscreant/creepy
- explanation_text = "Sneak around looking as suspicious as possible without actually doing anything illegal."
-
-/datum/objective/miscreant/whiny
- explanation_text = "Complain incessantly about every minor issue you find."
-
-/* Citadel's Miscreant Objectives */
-
-/datum/objective/miscreant/immersions
- explanation_text = "Act as uncharacteristic as you possibly can." // corrected from "Act as out of character as you can" people thought it meant to just ooc in ic
-
-/datum/objective/miscreant/cargonia
- explanation_text = "Attempt to establish independence of your department."
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
deleted file mode 100644
index 010337b49f..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
+++ /dev/null
@@ -1,81 +0,0 @@
-/* CARGO OBJECTIVES */
-
-/datum/objective/crew/petsplosion
- explanation_text = "Ensure there are at least (If you see this, yell on citadels discord in the development discussion channel) pets on the station by the end of the shift. Interpret this as you wish."
- jobs = "quartermaster,cargotechnician"
-
-/datum/objective/crew/petsplosion/New()
- . = ..()
- target_amount = rand(10,30)
- update_explanation_text()
-
-/datum/objective/crew/petsplosion/update_explanation_text()
- . = ..()
- explanation_text = "Ensure there are at least [target_amount] pets on the station by the end of the shift. Interpret this as you wish."
-
-/datum/objective/crew/petsplosion/check_completion()
- var/petcount = target_amount
- for(var/mob/living/simple_animal/pet/P in GLOB.mob_list)
- if(!(P.stat == DEAD))
- if(P.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(P)])
- petcount--
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(!(H.stat == DEAD))
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
- petcount--
- if(petcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/points //ported from old hippie
- explanation_text = "Make sure the station has at least (Something broke, report this to the development discussion channel of citadels discord) supply points at the end of the shift."
- jobs = "quartermaster,cargotechnician"
-
-/datum/objective/crew/points/New()
- . = ..()
- target_amount = rand(25000,100000)
- update_explanation_text()
-
-/datum/objective/crew/points/update_explanation_text()
- . = ..()
- explanation_text = "Make sure the station has at least [target_amount] supply points at the end of the shift."
-
-/datum/objective/crew/points/check_completion()
- if(SSshuttle.points >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/bubblegum
- explanation_text = "Ensure Bubblegum is dead at the end of the shift."
- jobs = "shaftminer"
-
-/datum/objective/crew/bubblegum/check_completion()
- for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list)
- if(!(B.stat == DEAD))
- return FALSE
- return TRUE
-
-/datum/objective/crew/fatstacks //ported from old hippie
- explanation_text = "Have at least (something broke, report this to the development discussion channel of citadels discord) mining points on your ID at the end of the shift."
- jobs = "shaftminer"
-
-/datum/objective/crew/fatstacks/New()
- . = ..()
- target_amount = rand(15000,50000)
- update_explanation_text()
-
-/datum/objective/crew/fatstacks/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] mining points on your ID at the end of the shift."
-
-/datum/objective/crew/fatstacks/check_completion()
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- var/obj/item/card/id/theID = H.get_idcard()
- if(istype(theID))
- if(theID.mining_points >= target_amount)
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
deleted file mode 100644
index 491285e9c4..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
+++ /dev/null
@@ -1,249 +0,0 @@
-/* CIVILIAN OBJECTIVES */
-
-/datum/objective/crew/druglordbot //ported from old Hippie with adjustments
- var/targetchem = "none"
- var/datum/reagent/chempath
- explanation_text = "Have at least (somethin broke here) harvested plants containing (report this on the development discussion channel of citadel's discord) when the shift ends."
- jobs = "botanist"
-
-/datum/objective/crew/druglordbot/New()
- . = ..()
- target_amount = rand(3,20)
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/meds = typesof(/datum/reagent/medicine) - blacklist
- var/chemlist = drugs + meds
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/druglordbot/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] harvested plants containing [initial(chempath.name)] when the shift ends."
-
-/datum/objective/crew/druglordbot/check_completion()
- var/pillcount = target_amount
- if(owner && owner.current)
- if(owner.current.contents)
- for(var/obj/item/reagent_containers/food/snacks/grown/P in owner.current.get_contents())
- if(P.reagents.has_reagent(targetchem))
- pillcount--
- if(pillcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/foodhoard
- var/datum/crafting_recipe/food/targetfood
- var/obj/item/reagent_containers/food/foodpath
- explanation_text = "Personally deliver at least (yo something broke) (report this to the developer discussion channel in citadels discord)s to Centcom."
- jobs = "cook"
-
-/datum/objective/crew/foodhoard/New()
- . = ..()
- target_amount = rand(2,10)
- var/blacklist = list(/datum/crafting_recipe/food, /datum/crafting_recipe/food/cak)
- var/possiblefoods = typesof(/datum/crafting_recipe/food) - blacklist
- targetfood = pick(possiblefoods)
- foodpath = initial(targetfood.result)
- update_explanation_text()
-
-/datum/objective/crew/foodhoard/update_explanation_text()
- . = ..()
- explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to Centcom."
-
-/datum/objective/crew/foodhoard/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(foodpath) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/responsibility
- explanation_text = "Make sure nobody dies with alcohol poisoning."
- jobs = "bartender"
-
-/datum/objective/crew/responsibility/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(H.stat == DEAD && H.drunkenness >= 80)
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- return FALSE
- return TRUE
-
-/datum/objective/crew/clean //ported from old Hippie
- var/list/areas = list()
- var/hardmode = FALSE
- explanation_text = "Ensure sure that (Yo, something broke. Yell about this in citadels devlopmeent discussion channel.) remain spotless at the end of the shift."
- jobs = "janitor"
-
-/datum/objective/crew/clean/New()
- . = ..()
- if(prob(1))
- hardmode = TRUE
- var/list/blacklistnormal = list(typesof(/area/space) - typesof(/area/lavaland) - typesof(/area/mine) - typesof(/area/ai_monitored/turret_protected) - typesof(/area/tcommsat))
- var/list/blacklisthard = list(typesof(/area/lavaland) - typesof(/area/mine))
- var/list/possibleareas = list()
- if(hardmode)
- possibleareas = GLOB.teleportlocs - /area - blacklisthard
- else
- possibleareas = GLOB.teleportlocs - /area - blacklistnormal
- for(var/i in 1 to rand(1,6))
- areas |= pick_n_take(possibleareas)
- update_explanation_text()
-
-/datum/objective/crew/clean/update_explanation_text()
- . = ..()
- explanation_text = "Ensure that the"
- for(var/i in 1 to areas.len)
- var/area/A = areas[i]
- explanation_text += " [A]"
- if(i != areas.len && areas.len >= 3)
- explanation_text += ","
- if(i == areas.len - 1)
- explanation_text += "and"
- explanation_text += " [(areas.len ==1) ? "is completely" : "are [(areas.len == 2) ? "completely" : "all"]"] clean at the end of the shift."
- if(hardmode)
- explanation_text += " Chop-chop."
-
-/datum/objective/crew/clean/check_completion()
- for(var/area/A in areas)
- for(var/obj/effect/decal/cleanable/C in area_contents(A))
- if(C && C.alpha >= 150)
- return FALSE
- return TRUE
-
-/datum/objective/crew/slipster //ported from old Hippie with adjustments
- explanation_text = "Slip at least (Yell on citadel's development discussion channel if you see this) different people with your PDA, and have it on you at the end of the shift."
- jobs = "clown"
-
-/datum/objective/crew/slipster/New()
- . = ..()
- target_amount = rand(5, 20)
- update_explanation_text()
-
-/datum/objective/crew/slipster/update_explanation_text()
- . = ..()
- explanation_text = "Slip at least [target_amount] different people with your PDA, and have it on you at the end of the shift."
-
-/datum/objective/crew/slipster/check_completion()
- var/list/uniqueslips = list()
- if(owner && owner.current)
- for(var/obj/item/pda/clown/PDA in owner.current.get_contents())
- for(var/mob/living/carbon/human/H in PDA.slipvictims)
- uniqueslips |= H
- if(uniqueslips.len >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/vow //ported from old Hippie
- explanation_text = "Never break your vow of silence."
- jobs = "mime"
-
-/datum/objective/crew/vow/check_completion()
- if(owner && owner.current)
- var/list/say_log = owner.current.logging[INDIVIDUAL_SAY_LOG]
- if(say_log.len > 0)
- return FALSE
- return TRUE
-
-/datum/objective/crew/nullrod
- explanation_text = "Don't lose your holy rod."
- jobs = "chaplain"
-
-/datum/objective/crew/nullrod/check_completion()
- if(owner && owner.current)
- for(var/nullrodtypes in typesof(/obj/item/nullrod))
- if(owner.current.check_contents_for(nullrodtypes))
- return TRUE
- if(owner.current.getorgan(/obj/item/organ/genital/penis))
- return TRUE
- return FALSE
-
-/datum/objective/crew/reporter //ported from old hippie
- var/charcount = 100
- explanation_text = "Publish at least (Yo something broke) articles containing at least (Report this to Citadels development channel) characters."
- jobs = "curator"
-
-/datum/objective/crew/reporter/New()
- . = ..()
- target_amount = rand(2,10)
- charcount = rand(20,250)
- update_explanation_text()
-
-/datum/objective/crew/reporter/update_explanation_text()
- . = ..()
- explanation_text = "Publish at least [target_amount] articles containing at least [charcount] characters."
-
-/datum/objective/crew/reporter/check_completion()
- if(owner && owner.current)
- var/ownername = "[ckey(owner.current.real_name)][ckey(owner.assigned_role)]"
- for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
- for(var/datum/newscaster/feed_message/msg in chan.messages)
- if(ckey(msg.returnAuthor()) == ckey(ownername))
- if(length(msg.returnBody()) >= charcount)
- target_amount--
- if(target_amount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/pwrgame //ported from Goon with adjustments
- var/obj/item/clothing/targettidegarb
- explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
- jobs = "assistant"
-
-/datum/objective/crew/pwrgame/New()
- . = ..()
- var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask)
- if(prob(10))
- muhvalids += list(/obj/item/clothing/suit/space)
- targettidegarb = pick(muhvalids)
- update_explanation_text()
-
-/datum/objective/crew/pwrgame/update_explanation_text()
- . = ..()
- explanation_text = "Get your grubby hands on a [initial(targettidegarb.name)]."
-/* DM is not a sane language in any way, shape, or form. If anyone wants to try to get this bit functioning proper, I hold no responsibility for broken keyboards.
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- if(H && H.dna && H.dna.species && H.dna.species.id)
- explanation_text = "Get your "
- if(H.dna.species.id == "avian")
- explanation_text += "scratchy claws "
- else if(H.dna.species.id == "mammal")
- explanation_text += "dirty paws "
- else if(H.dna.species.id == "aquatic")
- explanation_text += "fishy hands "
- else if(H.dna.species.id == "xeno")
- explanation_text += "weird claws "
- else if(H.dna.species.id == "guilmon")
- explanation_text += "digital claws "
- else if(H.dna.species.id == "lizard")
- explanation_text += "slimy claws "
- else if(H.dna.species.id == "datashark")
- explanation_text += "glitchy hands "
- else if(H.dna.species.id == "insect")
- explanation_text += "gross grabbers "
- else
- explanation_text += "grubby hands "
- explanation_text += "on a space suit." replace this if you're making this monstrosity work */
-
-/datum/objective/crew/pwrgame/check_completion()
- if(owner && owner.current)
- for(var/tidegarbtypes in typesof(targettidegarb))
- if(owner.current.check_contents_for(tidegarbtypes))
- return TRUE
- return FALSE
-
-/datum/objective/crew/promotion //ported from Goon
- explanation_text = "Have a non-assistant ID registered to you at the end of the shift."
- jobs = "assistant"
-
-/datum/objective/crew/promotion/check_completion()
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- var/obj/item/card/id/theID = H.get_idcard()
- if(istype(theID))
- if(!(H.get_assignment() == "Assistant") && !(H.get_assignment() == "No id") && !(H.get_assignment() == "No job"))
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
deleted file mode 100644
index f01c887c9f..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/* COMMAND OBJECTIVES */
-
-/datum/objective/crew/caphat //Ported from Goon
- explanation_text = "Don't lose your hat."
- jobs = "captain"
-
-/datum/objective/crew/caphat/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(/obj/item/clothing/head/caphat))
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/datfukkendisk //Ported from old Hippie
- explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to Centcom."
- jobs = "captain" //give this to other heads at your own risk.
-
-/datum/objective/crew/datfukkendisk/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(/obj/item/disk/nuclear) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/ian //Ported from old Hippie
- explanation_text = "Defend Ian at all costs, and ensure he gets delivered to Centcom at the end of the shift."
- jobs = "headofpersonnel"
-
-/datum/objective/crew/ian/check_completion()
- if(owner && owner.current)
- for(var/mob/living/simple_animal/pet/dog/corgi/Ian/goodboy in GLOB.mob_list)
- if(goodboy.stat != DEAD && SSshuttle.emergency.shuttle_areas[get_area(goodboy)])
- return TRUE
- return FALSE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
deleted file mode 100644
index 44d961e9c3..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/* ENGINEERING OBJECTIVES */
-
-/datum/objective/crew/integrity //ported from old Hippie
- explanation_text = "Ensure the station's integrity rating is at least (Yo something broke, yell on the development discussion channel of citadels discord about this)% when the shift ends."
- jobs = "chiefengineer,stationengineer"
-
-/datum/objective/crew/integrity/New()
- . = ..()
- target_amount = rand(60,95)
- update_explanation_text()
-
-/datum/objective/crew/integrity/update_explanation_text()
- . = ..()
- explanation_text = "Ensure the station's integrity rating is at least [target_amount]% when the shift ends."
-
-/datum/objective/crew/integrity/check_completion()
- var/datum/station_state/end_state = new /datum/station_state()
- end_state.count()
- var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
- if(!SSticker.mode.station_was_nuked && station_integrity >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/poly
- explanation_text = "Make sure Poly keeps his headset, and stays alive until the end of the shift."
- jobs = "chiefengineer"
-
-/datum/objective/crew/poly/check_completion()
- for(var/mob/living/simple_animal/parrot/Poly/dumbbird in GLOB.mob_list)
- if(!(dumbbird.stat == DEAD) && dumbbird.ears)
- if(istype(dumbbird.ears, /obj/item/radio/headset))
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
deleted file mode 100644
index aad6e95df4..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-/* MEDICAL OBJECTIVES */
-
-/datum/objective/crew/morgue //Ported from old Hippie
- explanation_text = "Ensure there are no corpses on the station outside of the morgue when the shift ends."
- jobs = "chiefmedicalofficer,geneticist,medicaldoctor"
-
-/datum/objective/crew/morgue/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(H.stat == DEAD && H.z == SSmapping.station_start)
- if(get_area(H) != /area/medical/morgue)
- return FALSE
- return TRUE
-
-/datum/objective/crew/chems //Ported from old Hippie
- var/targetchem = "none"
- var/datum/reagent/chempath
- explanation_text = "Have (yell about this in the development discussion channel of citadel's discord, something broke) in your bloodstream when the shift ends."
- jobs = "chiefmedicalofficer,chemist"
-
-/datum/objective/crew/chems/New()
- . = ..()
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/omnizine, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/earthsblood, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/meds = typesof(/datum/reagent/medicine) - blacklist
- var/chemlist = drugs + meds
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/chems/update_explanation_text()
- . = ..()
- explanation_text = "Have [initial(chempath.name)] in your bloodstream when the shift ends."
-
-/datum/objective/crew/chems/check_completion()
- if(owner.current)
- if(!owner.current.stat == DEAD && owner.current.reagents)
- if(owner.current.reagents.has_reagent(targetchem))
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/druglordchem //ported from old Hippie with adjustments
- var/targetchem = "none"
- var/datum/reagent/chempath
- var/chemamount = 0
- explanation_text = "Have at least (somethin broke here) pills containing at least (like really broke) units of(report this on the development discussion channel of citadel's discord) when the shift ends."
- jobs = "chemist"
-
-/datum/objective/crew/druglordchem/New()
- . = ..()
- target_amount = rand(5,50)
- chemamount = rand(1,20)
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/chemlist = drugs
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/druglordchem/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] pills containing at least [chemamount] units of [initial(chempath.name)] when the shift ends."
-
-/datum/objective/crew/druglordchem/check_completion()
- var/pillcount = target_amount
- if(owner.current)
- if(owner.current.contents)
- for(var/obj/item/reagent_containers/pill/P in owner.current.get_contents())
- if(P.reagents.has_reagent(targetchem, chemamount))
- pillcount--
- if(pillcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/noinfections
- explanation_text = "Make sure there are no crew members with harmful diseases at the end of the shift."
- jobs = "virologist"
-
-/datum/objective/crew/noinfections/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(!H.stat == DEAD)
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- if(H.check_virus() == 2)
- return FALSE
- return TRUE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
deleted file mode 100644
index fb260583fd..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/* SCIENCE OBJECTIVES */
-
-/datum/objective/crew/cyborgs //Ported from old Hippie
- explanation_text = "Ensure there are at least (Yo something broke here, yell on citadel's development discussion channel about this) functioning cyborgs when the shift ends."
- jobs = "researchdirector,roboticist"
-
-/datum/objective/crew/cyborgs/New()
- . = ..()
- target_amount = rand(3,10)
- update_explanation_text()
-
-/datum/objective/crew/cyborgs/update_explanation_text()
- . = ..()
- explanation_text = "Ensure there are at least [target_amount] functioning cyborgs when the shift ends."
-
-/datum/objective/crew/cyborgs/check_completion()
- var/borgcount = target_amount
- for(var/mob/living/silicon/robot/R in GLOB.alive_mob_list)
- if(!(R.stat == DEAD))
- borgcount--
- if(borgcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/research //inspired by old hippie's research level objective. should hopefully be compatible with techwebs when that gets finished. hopefully. should be easy to update in the event that it is incompatible with techwebs.
- var/datum/design/targetdesign
- explanation_text = "Make sure the research required to produce a (something broke, yell on citadel's development discussion channel about this) is available on the R&D server by the end of the shift."
- jobs = "researchdirector,scientist"
-
-/datum/objective/crew/research/New()
- . = ..()
- targetdesign = pick(subtypesof(/datum/design))
- update_explanation_text()
-
-/datum/objective/crew/research/update_explanation_text()
- . = ..()
- explanation_text = "Make sure the research required to produce a [initial(targetdesign.name)] is available on the R&D server by the end of the shift."
-
-/datum/objective/crew/research/check_completion()
- for(var/obj/machinery/rnd/server/S in GLOB.machines)
- if(S && S.stored_research)
- if(S.stored_research.researched_designs[initial(targetdesign.id)])
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
deleted file mode 100644
index 8906c268d2..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SECURITY OBJECTIVES */
-
-/datum/objective/crew/enjoyyourstay
- explanation_text = "Enforce Space Law to the best of your ability."
- jobs = "headofsecurity,securityofficer,warden,detective"
-
-/datum/objective/crew/enjoyyourstay/check_completion()
- if(owner && owner.current)
- if(owner.current.stat != DEAD)
- return TRUE
- return FALSE
-
-/datum/objective/crew/justicecrew
- explanation_text = "Ensure there are no innocent crew members in the brig when the shift ends."
- jobs = "lawyer"
-
-/datum/objective/crew/justicecrew/check_completion()
- if(owner && owner.current)
- for(var/datum/mind/M in SSticker.minds)
- if(M.current && isliving(M.current))
- if(!M.special_role && !(M.assigned_role == "Security Officer") && !(M.assigned_role == "Detective") && !(M.assigned_role == "Head of Security") && !(M.assigned_role == "Lawyer") && !(M.assigned_role == "Warden") && get_area(M.current) != typesof(/area/security))
- return FALSE
- return TRUE
diff --git a/modular_citadel/code/modules/cargo/packs.dm b/modular_citadel/code/modules/cargo/packs.dm
deleted file mode 100644
index 6d39a51a76..0000000000
--- a/modular_citadel/code/modules/cargo/packs.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-//supply packs
-
-/datum/supply_pack/misc/kinkmate
- name = "Kinkmate construction kit"
- cost = 2000
- contraband = TRUE
- contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
- crate_name = "Kinkmate construction kit"
-
-
-//Food and livestocks
-
-/datum/supply_pack/organic/critter/kiwi
- name = "Space kiwi Crate"
- cost = 2000
- contains = list( /mob/living/simple_animal/kiwi)
- crate_name = "space kiwi crate"
-
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////// Miscellaneous ///////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-/datum/supply_pack/misc/jukebox
- name = "Jukebox"
- cost = 35000
- contains = list(/obj/machinery/jukebox)
- crate_name = "Jukebox"
diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm
index 22e4aef6a9..5cce40ad09 100644
--- a/modular_citadel/code/modules/clothing/suits/suits.dm
+++ b/modular_citadel/code/modules/clothing/suits/suits.dm
@@ -12,6 +12,7 @@
icon_state = "hostrench"
item_state = "hostrench"
mutantrace_variation = NO_MUTANTRACE_VARIATION
+ body_parts_covered = CHEST|ARMS|LEGS
/obj/item/clothing/suit/hooded/cloak/david
name = "red cloak"
diff --git a/modular_citadel/code/modules/crafting/recipes.dm b/modular_citadel/code/modules/crafting/recipes.dm
deleted file mode 100644
index 6c6001b040..0000000000
--- a/modular_citadel/code/modules/crafting/recipes.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/crafting_recipe/toyneb
- name = "Non-Euplastic Blade"
- reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/toy/sword/cx
- category = CAT_MISC
-
-/datum/crafting_recipe/potatos
- name = "Potat-OS"
- reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
- result = /obj/item/aicard/potato
- category = CAT_ROBOT
\ No newline at end of file
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 42363e9e07..5d81dbfa49 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -447,6 +447,7 @@
item_state = "kimono"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/commjacket
@@ -456,6 +457,7 @@
item_state = "commjacket"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/mw2_russian_para
diff --git a/modular_citadel/code/modules/mining/mine_items.dm b/modular_citadel/code/modules/mining/mine_items.dm
deleted file mode 100644
index d2cd1f2aa3..0000000000
--- a/modular_citadel/code/modules/mining/mine_items.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/machinery/computer/shuttle/mining
- req_access = list(ACCESS_MINING)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
deleted file mode 100644
index c3514719f6..0000000000
--- a/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
+++ /dev/null
@@ -1,306 +0,0 @@
-//Sprites are trademarks of Gamefreak, Nintendo, The Pokemon Company, and Spike Chunsoft.
-#define ispokemon(A) (istype(A, /mob/living/simple_animal/pokemon))
-//POKEBALL
-/obj/item/pokeball
- name = "pokeball"
- icon = 'icons/obj/pokeball.dmi'
- icon_state = "pokeball"
- force = 0
- throwforce = 0
- var/success_chance = 25
- var/pokemon
-/obj/item/pokeball/great
- name = "great ball"
- icon_state = "pokeball_great"
- success_chance = 50
-/obj/item/pokeball/ultra
- icon_state = "pokeball_ultra"
- name = "ultra ball"
- success_chance = 75
-/obj/item/pokeball/master
- icon_state = "pokeball_master"
- name = "master ball"
- success_chance = 100
-/* //WIP
-/obj/item/pokeball/throw_impact(atom/hit_atom)
- if(ispokemon(hit_atom))
- var/mob/living/simple_animal/pokemon/pmon = hit_atom
- var/initial_success_chance = success_chance
- pmon.resize = 0.1
- pmon.color = "RED"
- pmon.canmove = 0
- sleep(15)
- if(pmon.pokeball == src)
- pmon.loc = src
- pokemon = pmon
-
- return 1
- if(pmon.pokeball && pmon.pokeball !=src)
- return ..()
- var/bonus_chance = ((pmon.maxHealth - pmon.health) / 2)
- if(bonus_chance > 100)
- bonus_chance = 100
- success_chance = (success_chance + bonus_chance)
- if(success_chance > 100)
- success_chance = 100
- if(success_chance < 0)//just in case
- success_chance = 0
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- else
- ..()
-/obj/item/pokeball/proc/capture(mob/living/simple_animal/pokemon/pmon, mob/living/user)
-
-/obj/item/pokeball/proc/escape(mob/living/simple_animal/pokemon/pmon, mob/living/user)
- if(!pokemon)
- return
- pmon.resize = 10
- pmon.color = null
- pmon.canmove = 1
- pmon.loc = src.loc
- if(pmon.pokeball != src)
- visible_message("[pmon] breaks free from [src]")
- PoolOrNew(/obj/effect/particle_effect/sparks, loc)
- playsound(src.loc, "sparks", 50, 1)
- qdel(src)
-
- else
-/obj/item/pokeball/proc/recall
-/obj/item/pokeball/proc/release
-*/
-/mob/living/simple_animal/pokemon
- name = "eevee"
- icon_state = "eevee"
- icon_living = "eevee"
- icon_dead = "eevee_d"
- desc = "Gotta catch 'em all!"
- icon = 'icons/mob/pokemon.dmi'
- var/pokeball
- pixel_x = -16
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
- ventcrawler = 2
- health = 100
- maxHealth = 100
- layer = 4
- response_help = "pets"
- wander = 1
- turns_per_move = 2
- pass_flags = PASSTABLE | PASSMOB
-
-/mob/living/simple_animal/pokemon/proc/simple_lay_down()
- set name = "Rest"
- set category = "IC"
-
- resting = !resting
- src << "You are now [resting ? "resting" : "getting up"]."
- update_canmove()
- update_icon()
-
-/mob/living/simple_animal/pokemon/proc/update_icon()
- if(lying || resting || sleeping)
- icon_state = "[icon_state]_rest"
- else
- icon_state = "[icon_living]"
-
-/mob/living/simple_animal/pokemon/New()
- ..()
- verbs += /mob/living/simple_animal/pokemon/proc/simple_lay_down
-
-/*
-/////TEMPLATE/////
-
-/mob/living/simple_animal/pokemon/
- name = ""
- icon_state = ""
- icon_living = ""
- icon_dead = ""
-*/
-
-/mob/living/simple_animal/pokemon/leg
- icon = 'icons/mob/legendary.dmi'
- pixel_x = -32
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
- health = 200
- maxHealth = 200
-
-
-/mob/living/simple_animal/pokemon/leg/articuno
- name = "Articuno"
- icon_state = "articuno"
- icon_living = "articuno"
- icon_dead = "articuno_d"
- flying = 1
-
-/mob/living/simple_animal/pokemon/leg/rayquaza
- name = "Rayquaza"
- icon_state = "rayquaza"
- icon_living = "rayquaza"
- icon_dead = "rayquaza_d"
- flying = 1
-
-//ALPHABETICAL PLEASE
-
-/mob/living/simple_animal/pokemon/absol
- name = "absol"
- icon_state = "absol"
- icon_living = "absol"
- icon_dead = "absol_d"
- speak = list("Absol!", "Ab-Absol!")
-
-/mob/living/simple_animal/pokemon/aggron
- name = "aggron"
- icon_state = "aggron"
- icon_living = "aggron"
- icon_dead = "aggron_d"
-
-/mob/living/simple_animal/pokemon/ampharos
- name = "ampharos"
- icon_state = "ampharos"
- icon_living = "ampharos"
- icon_dead = "ampharos_d"
-
-/mob/living/simple_animal/pokemon/charmander
- name = "charmander"
- icon_state = "charmander"
- icon_living = "charmander"
- icon_dead = "charmander_d"
-
-/mob/living/simple_animal/pokemon/ditto
- name = "ditto"
- icon_state = "ditto"
- icon_living = "ditto"
- icon_dead = "ditto_d"
-
-/mob/living/simple_animal/pokemon/dratini/dragonair
- name = "dragonair"
- desc = "A Dragonair stores an enormous amount of energy inside its body. It is said to alter the weather around it by loosing energy from the crystals on its neck and tail."
- icon_state = "dragonair"
- icon_living = "dragonair"
- icon_dead = "dragonair_d"
-
-/mob/living/simple_animal/pokemon/dratini/dragonair/dragonite
- name = "dragonite"
- desc = "It can circle the globe in just 16 hours. It is a kindhearted Pokémon that leads lost and foundering ships in a storm to the safety of land."
- icon_state = "dragonite"
- icon_living = "dragonite"
- icon_dead = "dragonite_d"
-
-/mob/living/simple_animal/pokemon/dratini
- name = "dratini"
- desc = "A Dratini continually molts and sloughs off its old skin. It does so because the life energy within its body steadily builds to reach uncontrollable levels."
- icon_state = "dratini"
- icon_living = "dratini"
- icon_dead = "dratini_d"
-
-/mob/living/simple_animal/pokemon/eevee
- name = "eevee"
- desc = "Eevee has an unstable genetic makeup that suddenly mutates due to its environment. Radiation from various stones causes this Pokémon to evolve."
- icon_state = "eevee"
- icon_living = "eevee"
- icon_dead = "eevee_d"
- speak = list("Eevee!", "Ee-Eevee!")
- response_help = "pets"
- response_harm = "hits"
-
-/mob/living/simple_animal/pokemon/eevee/espeon
- name = "espeon"
- desc = "Espeon is extremely loyal to any trainer it considers to be worthy. It is said to have developed precognitive powers to protect its trainer from harm."
- icon_state = "espeon"
- icon_living = "espeon"
- icon_dead = "espeon_d"
-
-/mob/living/simple_animal/pokemon/flaaffy
- name = "flaaffy"
- icon_state = "flaaffy"
- icon_living = "flaaffy"
- icon_dead = "flaaffy_d"
-
-/mob/living/simple_animal/pokemon/eevee/flareon
- name = "flareon"
- desc = "Flareon's fluffy fur releases heat into the air so that its body does not get excessively hot. Its body temperature can rise to a maximum of 1,650 degrees F."
- icon_state = "flareon"
- icon_living = "flareon"
- icon_dead = "flareon_d"
- speak = list("Flare!", "Flareon!")
-
-/mob/living/simple_animal/pokemon/eevee/glaceon
- name = "glaceon"
- desc = "By controlling its body heat, it can freeze the atmosphere around it to make a diamond-dust flurry."
- icon_state = "glaceon"
- icon_living = "glaceon"
- icon_dead = "glaceon_d"
- speak = list("Glace!", "Glaceon!")
-
-/mob/living/simple_animal/pokemon/eevee/jolteon
- name = "jolteon"
- desc = "Its cells generate weak power that is amplified by its fur's static electricity to drop thunderbolts. The bristling fur is made of electrically charged needles."
- icon_state = "jolteon"
- icon_living = "jolteon"
- icon_dead = "jolteon_d"
- speak = list("Jolt!", "Jolteon!")
-
-/mob/living/simple_animal/pokemon/larvitar
- name = "larvitar"
- desc = "It is born deep underground. It can't emerge until it has entirely consumed the soil around it."
- icon_state = "larvitar"
- icon_living = "larvitar"
- icon_dead = "larvitar_d"
-
-/mob/living/simple_animal/pokemon/mareep
- name = "mareep"
- icon_state = "mareep"
- icon_living = "mareep"
- icon_dead = "mareep_d"
-
-/mob/living/simple_animal/pokemon/poochyena/mightyena
- name = "mightyena"
- icon_state = "mightyena"
- icon_living = "mightyena"
- icon_dead = "mightyena"
-
-/mob/living/simple_animal/pokemon/miltank
- name = "miltank"
- icon_state = "miltank"
- icon_living = "miltank"
- icon_dead = "miltank_d"
-
-/mob/living/simple_animal/pokemon/poochyena
- name = "poochyena"
- icon_state = "poochyena"
- icon_living = "poochyena"
- icon_dead = "poochyena_d"
-
-/mob/living/simple_animal/pokemon/eevee/sylveon
- name = "Sylveon"
- desc = "Sylveon, the Intertwining Pokémon. Sylveon affectionately wraps its ribbon-like feelers around its Trainer's arm as they walk together."
- icon_state = "sylveon"
- icon_living = "sylveon"
- icon_dead = "sylveon_d"
- speak = list("Sylveon!", "Syl!")
- response_help = "pets"
- response_harm = "hits"
-
-/mob/living/simple_animal/pokemon/eevee/umbreon
- name = "umbreon"
- icon_state = "umbreon"
- icon_dead = "umbreon_d"
- icon_living = "umbreon"
-
-/mob/living/simple_animal/pokemon/vulpix
- name = "vulpix"
- icon_state = "vulpix"
- icon_living = "vulpix"
- icon_dead = "vulpix_d"
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index 275c244a83..d7122e85e3 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -6,58 +6,17 @@
id = "fermi"
taste_description = "affection and love!"
can_synth = FALSE
+ SplitChem = TRUE
//This should process fermichems to find out how pure they are and what effect to do.
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
. = ..()
- if(!M)
- return
- if(purity < 0)
- CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
- if (purity == 1 || DoNotSplit == TRUE)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [id]")
- return
- else if (InverseChemVal > purity)//Turns all of a added reagent into the inverse chem
- M.reagents.remove_reagent(id, amount, FALSE)
- M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [InverseChem]")
- return
- else
- var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem
- M.reagents.remove_reagent(id, (impureVol), FALSE)
- M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [id]")
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [ImpureChem]")
- return
+
//When merging two fermichems, see above
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
. = ..()
- if(!ishuman(M))
- return
- if (purity < 0)
- CRASH("Purity below 0 for chem: [id], Please let Fermis Know!")
- if (purity == 1 || DoNotSplit == TRUE)
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [id] in themselves")
- return
- else if (InverseChemVal > purity)
- M.reagents.remove_reagent(id, amount, FALSE)
- M.reagents.add_reagent(InverseChem, amount, FALSE, other_purity = 1)
- for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
- if(R.name == "")
- R.name = name//Negative effects are hidden
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [InverseChem]")
- return
- else
- var/impureVol = amount * (1 - purity)
- M.reagents.remove_reagent(id, impureVol, FALSE)
- M.reagents.add_reagent(ImpureChem, impureVol, FALSE, other_purity = 1)
- for(var/datum/reagent/fermi/R in M.reagents.reagent_list)
- if(R.name == "")
- R.name = name//Negative effects are hidden
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [id]")
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [ImpureChem]")
- return
+
////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 8ef5b2d689..bb6df46c07 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -2,15 +2,15 @@
mix_sound = 'sound/effects/bubbles.ogg'
//Called for every reaction step
-/datum/chemical_reaction/fermi/proc/FermiCreate(holder)
+/datum/chemical_reaction/proc/FermiCreate(holder)
return
//Called when reaction STOP_PROCESSING
-/datum/chemical_reaction/fermi/proc/FermiFinish(datum/reagents/holder)
+/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder)
return
//Called when temperature is above a certain threshold, or if purity is too low.
-/datum/chemical_reaction/fermi/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
+/datum/chemical_reaction/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
if (Exploding == TRUE)
return
@@ -24,26 +24,32 @@
if (500 to 750)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
+ volume*=1.1
if (751 to 1100)
for(var/turf/turf in range(2,T))
new /obj/effect/hotspot(turf)
+ volume*=1.2
if (1101 to 1500) //If you're crafty
for(var/turf/turf in range(3,T))
new /obj/effect/hotspot(turf)
+ volume*=1.3
if (1501 to 2500) //requested
for(var/turf/turf in range(4,T))
new /obj/effect/hotspot(turf)
+ volume*=1.4
if (2501 to 5000)
for(var/turf/turf in range(5,T))
new /obj/effect/hotspot(turf)
+ volume*=1.5
if (5001 to INFINITY)
for(var/turf/turf in range(6,T))
new /obj/effect/hotspot(turf)
+ volume*=1.6
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
@@ -66,7 +72,7 @@
if (pH > 10) //if alkaline, small explosion.
var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(round((volume/30)*(pH-9)), T, 0, 0)
+ e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
e.start()
if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
@@ -101,10 +107,10 @@
PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes.
/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does.
- if(!locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list)
+ var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
+ if(!E)
return
var/turf/open/location = get_turf(my_atom)
- var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
if(location)
E.location_created = location
E.data.["location_created"] = location
@@ -137,12 +143,16 @@
/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!
var/turf/T = get_turf(my_atom)
- var/mob/living/simple_animal/slime/S = new(T,"green")
- S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
- S.name = "Living teratoma"
- S.real_name = "Living teratoma"
- S.rabid = 1//Make them an angery boi
- S.color = "#810010"
+ var/amount_to_spawn = round((volume/100), 1)
+ if(amount_to_spawn <= 0)
+ amount_to_spawn = 1
+ for(var/i in 1 to amount_to_spawn)
+ var/mob/living/simple_animal/slime/S = new(T,"green")
+ S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ S.name = "Living teratoma"
+ S.real_name = "Living teratoma"
+ S.rabid = 1//Make them an angery boi
+ S.color = "#810010"
my_atom.reagents.clear_reagents()
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
@@ -353,11 +363,15 @@
PurityMin = 0.5
/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH)
- var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
- hat.animate_atom_living()
+ var/amount_to_spawn = round((volume/100), 1)
+ if(amount_to_spawn <= 0)
+ amount_to_spawn = 1
+ for(var/i in 1 to amount_to_spawn)
+ var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
+ hat.animate_atom_living()
var/list/seen = viewers(8, get_turf(my_atom))
for(var/mob/M in seen)
- to_chat(M, "The makes an off sounding pop, as a hat suddenly climbs out of the beaker!")
+ to_chat(M, "The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!")
my_atom.reagents.clear_reagents()
/datum/chemical_reaction/fermi/furranium
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm
deleted file mode 100644
index c0ddaceaf7..0000000000
--- a/modular_citadel/code/modules/research/techweb/all_nodes.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-/datum/techweb_node/bluespace_basic/New()
- . = ..()
- design_ids += "xenobio_monkeys"
-
-/datum/techweb_node/practical_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimebasic"
-
-/datum/techweb_node/adv_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimeadv"
-
-/datum/techweb_node/ballistic_weapons/New()
- . = ..()
- design_ids += "mag_oldsmg_rubber"
-
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Games and Toys"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/datum/techweb_node/ballistic_weapons
- design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_tx")
-
-/datum/techweb_node/advanced_illegl_ballistics
- id = "advanced_illegal_ballistics"
- display_name = "Advanced Illegal Ballistics"
- description = "Advanced Ballistic for Illegal weaponds."
- design_ids = list("10mm","10mmap","10mminc","10mmhp","pistolm9mm","m45","bolt_clip")
- prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
- export_price = 7000
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm
deleted file mode 100644
index d968cfdcc7..0000000000
--- a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/datum/techweb_node/bluespace_basic/New()
- . = ..()
- design_ids += "xenobio_monkeys"
-
-/datum/techweb_node/practical_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimebasic"
-
-/datum/techweb_node/adv_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimeadv"
-
-/datum/techweb_node/ballistic_weapons/New()
- . = ..()
- design_ids += "mag_oldsmg_rubber"
-
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Games and Toys"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/datum/techweb_node/advanced_illegl_ballistics
- id = "advanced_illegal_ballistics"
- display_name = "Advanced Illegal Ballistics
- description = "Advanced Ballistic for Illegal weaponds."
- design_ids = list("10mm","10mmap","10mminc","10mmhp","9mm","point_45","bolt_clip")
- prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
- export_price = 7000
diff --git a/modular_citadel/icons/misc/misc.dmi b/modular_citadel/icons/misc/misc.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/misc/misc.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/glasses.dmi b/modular_citadel/icons/mob/citadel/glasses.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/glasses.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/head.dmi b/modular_citadel/icons/mob/citadel/head.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/head.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/masks.dmi b/modular_citadel/icons/mob/citadel/masks.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/masks.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/shoes.dmi b/modular_citadel/icons/mob/citadel/shoes.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/shoes.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/digishoes.dmi b/modular_citadel/icons/mob/digishoes.dmi
index a533195c15..b4e27d0b5d 100644
Binary files a/modular_citadel/icons/mob/digishoes.dmi and b/modular_citadel/icons/mob/digishoes.dmi differ
diff --git a/modular_citadel/icons/mob/werenerd.dmi b/modular_citadel/icons/mob/werenerd.dmi
deleted file mode 100644
index 706d4248f8..0000000000
Binary files a/modular_citadel/icons/mob/werenerd.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/werenerdleap.dmi b/modular_citadel/icons/mob/werenerdleap.dmi
deleted file mode 100644
index eb5339733b..0000000000
Binary files a/modular_citadel/icons/mob/werenerdleap.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/structures.dmi b/modular_citadel/icons/obj/structures.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/obj/structures.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/tools.dmi b/modular_citadel/icons/obj/tools.dmi
index 5d5a0d8abd..7b99880799 100644
Binary files a/modular_citadel/icons/obj/tools.dmi and b/modular_citadel/icons/obj/tools.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 92d836cfc6..6063c4d1e9 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2773,6 +2773,9 @@
#include "code\modules\surgery\advanced\viral_bonding.dm"
#include "code\modules\surgery\advanced\bioware\bioware.dm"
#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm"
+#include "code\modules\surgery\advanced\bioware\experimental_dissection.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_hook.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm"
#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm"
#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm"
#include "code\modules\surgery\advanced\bioware\vein_threading.dm"
@@ -2948,7 +2951,6 @@
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
-#include "modular_citadel\code\game\objects\items\melee\misc.dm"
#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"