diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index c0b4e6a88a..ce5539cee7 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -1128,8 +1128,7 @@ /area/security/prison) "acI" = ( /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/atmospherics/pipe/simple/general/hidden, /obj/machinery/door/firedoor, @@ -1280,8 +1279,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/door/firedoor, /turf/open/floor/plating, @@ -1296,8 +1294,7 @@ "acZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/door/firedoor, /turf/open/floor/plating, @@ -21317,8 +21314,7 @@ name = "Privacy Shutters"; pixel_y = 24 }, -/obj/structure/rack, -/obj/item/storage/briefcase, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aYk" = ( @@ -46725,12 +46721,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cjb" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel{ - name = "floor" - }, -/area/engine/engineering) "cjc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -56119,7 +56109,6 @@ dir = 4 }, /obj/machinery/door/airlock/maintenance/abandoned{ - name = "maintenance access"; req_access_txt = "12" }, /obj/structure/barricade/wooden, @@ -58287,7 +58276,6 @@ }, /obj/machinery/computer/security/telescreen/toxins{ dir = 1; - network = list("toxins"); pixel_y = -28 }, /obj/structure/chair{ @@ -87415,8 +87403,8 @@ bVJ cay ccw cig -cjb -cjb +cSV +cSV cig cig cmG diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index f88a891b39..9b260f0133 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -8974,7 +8974,6 @@ }, /obj/machinery/turnstile{ dir = 8; - icon_state = "turnstile_map"; name = "Genpop Entrance Turnstile"; req_access_txt = "69" }, @@ -9657,7 +9656,6 @@ }, /obj/machinery/turnstile{ dir = 8; - icon_state = "turnstile_map"; name = "Genpop Entrance Turnstile"; req_access_txt = "69" }, @@ -28878,8 +28876,7 @@ icon_state = "0-4" }, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) @@ -33205,8 +33202,7 @@ "bts" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/light_construct/small{ - dir = 1; - icon_state = "bulb-construct-stage1" + dir = 1 }, /turf/open/floor/plasteel, /area/maintenance/aft) @@ -33760,8 +33756,7 @@ icon_state = "0-8" }, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) @@ -37603,7 +37598,6 @@ /turf/open/floor/plasteel, /area/maintenance/disposal) "bDc" = ( -/obj/machinery/vending/security, /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ dir = 4 @@ -37611,6 +37605,7 @@ /obj/effect/decal/cleanable/cobweb{ icon_state = "cobweb2" }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "bDd" = ( @@ -46836,8 +46831,7 @@ }, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) @@ -47893,8 +47887,7 @@ icon_state = "0-8" }, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) @@ -49489,8 +49482,7 @@ }, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) @@ -49570,8 +49562,7 @@ }, /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ - id = "capblast"; - name = "blast door" + id = "capblast" }, /turf/open/floor/plating, /area/crew_quarters/heads/captain) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 78bb797a56..17253e2665 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -501,8 +501,7 @@ dir = 4 }, /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 8; - icon_state = "yellowcornersiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "aba" = ( @@ -518,8 +517,7 @@ dir = 8 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abb" = ( @@ -612,8 +610,7 @@ dir = 4 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 8; - icon_state = "yellowsiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "abn" = ( @@ -627,8 +624,7 @@ dir = 8 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abo" = ( @@ -712,8 +708,7 @@ name = "pool camera" }, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abv" = ( @@ -732,8 +727,7 @@ dir = 4 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 8; - icon_state = "yellowsiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "aby" = ( @@ -773,8 +767,7 @@ dir = 8 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abC" = ( @@ -912,8 +905,7 @@ pixel_x = -23 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abP" = ( @@ -980,8 +972,7 @@ pixel_x = -26 }, /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 4; - icon_state = "yellowcornersiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abW" = ( @@ -990,8 +981,7 @@ dir = 8 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 1; - icon_state = "yellowsiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "abX" = ( @@ -1003,8 +993,7 @@ dir = 4 }, /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 1; - icon_state = "yellowcornersiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "abY" = ( @@ -9915,8 +9904,7 @@ /area/engine/atmospherics_engine) "avi" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8; - name = "scrubbers pipe" + dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -50511,12 +50499,6 @@ /turf/open/floor/plasteel/dark, /area/security/detectives_office) "bJn" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/secure/briefcase, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -50527,6 +50509,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "bJo" = ( @@ -63207,7 +63190,6 @@ }, /obj/machinery/camera{ c_tag = "Library - Aft"; - dir = 2; name = "library camera" }, /turf/open/floor/wood, @@ -64373,8 +64355,7 @@ /area/library) "cel" = ( /obj/structure/chair/sofa/right{ - dir = 8; - icon_state = "sofaend_right" + dir = 8 }, /obj/structure/sign/painting/library{ pixel_x = 32 @@ -125710,7 +125691,6 @@ }, /obj/machinery/camera{ c_tag = "Library - Aft"; - dir = 2; name = "library camera" }, /turf/open/floor/plasteel/grimy, @@ -127863,8 +127843,7 @@ /area/science/mixing) "xER" = ( /obj/structure/chair/sofa/left{ - dir = 8; - icon_state = "sofaend_left" + dir = 8 }, /turf/open/floor/wood, /area/library) diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 518fa4e81e..f426ad8e97 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -10384,9 +10384,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/dark, /area/security/detectives_office) "ars" = ( @@ -70077,8 +70075,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8; - name = "scrubbers pipe" + dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line, diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index 5d104b798a..fdcc0fa7c1 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -17522,22 +17522,14 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "aFo" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/secure/briefcase{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/camera/detective, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aFp" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, /obj/machinery/light/small, +/obj/item/camera/detective, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aFq" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 6f0636d3cb..218044c6c2 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1136,8 +1136,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/red{ @@ -1155,8 +1154,7 @@ "acB" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -1196,8 +1194,7 @@ }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -9534,7 +9531,6 @@ "arF" = ( /obj/structure/pool/ladder{ dir = 8; - icon_state = "ladder"; pixel_x = 4 }, /turf/open/pool, @@ -10230,7 +10226,6 @@ /area/security/main) "asN" = ( /obj/machinery/light/built{ - icon_state = "tube-empty"; dir = 8 }, /turf/open/floor/plasteel, @@ -15691,15 +15686,7 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aDN" = ( -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/secure/briefcase{ - pixel_x = 2; - pixel_y = -2 - }, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aDO" = ( @@ -63650,8 +63637,7 @@ "cvL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "researchrangeshutters"; - name = "blast door" + id = "researchrangeshutters" }, /turf/open/floor/plating, /area/science/misc_lab/range) @@ -66513,8 +66499,7 @@ "cBm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ - id = "researchrangeshutters"; - name = "blast door" + id = "researchrangeshutters" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 668bcead78..5149033cb4 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -3061,7 +3061,6 @@ pixel_x = 26 }, /obj/machinery/computer/card/minor/qm{ - icon_state = "computer"; dir = 8 }, /obj/effect/turf_decal/tile/brown{ @@ -3232,9 +3231,9 @@ }, /obj/machinery/door/firedoor, /obj/machinery/turnstile{ + dir = 8; name = "Genpop Exit Turnstile"; - req_access_txt = "70"; - dir = 8 + req_access_txt = "70" }, /turf/open/floor/plasteel, /area/security/prison) @@ -4288,7 +4287,6 @@ pixel_x = 30 }, /obj/machinery/computer/security/hos{ - icon_state = "computer"; dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -4821,7 +4819,6 @@ dir = 4 }, /obj/machinery/computer/card/minor/hos{ - icon_state = "computer"; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -6388,9 +6385,9 @@ }, /obj/machinery/door/firedoor, /obj/machinery/turnstile{ + dir = 4; name = "Genpop Entrance Turnstile"; - req_access_txt = "69"; - dir = 4 + req_access_txt = "69" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -8523,13 +8520,10 @@ /turf/closed/wall/r_wall, /area/engine/atmos) "any" = ( -/obj/structure/table/wood, /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/hand_labeler, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/wood, /area/security/detectives_office) "anz" = ( @@ -9097,7 +9091,6 @@ }, /obj/machinery/computer/security/telescreen/ce{ dir = 1; - icon_state = "telescreen"; pixel_y = -24 }, /turf/open/floor/plasteel, @@ -12534,20 +12527,6 @@ /turf/open/floor/plasteel/dark, /area/security/detectives_office) "ats" = ( -/obj/item/clothing/suit/jacket{ - desc = "All the class of a trenchcoat without the security fibers."; - icon_state = "greydet"; - name = "trenchcoat" - }, -/obj/item/clothing/suit/jacket{ - desc = "All the class of a trenchcoat without the security fibers."; - icon_state = "detective"; - name = "trenchcoat" - }, -/obj/item/clothing/head/fedora, -/obj/item/clothing/head/fedora{ - icon_state = "detective" - }, /obj/machinery/light/small{ dir = 1 }, @@ -12687,7 +12666,6 @@ dir = 8 }, /obj/machinery/computer/med_data/laptop{ - icon_state = "laptop"; dir = 4 }, /obj/machinery/requests_console{ @@ -13264,7 +13242,6 @@ /obj/structure/table/wood, /obj/machinery/computer/secure_data/laptop{ dir = 1; - icon_state = "laptop"; pixel_y = 4 }, /turf/open/floor/wood, @@ -16189,9 +16166,9 @@ name = "Brig Blast door" }, /obj/machinery/turnstile{ + dir = 8; name = "Genpop Exit Turnstile"; - req_access_txt = "70"; - dir = 8 + req_access_txt = "70" }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -18134,9 +18111,8 @@ "aCt" = ( /obj/machinery/door/firedoor, /obj/machinery/turnstile{ - name = "Genpop Exit Turnstile"; - icon_state = "turnstile_map"; dir = 1; + name = "Genpop Exit Turnstile"; req_access_txt = "70" }, /obj/effect/turf_decal/stripes/line, @@ -26149,7 +26125,6 @@ }, /obj/machinery/computer/security/telescreen/cmo{ dir = 1; - icon_state = "telescreen"; pixel_y = -32 }, /turf/open/floor/plasteel/cafeteria, @@ -26762,7 +26737,6 @@ "aPC" = ( /obj/machinery/computer/security/telescreen/entertainment, /obj/structure/bodycontainer/morgue{ - icon_state = "morgue1"; dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -26806,7 +26780,6 @@ /area/medical/medbay/zone3) "aPE" = ( /obj/structure/bodycontainer/morgue{ - icon_state = "morgue1"; dir = 2 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -27105,7 +27078,6 @@ dir = 1 }, /obj/machinery/computer/scan_consolenew{ - icon_state = "computer"; dir = 1 }, /obj/effect/turf_decal/bot, @@ -27733,7 +27705,6 @@ /area/crew_quarters/heads/cmo) "aRp" = ( /obj/structure/bodycontainer/morgue{ - icon_state = "morgue1"; dir = 2 }, /obj/effect/turf_decal/tile/neutral{ @@ -27806,7 +27777,6 @@ /area/science/research) "aRw" = ( /obj/structure/bodycontainer/morgue{ - icon_state = "morgue1"; dir = 2 }, /obj/effect/turf_decal/tile/neutral{ @@ -34455,7 +34425,6 @@ icon_state = "0-8" }, /obj/machinery/power/solar_control{ - dir = 2; id = "forestarboard"; name = "Starboard Bow Solar Control" }, @@ -35051,7 +35020,6 @@ }, /obj/machinery/power/apc{ areastring = "/area/maintenance/solars/starboard/fore"; - dir = 2; name = "Starboard Bow Solar APC"; pixel_y = -26 }, @@ -35995,7 +35963,6 @@ department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; - pixel_x = 0; pixel_y = -32; receive_ore_updates = 1 }, @@ -36304,7 +36271,6 @@ }, /obj/machinery/computer/security/telescreen/rd{ dir = 1; - icon_state = "telescreen"; pixel_y = -28 }, /turf/open/floor/plasteel{ @@ -36546,7 +36512,6 @@ /obj/machinery/shower{ desc = "From what you understand it was put in rather recently, but the design looks right out of the 2510's. Weird."; dir = 1; - icon_state = "shower"; name = "Emergency Shower" }, /obj/effect/turf_decal/stripes/line{ diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 263cb44144..3e79030b78 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -334,8 +334,7 @@ /area/crew_quarters/fitness/pool) "aaM" = ( /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 8; - icon_state = "yellowcornersiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "aaN" = ( @@ -354,8 +353,7 @@ /area/crew_quarters/fitness/pool) "aaP" = ( /turf/open/floor/plasteel/yellowsiding{ - dir = 8; - icon_state = "yellowsiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "aaQ" = ( @@ -433,8 +431,7 @@ /area/crew_quarters/fitness/pool) "aaW" = ( /turf/open/floor/plasteel/yellowsiding{ - dir = 1; - icon_state = "yellowsiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "aaX" = ( @@ -550,8 +547,7 @@ "abm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abn" = ( @@ -580,8 +576,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/yellowsiding{ - dir = 4; - icon_state = "yellowsiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abr" = ( @@ -595,8 +590,7 @@ "abt" = ( /obj/structure/pool/Rboard, /turf/open/floor/plasteel/yellowsiding{ - dir = 8; - icon_state = "yellowsiding" + dir = 8 }, /area/crew_quarters/fitness/pool) "abu" = ( @@ -659,8 +653,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 4; - icon_state = "yellowcornersiding" + dir = 4 }, /area/crew_quarters/fitness/pool) "abB" = ( @@ -670,21 +663,18 @@ pixel_y = -27 }, /turf/open/floor/plasteel/yellowsiding{ - dir = 1; - icon_state = "yellowsiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "abC" = ( /obj/machinery/light, /turf/open/floor/plasteel/yellowsiding{ - dir = 1; - icon_state = "yellowsiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "abD" = ( /turf/open/floor/plasteel/yellowsiding/corner{ - dir = 1; - icon_state = "yellowcornersiding" + dir = 1 }, /area/crew_quarters/fitness/pool) "abE" = ( @@ -2757,8 +2747,7 @@ icon_state = "0-8" }, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plating, @@ -54863,6 +54852,10 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"gQo" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) "gSH" = ( /turf/closed/wall, /area/lawoffice) @@ -57234,8 +57227,7 @@ icon_state = "0-4" }, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, @@ -59204,8 +59196,7 @@ icon_state = "2-4" }, /obj/machinery/door/poddoor/preopen{ - id = "executionfireblast"; - name = "blast door" + id = "executionfireblast" }, /turf/open/floor/plating, /area/security/execution/transfer) @@ -85514,7 +85505,7 @@ aCo aCk aEr aGa -aCk +gQo oEA uoS uoS diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index 27af3be101..5cf7c43a3e 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -197,12 +197,10 @@ /obj/structure/closet/emcloset/anchored, /obj/structure/sign/directions/medical{ dir = 8; - icon_state = "direction_med"; pixel_y = 36 }, /obj/structure/sign/directions/science{ dir = 8; - icon_state = "direction_sci"; pixel_y = 28 }, /turf/open/floor/plasteel, @@ -247,7 +245,6 @@ }, /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_x = 32; pixel_y = -28 }, @@ -285,7 +282,6 @@ }, /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_y = 40 }, /turf/open/floor/plasteel, @@ -349,7 +345,6 @@ /obj/structure/disposalpipe/segment, /obj/structure/sign/directions/engineering{ dir = 1; - icon_state = "direction_eng"; pixel_x = 32; pixel_y = 32 }, @@ -384,12 +379,10 @@ "aaC" = ( /obj/structure/sign/directions/medical{ dir = 8; - icon_state = "direction_med"; pixel_y = 36 }, /obj/structure/sign/directions/science{ dir = 8; - icon_state = "direction_sci"; pixel_y = 28 }, /turf/open/floor/plasteel, @@ -397,12 +390,10 @@ "aaD" = ( /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_y = 36 }, /obj/structure/sign/directions/supply{ dir = 4; - icon_state = "direction_supply"; pixel_y = 28 }, /turf/open/floor/plasteel, @@ -444,12 +435,10 @@ }, /obj/structure/sign/directions/medical{ dir = 8; - icon_state = "direction_med"; pixel_y = 40 }, /obj/structure/sign/directions/science{ dir = 8; - icon_state = "direction_sci"; pixel_y = 32 }, /obj/structure/sign/directions/security{ @@ -470,12 +459,10 @@ }, /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_y = 40 }, /obj/structure/sign/directions/supply{ dir = 4; - icon_state = "direction_supply"; pixel_y = 32 }, /obj/structure/sign/directions/evac{ @@ -525,12 +512,10 @@ }, /obj/structure/sign/directions/medical{ dir = 8; - icon_state = "direction_med"; pixel_y = 36 }, /obj/structure/sign/directions/science{ dir = 8; - icon_state = "direction_sci"; pixel_y = 28 }, /obj/structure/sign/directions/science{ @@ -561,12 +546,10 @@ /obj/machinery/computer/shuttle/snow_taxi, /obj/structure/sign/directions/supply{ dir = 4; - icon_state = "direction_supply"; pixel_y = 36 }, /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_y = 28 }, /turf/open/floor/plasteel, @@ -600,16 +583,13 @@ "aaV" = ( /obj/structure/sign/directions/evac{ dir = 1; - icon_state = "direction_evac"; pixel_y = 8 }, /obj/structure/sign/directions/security{ - dir = 8; - icon_state = "direction_sec" + dir = 8 }, /obj/structure/sign/directions/command{ dir = 8; - icon_state = "direction_bridge"; pixel_y = -8 }, /turf/closed/wall/r_wall, @@ -686,7 +666,6 @@ }, /obj/structure/sign/directions/supply{ dir = 4; - icon_state = "direction_supply"; pixel_x = 32; pixel_y = -24 }, @@ -787,7 +766,6 @@ }, /obj/structure/sign/directions/evac{ dir = 8; - icon_state = "direction_evac"; pixel_x = 32; pixel_y = 32 }, @@ -1158,13 +1136,11 @@ /obj/structure/disposalpipe/segment, /obj/structure/sign/directions/evac{ dir = 8; - icon_state = "direction_evac"; pixel_x = 32; pixel_y = 40 }, /obj/structure/sign/directions/engineering{ dir = 4; - icon_state = "direction_eng"; pixel_x = 32; pixel_y = 24 }, @@ -3934,7 +3910,7 @@ name = "Privacy Shutters"; pixel_y = 24 }, -/obj/machinery/computer/med_data, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "aMR" = ( @@ -20407,7 +20383,6 @@ "iXZ" = ( /obj/machinery/computer/security/telescreen/toxins{ dir = 1; - network = list("toxins"); pixel_y = -28 }, /obj/structure/chair{ @@ -43137,6 +43112,7 @@ pixel_x = 6; pixel_y = 36 }, +/obj/machinery/computer/med_data/laptop, /turf/open/floor/carpet, /area/security/detectives_office) "wtY" = ( diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a8026f752b..62438ac7c1 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -143,11 +143,11 @@ #define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used. #define HORNCOLOR 25 #define WINGCOLOR 26 -#define CAN_SCAR 27 // If this species can be scarred (fleshy) - +#define ROBOTIC_LIMBS 27 //has robotic limbs that render like organic ones +#define CAN_SCAR 28 // If this species can be scarred (fleshy) /// Used for determining which wounds are applicable to this species. -#define HAS_FLESH 28 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD) -#define HAS_BONE 29 /// if we have bones (can suffer bone wounds) +#define HAS_FLESH 29 /// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD) +#define HAS_BONE 30 /// if we have bones (can suffer bone wounds) //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm new file mode 100644 index 0000000000..d2e4d4e739 --- /dev/null +++ b/code/__DEFINES/botany.dm @@ -0,0 +1,12 @@ + +#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name) +#define YIELD_WEED_MINIMUM 3 +#define YIELD_WEED_MAXIMUM 10 +#define STATIC_NUTRIENT_CAPACITY 10 + +//Both available scanning modes for the plant analyzer. +#define PLANT_SCANMODE_STATS 0 +#define PLANT_SCANMODE_CHEMICALS 1 + +//Seed flags. +#define MUTATE_EARLY (1<<0) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55be13834d..66f741b2c7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismush(A) (is_species(A, /datum/species/mush)) #define isshadow(A) (is_species(A, /datum/species/shadow)) #define isskeleton(A) (is_species(A, /datum/species/skeleton)) +#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz)) #define isethereal(A) (is_species(A, /datum/species/ethereal)) // Citadel specific species diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 674cc16980..f054f163b5 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -205,6 +205,7 @@ #define TRAIT_NO_ALCOHOL "alcohol_intolerance" #define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing. #define TRAIT_FAST_PUMP "fast_pump" +#define TRAIT_NO_PROCESS_FOOD "no-process-food" // You don't get benefits from nutriment, nor nutrition from reagent consumables #define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good... // mobility flag traits diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index e8726f8316..a6c7bf10ea 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) -GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps" ,"hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles")) +GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles")) GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc)) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index a2f534115a..d46694d89c 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -128,6 +128,9 @@ duration = set_duration . = ..() +/datum/status_effect/no_combat_mode/robotic_emp + id = "emp_no_combat_mode" + /datum/status_effect/mesmerize id = "Mesmerize" alert_type = /obj/screen/alert/status_effect/mesmerized diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 2e12a2ab8c..4cada03307 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -110,13 +110,18 @@ var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) + //only heal to 25 if limb is damaged to or past 25 brute, otherwise heal normally + var/difference = affecting.brute_dam - 25 + var/heal_amount = 15 + if(difference >= 0) + heal_amount = difference if(src.use_tool(H, user, 0, volume=50, amount=1)) if(user == H) user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") if(!do_mob(user, H, 50)) return - item_heal_robotic(H, user, 15, 0) + item_heal_robotic(H, user, heal_amount, 0) else return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 7f22a49df9..ee8773c384 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -8,6 +8,7 @@ new /obj/item/clothing/neck/cloak/qm(src) new /obj/item/clothing/head/beret/qm(src) new /obj/item/storage/lockbox/medal/cargo(src) + new /obj/item/clothing/suit/toggle/labcoat/depjacket/sup/qm(src) new /obj/item/clothing/under/rank/cargo/qm(src) new /obj/item/clothing/under/rank/cargo/qm/skirt(src) new /obj/item/clothing/shoes/sneakers/brown(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index ad7680f2f9..2c31303f79 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -25,6 +25,7 @@ /obj/structure/closet/secure_closet/hop/PopulateContents() ..() new /obj/item/clothing/neck/cloak/hop(src) + new /obj/item/clothing/under/rank/civilian/head_of_personnel/whimsy(src) new /obj/item/clothing/under/rank/civilian/head_of_personnel(src) new /obj/item/clothing/under/rank/civilian/head_of_personnel/skirt(src) new /obj/item/clothing/head/hopcap(src) @@ -59,6 +60,7 @@ new /obj/item/radio/headset/heads/hos(src) new /obj/item/clothing/under/rank/security/head_of_security/parade/female(src) new /obj/item/clothing/under/rank/security/head_of_security/parade(src) + new /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/hoscorp(src) new /obj/item/clothing/suit/armor/vest/leather(src) new /obj/item/clothing/suit/armor/hos(src) new /obj/item/clothing/under/rank/security/head_of_security/skirt(src) @@ -95,6 +97,7 @@ new /obj/item/clothing/head/warden/drill(src) new /obj/item/clothing/head/beret/sec/navywarden(src) new /obj/item/clothing/suit/armor/vest/warden/alt(src) + new /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/wardencorp(src) new /obj/item/clothing/under/rank/security/warden/formal(src) new /obj/item/clothing/under/rank/security/warden/skirt(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) @@ -156,17 +159,6 @@ /obj/structure/closet/secure_closet/detective/PopulateContents() ..() - new /obj/item/clothing/under/rank/security/detective(src) - new /obj/item/clothing/under/rank/security/detective/skirt(src) - new /obj/item/clothing/suit/det_suit(src) - new /obj/item/clothing/head/fedora/det_hat(src) - new /obj/item/clothing/gloves/color/black(src) - new /obj/item/clothing/under/rank/security/detective/grey(src) - new /obj/item/clothing/under/rank/security/detective/grey/skirt(src) - new /obj/item/clothing/accessory/waistcoat(src) - new /obj/item/clothing/suit/det_suit/grey(src) - new /obj/item/clothing/head/fedora(src) - new /obj/item/clothing/shoes/laceup(src) new /obj/item/storage/box/evidence(src) new /obj/item/radio/headset/headset_sec(src) new /obj/item/detective_scanner(src) diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index d5f65e4fa8..133956e44e 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -102,3 +102,20 @@ /obj/item/clothing/neck/cloak/polychromic/ComponentInitialize() . = ..() AddElement(/datum/element/polychromic, poly_colors, 3) + +/obj/item/clothing/neck/cloak/alt + name = "cloak" + desc = "A ragged up white cloak. It reminds you of a place not far from here." + icon_state = "cloak" + item_state = "cloak" + +/obj/item/clothing/neck/cloak/alt/polychromic + name = "polychromic cloak" + desc = "A ragged up cloak. It reminds you of a place not far from here." + icon_state = "cloak" + item_state = "cloak" + var/list/poly_colors = list("#FFFFFF", "#676767", "#4C4C4C") + +/obj/item/clothing/neck/cloak/alt/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, poly_colors, 3) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index fa55dcf1c1..54b2c17f36 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -117,6 +117,27 @@ icon_state = "greydet" item_state = "greydet" +/obj/item/clothing/suit/det_suit/forensicsred + name = "red forensics coat" + icon_state = "forensics_red" + item_state = "forensics_red" + +/obj/item/clothing/suit/det_suit/forensicsred/long + name = "long red forensics coat" + icon_state = "forensics_red_long" + item_state = "forensics_red_long" + +/obj/item/clothing/suit/det_suit/forensicsblue + name = "blue forensics coat" + icon_state = "forensics_blue" + item_state = "forensics_blue" + +/obj/item/clothing/suit/det_suit/forensicsblue/long + name = "long blue forensics coat" + icon_state = "forensics_blue_long" + item_state = "forensics_blue_long" + + //Engineering /obj/item/clothing/suit/hazardvest name = "hazard vest" @@ -222,4 +243,16 @@ desc = "A dark blue vest with reflective strips for emergency medical technicians." icon_state = "labcoat_emt" item_state = "labcoat_emt" - mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON \ No newline at end of file + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/clothing/suit/toggle/labcoat/emt/red + name = "red emt vest" + desc = "A red vest with reflective strips for emergency medical technicians." + icon_state = "labcoat_emtred" + item_state = "labcoat_emtred" + +/obj/item/clothing/suit/toggle/labcoat/emt/highvis + name = "high visibility emt vest" + desc = "a high visibility vest for emergency medical technicians." + icon_state = "labcoat_highvis" + item_state = "labcoat_highvis" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 195712b814..32a4ab7ad0 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -62,3 +62,48 @@ name = "scientist labcoat" desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder." icon_state = "labcoat_tox" + +// Departmental Jackets + +/obj/item/clothing/suit/toggle/labcoat/depjacket/sci + name = "science jacket" + desc = "A comfortable jacket in science purple." + icon_state = "sci_dep_jacket" + item_state = "sci_dep_jacket" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/clothing/suit/toggle/labcoat/depjacket/med + name = "medical jacket" + desc = "A comfortable jacket in medical blue." + icon_state = "med_dep_jacket" + item_state = "med_dep_jacket" + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + +/obj/item/clothing/suit/toggle/labcoat/depjacket/sec + name = "security jacket" + desc = "A comfortable jacket in security red." + icon_state = "sec_dep_jacket" + item_state = "sec_dep_jacket" + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + +/obj/item/clothing/suit/toggle/labcoat/depjacket/sup + name = "supply jacket" + desc = "A comfortable jacket in supply brown." + icon_state = "supply_dep_jacket" + item_state = "supply_dep_jacket" + +/obj/item/clothing/suit/toggle/labcoat/depjacket/sup/qm + name = "quartermaster's jacket" + desc = "A loose covering often warn by station quartermasters." + icon_state = "qmjacket" + item_state = "qmjacket" + +/obj/item/clothing/suit/toggle/labcoat/depjacket/eng + name = "engineering jacket" + desc = "A comfortable jacket in engineering yellow." + icon_state = "engi_dep_jacket" + item_state = "engi_dep_jacket" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index d6853f52ca..3b45d2bc14 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -94,6 +94,23 @@ flags_inv = HIDEJUMPSUIT mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON +/obj/item/clothing/suit/tailcoat + name = "tailcoat" + desc = "A rather impractical, long coat." + icon_state = "tailcoat" + item_state = "tailcoat" + +/obj/item/clothing/suit/vickyblack + name = "black victorian coat" + desc = "An overbearing black coat, it looks far older than you are." + icon_state = "vickyblack" + item_state = "vickyblack" + +/obj/item/clothing/suit/vickyred + name = "red victorian coat" + desc = "An overbearing red coat, it looks far older than you are." + icon_state = "vickyred" + item_state = "vickyred" /obj/item/clothing/suit/apron/overalls name = "coveralls" @@ -1064,3 +1081,9 @@ desc = "An outfit used by traditional japanese warriors." icon_state = "samurai" item_state = "samurai" + +/obj/item/clothing/suit/bomber + name = "old bomber jacket" + desc = "It looks like someone dragged this out of a muddy lake." + icon_state = "bomberalt" + item_state = "bomberalt" diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index b58545bdf0..832589a6b7 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -23,6 +23,14 @@ body_parts_covered = CHEST|GROIN|ARMS alt_covers_chest = TRUE +/obj/item/clothing/under/rank/cargo/util + name = "cargo utility uniform" + desc = "a utility uniform for cargo personnel" + icon_state = "utilsupply" + item_state = "utilsupply" + can_adjust = FALSE + + /obj/item/clothing/under/rank/cargo/tech/skirt name = "cargo technician's jumpskirt" desc = "Skiiiiirts! They're comfy and easy to wear" diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 5dffc8f88d..9bfac2a81c 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -23,6 +23,68 @@ fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON +/obj/item/clothing/under/rank/civilian/util + name = "generic utility uniform" + desc = "A utility uniform worn by various crew." + icon_state = "utilgen" + item_state = "utilgen" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/util/greyshirt + name = "grey uniform" + desc = "A bland, grey uniform." + icon_state = "greyshirt" + item_state = "greyshirt" + +/obj/item/clothing/under/rank/civilian/victorian_redsleeves + name = "black vest red victorian suit" + desc = "A stark red victorian suit with a black vest." + icon_state = "victorianblred" + item_state = "victorianblred" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/victorian_redvest + name = "red-vested victorian suit" + desc = "A victorian suit with a red vest." + icon_state = "victorianredvest" + item_state = "victorianredvest" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/victorian_vest + name = "black victorian suit" + desc = "A simple black victorian suit." + icon_state = "victorianvest" + item_state = "victorianvest" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/victorian_purple + name = "purple victorian suit" + desc = "A victorian suit in regal purple." + icon_state = "victorianlightfire" + item_state = "victorianlightfire" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/victorianreddress + name = "red victorian dress" + desc = "A flashy red victorian dress." + icon_state = "victorianreddress" + item_state = "victorianreddress" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/victorianblackdress + name = "black victorian dress" + desc = "A victorian dress in somber black." + icon_state = "victorianblackdress" + item_state = "victorianblackdress" + can_adjust = FALSE + +/obj/item/clothing/under/rank/civilian/dutch + name = "dutch suit" + desc = "A dapper dutch suit." + icon_state = "dutch" + item_state = "dutch" + can_adjust = FALSE + /obj/item/clothing/under/rank/civilian/chaplain desc = "It's a black jumpsuit, often worn by religious folk." name = "chaplain's jumpsuit" @@ -62,6 +124,12 @@ item_state = "b_suit" can_adjust = FALSE +/obj/item/clothing/under/rank/civilian/head_of_personnel/whimsy + name = "casual head of personnel's jumpsuit" + desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\", this one seems to be a bit more casual." + icon_state = "hop_casual" + item_state = "hop_casual" + /obj/item/clothing/under/rank/civilian/head_of_personnel/skirt name = "head of personnel's jumpskirt" desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"." diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 8272c36cf3..8a6c372272 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -6,6 +6,13 @@ sensor_mode = SENSOR_COORDS random_sensor = FALSE +/obj/item/clothing/under/rank/captain/util + name = "Command Utiltiy Uniform" + desc = "A utility uniform for command personnel." + icon_state = "utilcom" + item_state = "utilcom" + can_adjust = FALSE + /obj/item/clothing/under/rank/captain/skirt name = "captain's jumpskirt" desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"." diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index e5340fe411..98dee44cb2 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -42,6 +42,20 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20, "wound" = 5) resistance_flags = NONE +/obj/item/clothing/under/rank/engineering/engineer/mechanic + name = "mechanic's jumpsuit" + desc = "an old mechanic's jumpsuit" + icon_state = "mechanic" + item_state = "mechanic" + can_adjust = FALSE + +/obj/item/clothing/under/rank/engineering/engineer/util + name = "engineering utility uniform" + desc = "a utility jumpsuit for engineering personnel" + icon_state = "utileng" + item_state = "utileng" + can_adjust = FALSE + /obj/item/clothing/under/rank/engineering/engineer/hazard name = "engineer's hazard jumpsuit" desc = "A high visibility jumpsuit made from heat and radiation resistant materials." diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index c66b972624..de285b0470 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -86,6 +86,12 @@ permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) +/obj/item/clothing/under/rank/medical/paramedic/red + name = "red paramedic jumpsuit" + icon_state = "pmedred" + item_state = "pmedred" + can_adjust = FALSE + /obj/item/clothing/under/rank/medical/paramedic/light desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." icon_state = "paramedic-light" @@ -124,6 +130,13 @@ permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) +/obj/item/clothing/under/rank/medical/doctor/util + name = "Medical Utility Uniform" + desc = "Utility jumpsuit for medical personnel" + icon_state = "utilmed" + item_state = "utilmed" + can_adjust = FALSE + /obj/item/clothing/under/rank/medical/doctor/blue name = "blue medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index 03eb910736..7443cd9d39 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -61,6 +61,13 @@ permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) +/obj/item/clothing/under/rank/rnd/scientist/util + name = "Science Utility Uniform" + desc = "A utility uniform for science personnel" + icon_state = "utilsci" + item_state = "utilsci" + can_adjust = FALSE + /obj/item/clothing/under/rank/rnd/scientist/skirt name = "scientist's jumpskirt" desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist." @@ -78,6 +85,12 @@ item_state = "robotics" resistance_flags = NONE +/obj/item/clothing/under/rank/rnd/roboticist/sleek + name = "sleek roboticist's jumpsuit" + icon_state = "robosleek" + item_state = "robosleek" + can_adjust = FALSE + /obj/item/clothing/under/rank/rnd/roboticist/skirt name = "roboticist's jumpskirt" desc = "It's a slimming black with reinforced seams; great for industrial work." diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 7747d2e181..4438298dea 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -21,6 +21,13 @@ item_state = "r_suit" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) +/obj/item/clothing/under/rank/security/officer/util + name = "security utility uniform" + desc = "a grey security uniform" + icon_state = "utilsec" + item_state = "utilsec" + can_adjust = FALSE + /obj/item/clothing/under/rank/security/officer/grey name = "grey security jumpsuit" desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood." @@ -51,6 +58,28 @@ item_state = "blueshift" can_adjust = FALSE +/obj/item/clothing/under/rank/security/officer/blueshirt/seccorp + name = "corporate security uniform" + desc = "How positively stuffy." + icon_state = "seccorp" + item_state = "seccorp" + can_adjust = FALSE + +/obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/wardencorp + name = "corporate warden uniform" + icon_state = "wardencorp" + item_state = "wardencorp" + +/obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/hoscorp + name = "corporate head of security's uniform" + icon_state = "hoscorp" + item_state = "hoscorp" + +/obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/detcorp + name = "corporate detective's uniform" + icon_state = "detcorp" + item_state = "detcorp" + /obj/item/clothing/under/rank/security/officer/spacepol name = "police uniform" desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol." @@ -103,6 +132,16 @@ item_state = "det" armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) +/obj/item/clothing/under/rank/security/detective/brown + name = "dark boiled suit" + icon_state = "detectivebrown" + item_state = "detectivebrown" + +/obj/item/clothing/under/rank/security/detective/brown/brown2 + name = "padded suit" + icon_state = "detectivebrown2" + item_state = "detectivebrown2" + /obj/item/clothing/under/rank/security/detective/skirt name = "detective's suitskirt" desc = "Someone who wears this means business." @@ -202,4 +241,4 @@ desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol." icon_state = "spacepol" item_state = "spacepol" - can_adjust = FALSE \ No newline at end of file + can_adjust = FALSE diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index fe23003b38..87e6e94b6b 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -116,3 +116,19 @@ /obj/item/clothing/under/suit/polychromic/ComponentInitialize() . = ..() AddElement(/datum/element/polychromic, list("#FFFFFF", "#FFFFFF", "#808080"), 3) + +/obj/item/clothing/under/suit/turtle + desc = "a debatably stylish turtleneck." + can_adjust = FALSE + +/obj/item/clothing/under/suit/turtle/teal + name = "teal turtleneck" + icon_state = "tealturtle" + item_state = "tealturtle" + can_adjust = FALSE + +/obj/item/clothing/under/suit/turtle/grey + name = "grey turtleneck" + icon_state = "greyturtle" + item_state = "greyturtle" + can_adjust = FALSE diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index b8480a1901..a38a9237ca 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -22,6 +22,7 @@ endurance = 25 yield = 6 potency = 5 + instability = 30 icon_dead = "ambrosia-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 81318f8fe1..e825c88524 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/banana lifespan = 50 endurance = 30 + instability = 10 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_dead = "banana-dead" genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index eba7a3d3c4..ca9e1f8a0e 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -10,6 +10,7 @@ maturation = 5 production = 5 yield = 2 + instability = 30 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes icon_dead = "berry-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e4fe7fcdbc..1882d5fe97 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -9,6 +9,7 @@ maturation = 8 potency = 20 growthstages = 1 + instability = 40 growing_icon = 'goon/icons/obj/hydroponics.dmi' icon_grow = "cannabis-grow" // Uses one growth icons set for all the subtypes icon_dead = "cannabis-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 1d1309acb8..9bfdb2979c 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -9,6 +9,7 @@ production = 1 yield = 4 potency = 15 + instability = 20 icon_dead = "wheat-dead" mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat) reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 001a90b441..2f8fb12724 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -11,6 +11,7 @@ production = 5 yield = 4 potency = 20 + instability = 30 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "chili-grow" // Uses one growth icons set for all the subtypes icon_dead = "chili-dead" // Same for the dead icon diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 9ac705aa83..5de0740b87 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -10,6 +10,7 @@ maturation = 5 production = 5 yield = 2 + instability = 20 growthstages = 5 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "cocoapod-grow" diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index ad09751e44..ae046c9ff3 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/corn maturation = 8 potency = 20 + instability = 50 // Corn used to be wheatgrass, but through generations of selective cultivation... growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index a898b76ee8..beff751479 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -12,6 +12,7 @@ production = 1 yield = 2 potency = 50 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing.dmi' icon_dead = "cotton-dead" diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index a74850f3be..e6fd991169 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -11,6 +11,7 @@ maturation = 2 production = 5 yield = 5 + instability = 10 growthstages = 2 icon_grow = "grass-grow" icon_dead = "grass-dead" diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 5f1fdcdaa9..73026e546a 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -11,6 +11,7 @@ lifespan = 20 endurance = 10 yield = 4 + instability = 55 growthstages = 4 rarity = 30 var/list/mutations = list() diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 940508f66b..b988261770 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/watermelon lifespan = 50 endurance = 40 + instability = 20 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_dead = "watermelon-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -75,4 +76,4 @@ to_chat(user, "[src] rapidly turns into ash!") qdel(src) new /obj/effect/decal/cleanable/ash(drop_location()) -*/ \ No newline at end of file +*/ diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index fe60e9f397..59301732c6 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -11,6 +11,7 @@ production = 1 yield = 6 potency = 10 + instability = 35 growthstages = 3 grind_results = list(/datum/reagent/mustardgrind = 1) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' @@ -111,6 +112,7 @@ maturation = 3 production = 5 yield = 4 + instability = 10 growthstages = 1 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) @@ -140,6 +142,7 @@ endurance = 50 maturation = 3 yield = 4 + instability = 15 growthstages = 2 reagents_add = list(/datum/reagent/consumable/sugar = 0.25) mutatelist = list(/obj/item/seeds/bamboo) @@ -534,4 +537,4 @@ /obj/item/reagent_containers/food/snacks/grown/aloe/microwave_act(obj/machinery/microwave/M) new /obj/item/stack/medical/aloe(drop_location(), 2) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 699a1c798d..80ba6b7375 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -18,6 +18,7 @@ production = 5 yield = 4 potency = 15 + instability = 30 growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -43,6 +44,7 @@ maturation = 10 production = 5 yield = 4 + instability = 30 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -187,6 +189,7 @@ production = 1 yield = 5 potency = 15 + instability = 20 growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' @@ -244,6 +247,7 @@ production = 1 yield = 3 //-> spread potency = 30 //-> brightness + instability = 20 growthstages = 4 rarity = 20 genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism) @@ -334,4 +338,4 @@ /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user) . = ..() if(.) - investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) \ No newline at end of file + investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index cee7748c59..e4aedfd4b0 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -8,6 +8,7 @@ lifespan = 30 endurance = 40 // tuff like a toiger yield = 4 + instability = 25 growthstages = 5 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy) mutatelist = list(/obj/item/seeds/nettle/death) diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index a75b9caf5f..f6fcd3ae1b 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -10,6 +10,7 @@ production = 4 yield = 6 endurance = 25 + instability = 10 growthstages = 3 weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index 79d506cf56..0775f7c45d 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -8,6 +8,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/peas maturation = 3 potency = 25 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "peas-grow" @@ -79,6 +80,7 @@ potency = 75 yield = 1 production = 10 + instability = 45 //The world is a very unstable place. Constantly changing. growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_grow = "worldpeas-grow" diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index ac171b4e45..5f9b55b881 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -9,6 +9,7 @@ maturation = 10 production = 1 yield = 5 + instability = 15 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' mutatelist = list(/obj/item/seeds/carrot/parsnip) @@ -69,6 +70,7 @@ lifespan = 60 endurance = 50 yield = 6 + instability = 10 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" mutatelist = list(/obj/item/seeds/redbeet) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 223b2c7bce..1c8055f821 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -79,6 +79,7 @@ maturation = 5 production = 5 yield = 5 + instability = 20 growthstages = 5 icon_dead = "coffee-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index d3525c951d..af7d192e00 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -6,6 +6,7 @@ species = "tomato" plantname = "Tomato Plants" product = /obj/item/reagent_containers/food/snacks/grown/tomato + instability = 25 maturation = 8 growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' icon_grow = "tomato-grow" diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index f6be9db9a2..b032b84a77 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -1,7 +1,7 @@ // Plant analyzer /obj/item/plant_analyzer name = "plant analyzer" - desc = "A scanner used to evaluate a plant's various areas of growth." + desc = "A scanner used to evaluate a plant's various areas of growth, and genetic traits." icon = 'icons/obj/device.dmi' icon_state = "hydro" item_state = "analyzer" @@ -10,6 +10,25 @@ w_class = WEIGHT_CLASS_TINY slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=30, /datum/material/glass=20) + var/scan_mode = PLANT_SCANMODE_STATS + +/obj/item/plant_analyzer/attack_self(mob/user) + . = ..() + scan_mode = !scan_mode + to_chat(user, "You switch [src] to [scan_mode == PLANT_SCANMODE_CHEMICALS ? "scan for chemical reagents and traits" : "scan for plant growth statistics"].") + +/obj/item/plant_analyzer/attack(mob/living/M, mob/living/carbon/human/user) + //Checks if target is a podman + if(ispodperson(M)) + user.visible_message("[user] analyzes [M]'s vitals.", \ + "You analyze [M]'s vitals.") + if(scan_mode== PLANT_SCANMODE_STATS) + healthscan(user, M, advanced = TRUE) + else + chemscan(user, M) + add_fingerprint(user) + return + return ..() // ************************************* // Hydroponics Tools diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index e1b3c85b75..d6022c1345 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -6,9 +6,10 @@ pixel_z = 8 obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics + idle_power_usage = 0 var/waterlevel = 100 //The amount of water in the tray (max 100) var/maxwater = 100 //The maximum amount of water in the tray - var/nutrilevel = 10 //The amount of nutrient in the tray (max 10) + var/nutridrain = 1 // How many units of nutrient will be drained in the tray var/maxnutri = 10 //The maximum nutrient of water in the tray var/pestlevel = 0 //The amount of pests in the tray (max 10) var/weedlevel = 0 //The amount of weeds in the tray (max 10) @@ -16,21 +17,25 @@ var/mutmod = 1 //Nutriment's effect on mutations var/toxic = 0 //Toxicity in the tray? var/age = 0 //Current age - var/dead = 0 //Is it dead? + var/dead = FALSE //Is it dead? var/plant_health //Its health var/lastproduce = 0 //Last time it was harvested var/lastcycle = 0 //Used for timing of cycles. var/cycledelay = 200 //About 10 seconds / cycle - var/harvest = 0 //Ready to harvest? + var/harvest = FALSE //Ready to harvest? var/obj/item/seeds/myseed = null //The currently planted seed var/rating = 1 - var/unwrenchable = 1 + var/unwrenchable = TRUE var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant - var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses - var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood. - var/self_sufficiency_progress = 0 + var/mob/lastuser //Last user to add reagents to a tray. Mostly for logging. var/self_sustaining = FALSE //If the tray generates nutrients and water on its own - var/canirrigate = TRUE //tin + // Here lies irrigation. You won't be missed, because you were never used. + +/obj/machinery/hydroponics/Initialize() + //Here lies "nutrilevel", killed by ArcaneMusic 20??-2019. Finally, we strive for a better future. Please use "reagents" instead + create_reagents(20) + reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, 10) //Half filled nutrient trays for dirt trays to have more to grow with in prison/lavaland. + . = ..() /obj/machinery/hydroponics/constructable name = "hydroponics tray" @@ -43,14 +48,18 @@ tmp_capacity += M.rating for (var/obj/item/stock_parts/manipulator/M in component_parts) rating = M.rating - maxwater = tmp_capacity * 50 // Up to 300 - maxnutri = tmp_capacity * 5 // Up to 30 + maxwater = tmp_capacity * 50 // Up to 400 + maxnutri = (tmp_capacity * 5) + STATIC_NUTRIENT_CAPACITY // Up to 50 Maximum + reagents.maximum_volume = maxnutri + nutridrain = 1/rating /obj/machinery/hydroponics/constructable/examine(mob/user) . = ..() + . += "Use Ctrl-Click to activate autogrow. Alt-Click to empty the tray's nutrients." if(in_range(user, src) || isobserver(user)) . += "The status display reads: Tray efficiency at [rating*100]%." + /obj/machinery/hydroponics/Destroy() if(myseed) qdel(myseed) @@ -62,34 +71,11 @@ // handle opening the panel if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) return - - // handle deconstructing the machine, if permissible - if (I.tool_behaviour == TOOL_CROWBAR && using_irrigation) - to_chat(user, "Disconnect the hoses first!") - return - else if(default_deconstruction_crowbar(I)) + if(default_deconstruction_crowbar(I)) return return ..() -/obj/machinery/hydroponics/proc/FindConnected() - var/list/connected = list() - var/list/processing_atoms = list(src) - - while(processing_atoms.len) - var/atom/a = processing_atoms[1] - for(var/step_dir in GLOB.cardinals) - var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir) - // Soil plots aren't dense - if(h && h.using_irrigation && h.density && !(h in connected) && !(h in processing_atoms)) - processing_atoms += h - - processing_atoms -= a - connected += a - - return connected - - /obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. if(!myseed) return ..() @@ -107,12 +93,16 @@ if(myseed && (myseed.loc != src)) myseed.forceMove(src) - if(self_sustaining) - adjustNutri(1) - adjustWater(rand(3,5)) - adjustWeeds(-2) - adjustPests(-2) - adjustToxic(-2) + if(!powered() && self_sustaining) + visible_message("[name]'s auto-grow functionality shuts off!") + idle_power_usage = 0 + self_sustaining = FALSE + update_icon() + + else if(self_sustaining) + adjustWater(rand(1,2)) + adjustWeeds(-1) + adjustPests(-1) if(world.time > (lastcycle + cycledelay)) lastcycle = world.time @@ -124,13 +114,17 @@ needs_update = 1 -//Nutrients////////////////////////////////////////////////////////////// - // Nutrients deplete slowly - if(prob(50)) - adjustNutri(-1 / rating) +//Nutrients////////////////////////////////////////////////////////////// + // Nutrients deplete at a constant rate, since new nutrients can boost stats far easier. + apply_chemicals(lastuser) + if(self_sustaining) + reagents.remove_any(min(0.5, nutridrain)) + else + reagents.remove_any(nutridrain) + // Lack of nutrients hurts non-weeds - if(nutrilevel <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) + if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-rand(1,3)) //Photosynthesis///////////////////////////////////////////////////////// @@ -156,7 +150,7 @@ adjustHealth(-rand(0,2) / rating) // Sufficient water level and nutrient level = plant healthy but also spawns weeds - else if(waterlevel > 10 && nutrilevel > 0) + else if(waterlevel > 10 && reagents.total_volume > 0) adjustHealth(rand(1,2) / rating) if(myseed && prob(myseed.weed_chance)) adjustWeeds(myseed.weed_rate) @@ -201,6 +195,21 @@ if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-1 / rating) +//This is where stability mutations exist now. + if(myseed.instability >= 80) + var/mutation_chance = myseed.instability - 75 + mutate(0, 0, 0, 0, 0, 0, 0, mutation_chance, 0) //Scaling odds of a random trait or chemical + if(myseed.instability >= 60) + if(prob((myseed.instability)/2) && !self_sustaining && length(myseed.mutatelist)) //Minimum 30%, Maximum 50% chance of mutating every age tick when not on autogrow. + mutatespecie() + myseed.instability = myseed.instability/2 + if(myseed.instability >= 40) + if(prob(myseed.instability)) + hardmutate() + if(myseed.instability >= 20 ) + if(prob(myseed.instability)) + mutate() + //Health & Age/////////////////////////////////////////////////////////// // Plant dies if plant_health <= 0 @@ -214,15 +223,14 @@ // Harvest code if(age > myseed.production && (age - lastproduce) > myseed.production && (!harvest && !dead)) - nutrimentMutation() if(myseed && myseed.yield != -1) // Unharvestable shouldn't be harvested - harvest = 1 + harvest = TRUE else lastproduce = age if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase adjustPests(1 / rating) else - if(waterlevel > 10 && nutrilevel > 0 && prob(10)) // If there's no plant, the percentage chance is 10% + if(waterlevel > 10 && reagents.total_volume > 0 && prob(10)) // If there's no plant, the percentage chance is 10% adjustWeeds(1 / rating) // Weeeeeeeeeeeeeeedddssss @@ -243,25 +251,6 @@ selectedtrait.on_grow(src) return -/obj/machinery/hydroponics/proc/nutrimentMutation() - if (mutmod == 0) - return - if (mutmod == 1) - if(prob(80)) //80% - mutate() - else if(prob(75)) //15% - hardmutate() - return - if (mutmod == 2) - if(prob(50)) //50% - mutate() - else if(prob(50)) //25% - hardmutate() - else if(prob(50)) //12.5% - mutatespecie() - return - return - /obj/machinery/hydroponics/update_icon() //Refreshes the icon and sets the luminosity cut_overlays() @@ -273,8 +262,6 @@ add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "gaia_blessing")) set_light(3) - update_icon_hoses() - if(myseed) update_icon_plant() update_icon_lights() @@ -288,15 +275,6 @@ return -/obj/machinery/hydroponics/proc/update_icon_hoses() - var/n = 0 - for(var/Dir in GLOB.cardinals) - var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir) - if(t && t.using_irrigation && using_irrigation) - n += Dir - - icon_state = "hoses-[n]" - /obj/machinery/hydroponics/proc/update_icon_plant() var/mutable_appearance/plant_overlay = mutable_appearance(myseed.growing_icon, layer = OBJ_LAYER + 0.01) if(dead) @@ -314,7 +292,7 @@ /obj/machinery/hydroponics/proc/update_icon_lights() if(waterlevel <= 10) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowwater3")) - if(nutrilevel <= 2) + if(reagents.total_volume <= 2) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lownutri3")) if(plant_health <= (myseed.endurance / 2)) add_overlay(mutable_appearance('icons/obj/hydroponics/equipment.dmi', "over_lowhealth3")) @@ -337,19 +315,17 @@ else . += "It's empty." - if(!self_sustaining) - . += "Water: [waterlevel]/[maxwater]." - . += "Nutrient: [nutrilevel]/[maxnutri]." - if(self_sufficiency_progress > 0) - var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) - . += "Treatment for self-sustenance are [percent_progress]% complete." - else - . += "It doesn't require any water or nutrients." + . += "Water: [waterlevel]/[maxwater].\n"+\ + "Nutrient: [reagents.total_volume]/[maxnutri]." + if(self_sustaining) + . += "The tray's autogrow is active, halving active reagent drain, and actively maintaning the plant." if(weedlevel >= 5) - . += "It's filled with weeds!" + to_chat(user, "It's filled with weeds!") if(pestlevel >= 5) - . += "It's filled with tiny worms!" + to_chat(user, "It's filled with tiny worms!") + to_chat(user, "" ) + /obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens. @@ -424,11 +400,7 @@ sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) @@ -448,18 +420,23 @@ sleep(5) // Wait a while update_icon() visible_message("The mutated weeds in [src] spawn some [myseed.plantname]!") + TRAY_NAME_UPDATE else to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...") -/obj/machinery/hydroponics/proc/plantdies() // OH NOES!!!!! I put this all in one function to make things easier +/** + * Plant Death Proc. + * Cleans up various stats for the plant upon death, including pests, harvestability, and plant health. + */ +/obj/machinery/hydroponics/proc/plantdies() plant_health = 0 - harvest = 0 + harvest = FALSE pestlevel = 0 // Pests die + lastproduce = 0 if(!dead) update_icon() - dead = 1 - + dead = TRUE /obj/machinery/hydroponics/proc/mutatepest(mob/user) @@ -471,250 +448,6 @@ else to_chat(user, "The pests seem to behave oddly, but quickly settle down...") -/obj/machinery/hydroponics/proc/applyChemicals(datum/reagents/S, mob/user) - if(myseed) - myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines - - // Requires 5 mutagen to possibly change species.// Poor man's mutagen. - if(S.has_reagent(/datum/reagent/toxin/mutagen, 5) || S.has_reagent(/datum/reagent/radium, 10) || S.has_reagent(/datum/reagent/uranium, 10)) - switch(rand(100)) - if(91 to 100) - adjustHealth(-10) - to_chat(user, "The plant shrivels and burns.") - if(81 to 90) - mutatespecie() - if(66 to 80) - hardmutate() - if(41 to 65) - mutate() - if(21 to 41) - to_chat(user, "The plants don't seem to react...") - if(11 to 20) - mutateweed() - if(1 to 10) - mutatepest(user) - else - to_chat(user, "Nothing happens...") - - // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen - else if(S.has_reagent(/datum/reagent/toxin/mutagen, 2) || S.has_reagent(/datum/reagent/radium, 5) || S.has_reagent(/datum/reagent/uranium, 5)) - hardmutate() - else if(S.has_reagent(/datum/reagent/toxin/mutagen, 1) || S.has_reagent(/datum/reagent/radium, 2) || S.has_reagent(/datum/reagent/uranium, 2)) - mutate() - - // After handling the mutating, we now handle the damage from adding crude radioactives... - if(S.has_reagent(/datum/reagent/uranium, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium) * 2)) - if(S.has_reagent(/datum/reagent/radium, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/radium) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/radium) * 3)) // Radium is harsher (OOC: also easier to produce) - - // Nutriments - if(S.has_reagent(/datum/reagent/plantnutriment/eznutriment, 1)) - yieldmod = 1 - mutmod = 1 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/eznutriment) * 1)) - - if(S.has_reagent(/datum/reagent/plantnutriment/left4zednutriment, 1)) - yieldmod = 0 - mutmod = 2 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/left4zednutriment) * 1)) - - if(S.has_reagent(/datum/reagent/plantnutriment/robustharvestnutriment, 1)) - yieldmod = 1.3 - mutmod = 0 - adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/robustharvestnutriment) *1 )) - - // Ambrosia Gaia produces earthsblood. - if(S.has_reagent(/datum/reagent/medicine/earthsblood)) - self_sufficiency_progress += S.get_reagent_amount(/datum/reagent/medicine/earthsblood) - if(self_sufficiency_progress >= self_sufficiency_req) - become_self_sufficient() - else if(!self_sustaining) - to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.") - - // Antitoxin binds shit pretty well. So the tox goes significantly down - if(S.has_reagent(/datum/reagent/medicine/charcoal, 1)) - adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/charcoal) * 2)) - - // Toxins, not good for anything - if(S.has_reagent(/datum/reagent/toxin, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin) * 2)) - - // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now... - if(S.has_reagent(/datum/reagent/consumable/milk, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.9)) - - // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay? - if(S.has_reagent(/datum/reagent/consumable/ethanol/beer, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.05)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.25)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.7)) - - // Fluorine one of the most corrosive and deadly gasses - if(S.has_reagent(/datum/reagent/fluorine, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 2)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/fluorine) * 2.5)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 0.5)) - adjustWeeds(-rand(1,4)) - - // Chlorine one of the most corrosive and deadly gasses - if(S.has_reagent(/datum/reagent/chlorine, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/chlorine) * 1.5)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 0.5)) - adjustWeeds(-rand(1,3)) - - // White Phosphorous + water -> phosphoric acid. That's not a good thing really. - // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. - if(S.has_reagent(/datum/reagent/phosphorus, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.75)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.1)) - adjustWater(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.5)) - adjustWeeds(-rand(1,2)) - - // Plants should not have sugar, they can't use it and it prevents them getting water/nutients, it is good for mold though... - if(S.has_reagent(/datum/reagent/consumable/sugar, 1)) - adjustWeeds(rand(1,2)) - adjustPests(rand(1,2)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sugar) * 0.1)) - - // It is water! - if(S.has_reagent(/datum/reagent/water, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/water) * 1)) - - // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~ - if(S.has_reagent(/datum/reagent/water/holywater, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 0.1)) - - // A variety of nutrients are dissolved in club soda, without sugar. - // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. - if(S.has_reagent(/datum/reagent/consumable/sodawater, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) - - // Sulphuric Acid - if(S.has_reagent(/datum/reagent/toxin/acid, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5)) - adjustWeeds(-rand(1,2)) - - // Acid - if(S.has_reagent(/datum/reagent/toxin/acid/fluacid, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 2)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 3)) - adjustWeeds(-rand(1,4)) - - // Plant-B-Gone is just as bad - if(S.has_reagent(/datum/reagent/toxin/plantbgone, 1)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 5)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 6)) - adjustWeeds(-rand(4,8)) - - // Napalm, not known for being good for anything organic - if(S.has_reagent(/datum/reagent/napalm, 1)) - if(!(myseed.resistance_flags & FIRE_PROOF)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7)) - adjustWeeds(-rand(5,9)) - - //Weed Spray - if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone/weedkiller) * 0.5)) - //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts - adjustWeeds(-rand(1,2)) - - //Pest Spray - if(S.has_reagent(/datum/reagent/toxin/pestkiller, 1)) - adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/pestkiller) * 0.5)) - adjustPests(-rand(1,2)) - - // Healing - if(S.has_reagent(/datum/reagent/medicine/cryoxadone, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) - adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) - - // Ammonia is bad ass. - if(S.has_reagent(/datum/reagent/ammonia, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.5)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/ammonia) * 1)) - if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.01)) - - // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants - if(S.has_reagent(/datum/reagent/saltpetre, 1)) - var/salt = S.get_reagent_amount(/datum/reagent/saltpetre) - adjustHealth(round(salt * 0.25)) - if (myseed) - myseed.adjust_production(-round(salt/100)-prob(salt%100)) - myseed.adjust_potency(round(salt*0.5)) - - // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer - if(S.has_reagent(/datum/reagent/ash, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/ash) * 0.25)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/ash) * 0.5)) - adjustWeeds(-1) - - // Diethylamine is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. - if(S.has_reagent(/datum/reagent/diethylamine, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 2)) - if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 0.02)) - adjustPests(-rand(1,2)) - - // Nutriment Compost, effectively - if(S.has_reagent(/datum/reagent/consumable/nutriment, 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 0.5)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 1)) - - // Virusfood Compost for EVERYTHING - if(S.has_reagent(/datum/reagent/toxin/mutagen/mutagenvirusfood, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/mutagen/mutagenvirusfood) * 0.5)) - - // Blood - if(S.has_reagent(/datum/reagent/blood, 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/blood) * 1)) - adjustPests(rand(2,4)) - - // Strange reagent - if(S.has_reagent(/datum/reagent/medicine/strange_reagent, 1)) - spawnplant() - - // Honey, Pests are dieing of sugar, so is the plant - if(S.has_reagent(/datum/reagent/consumable/honey, 1)) - adjustPests(-rand(2,5)) - adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/honey) * 1)) - - // Buzz Fuzz, a drink seemingly made for plants... - if(S.has_reagent(/datum/reagent/consumable/buzz_fuzz, 1)) - adjustPests(-rand(2,5)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/buzz_fuzz) * 0.1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/buzz_fuzz) * 0.5)) - - // Adminordrazine the best stuff there is. For testing/debugging. - if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 1)) - adjustWater(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustNutri(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) - adjustPests(-rand(1,5)) - adjustWeeds(-rand(1,5)) - if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 5)) - switch(rand(100)) - if(66 to 100) - mutatespecie() - if(33 to 65) - mutateweed() - if(1 to 32) - mutatepest(user) - else - to_chat(user, "Nothing happens...") - /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) //Called when mob user "attacks" it with object O if(istype(O, /obj/item/reagent_containers) ) // Syringe stuff (and other reagent containers now too) @@ -730,13 +463,20 @@ to_chat(user, "[reagent_source] is empty.") return 1 + if(reagents.total_volume >= reagents.maximum_volume && !reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) + to_chat(user, "[src] is full.") + return + var/list/trays = list(src)//makes the list just this in cases of syringes and compost etc var/target = myseed ? myseed.plantname : src var/visi_msg = "" - var/irrigate = 0 //How am I supposed to irrigate pill contents? var/transfer_amount if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill)) + if(istype(reagent_source, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/R = reagent_source + if (R.trash) + R.generate_trash(get_turf(user)) visi_msg="[user] composts [reagent_source], spreading it through [target]" transfer_amount = reagent_source.reagents.total_volume else @@ -746,41 +486,27 @@ visi_msg="[user] injects [target] with [syr]" if(syr.reagents.total_volume <= syr.amount_per_transfer_from_this) syr.mode = 0 - else if(istype(reagent_source, /obj/item/reagent_containers/spray/)) - visi_msg="[user] sprays [target] with [reagent_source]" - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - irrigate = 1 - else if(transfer_amount) // Droppers, cans, beakers, what have you. - visi_msg="[user] uses [reagent_source] on [target]" - irrigate = 1 // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - - if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation) - trays = FindConnected() - if (trays.len > 1) - visi_msg += ", setting off the irrigation system" + playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) if(visi_msg) visible_message("[visi_msg].") - var/split = round(transfer_amount/trays.len) - + for(var/obj/machinery/hydroponics/H in trays) //cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener - - var/datum/reagents/S = new /datum/reagents() //This is a strange way, but I don't know of a better one so I can't fix it at the moment... - S.my_atom = H - - reagent_source.reagents.trans_to(S,split) + //This was originally in apply_chemicals, but due to apply_chemicals only holding nutrients, we handle it here now. + if(reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) + var/water_amt = reagent_source.reagents.get_reagent_amount(/datum/reagent/water) * transfer_amount / reagent_source.reagents.total_volume + H.adjustWater(round(water_amt)) + reagent_source.reagents.remove_reagent(/datum/reagent/water, water_amt) + reagent_source.reagents.trans_to(H.reagents, transfer_amount) if(istype(reagent_source, /obj/item/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/reagent_containers/pill)) qdel(reagent_source) - - H.applyChemicals(S, user) - - S.clear_reagents() - qdel(S) + lastuser = user + H.update_icon() + return 1 H.update_icon() if(reagent_source) // If the source wasn't composted and destroyed reagent_source.update_icon() @@ -793,39 +519,43 @@ if(!user.transferItemToLoc(O, src)) return to_chat(user, "You plant [O].") - dead = 0 + dead = FALSE myseed = O - name = "hydroponics tray ([myseed.plantname])" - if(!myseed.productdesc) //we haven't changed our produce's description - if(myseed.product) - myseed.productdesc = initial(myseed.product.desc) - else if(myseed.desc) - myseed.productdesc = myseed.desc - else - myseed.productdesc = "A fascinating specimen." - desc = myseed.productdesc + TRAY_NAME_UPDATE age = 1 plant_health = myseed.endurance lastcycle = world.time update_icon() + return else to_chat(user, "[src] already has seeds in it!") + return else if(istype(O, /obj/item/plant_analyzer)) + var/obj/item/plant_analyzer/P_analyzer = O if(myseed) - to_chat(user, "*** [myseed.plantname] ***" ) - to_chat(user, "- Plant Age: [age]") - var/list/text_string = myseed.get_analyzer_text() - if(text_string) - to_chat(user, text_string) + if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS) + to_chat(user, "*** [myseed.plantname] ***" ) + to_chat(user, "- Plant Age: [age]") + var/list/text_string = myseed.get_analyzer_text() + if(text_string) + to_chat(user, text_string) + to_chat(user, "*---------*") + if(myseed.reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS) + to_chat(user, "- Plant Reagents -") + to_chat(user, "*---------*") + for(var/datum/plant_gene/reagent/G in myseed.genes) + to_chat(user, "- [G.get_name()] -") + to_chat(user, "*---------*") else to_chat(user, "No plant found.") to_chat(user, "- Weed level: [weedlevel] / 10") to_chat(user, "- Pest level: [pestlevel] / 10") to_chat(user, "- Toxicity level: [toxic] / 100") to_chat(user, "- Water level: [waterlevel] / [maxwater]") - to_chat(user, "- Nutrition level: [nutrilevel] / [maxnutri]") + to_chat(user, "- Nutrition level: [reagents.total_volume] / [maxnutri]") to_chat(user, "") + return else if(istype(O, /obj/item/cultivator)) if(weedlevel > 0) @@ -843,18 +573,6 @@ else if(default_unfasten_wrench(user, O)) return - else if(istype(O, /obj/item/wirecutters) && unwrenchable) - if (!anchored) - to_chat(user, "Anchor the tray first!") - return - if(canirrigate) - using_irrigation = !using_irrigation - O.play_tool_sound(src) - user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ - "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") - for(var/obj/machinery/hydroponics/h in range(1,src)) - h.update_icon() - else if(istype(O, /obj/item/shovel/spade)) if(!myseed && !weedlevel) to_chat(user, "[src] doesn't have any plants or weeds!") @@ -882,14 +600,12 @@ if (!unwrenchable) // case also covered by NODECONSTRUCT checks in default_unfasten_wrench return CANT_UNFASTEN - if (using_irrigation) - if (!silent) - to_chat(user, "Disconnect the hoses first!") - return FAILED_UNFASTEN - return ..() -/obj/machinery/hydroponics/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/machinery/hydroponics/attack_hand(mob/user) + . = ..() + if(.) + return if(issilicon(user)) //How does AI know what plant is? return if(harvest) @@ -897,41 +613,62 @@ return else if(dead) - dead = 0 + dead = FALSE to_chat(user, "You remove the dead plant from [src].") qdel(myseed) myseed = null update_icon() - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE else if(user) examine(user) +/obj/machinery/hydroponics/CtrlClick(mob/user) + . = ..() + if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + if(!powered()) + to_chat(user, "[name] has no power.") + return + if(!anchored) + return + self_sustaining = !self_sustaining + idle_power_usage = self_sustaining ? 2500 : 0 + to_chat(user, "You [self_sustaining ? "activate" : "deactivated"] [src]'s autogrow function[self_sustaining ? ", maintaining the tray's health while using high amounts of power" : ""].") + update_icon() + +/obj/machinery/hydroponics/AltClick(mob/user) + . = ..() + if(!anchored) + update_icon() + return FALSE + var/warning = alert(user, "Are you sure you wish to empty the tray's nutrient beaker?","Empty Tray Nutrients?", "Yes", "No") + if(warning == "Yes" && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + reagents.clear_reagents() + to_chat(user, "You empty [src]'s nutrient tank.") + /obj/machinery/hydroponics/proc/update_tray(mob/user) - harvest = 0 + harvest = FALSE lastproduce = age if(istype(myseed, /obj/item/seeds/replicapod)) - if(user)//runtimes - to_chat(user, "You harvest from the [myseed.plantname].") + to_chat(user, "You harvest from the [myseed.plantname].") else if(myseed.getYield() <= 0) - if(user) - to_chat(user, "You fail to harvest anything useful!") + to_chat(user, "You fail to harvest anything useful!") else - if(user) - to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") + to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) qdel(myseed) myseed = null - dead = 0 + dead = FALSE name = initial(name) desc = initial(desc) + TRAY_NAME_UPDATE + if(self_sustaining) //No reason to pay for an empty tray. + idle_power_usage = 0 + self_sustaining = FALSE update_icon() - + /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// -/obj/machinery/hydroponics/proc/adjustNutri(adjustamt) - nutrilevel = clamp(nutrilevel + adjustamt, 0, maxnutri) - /obj/machinery/hydroponics/proc/adjustWater(adjustamt) waterlevel = clamp(waterlevel + adjustamt, 0, maxwater) @@ -957,11 +694,6 @@ var/mob/living/simple_animal/hostile/C = new chosen C.faction = list("plants") -/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect - visible_message("[src] begins to glow with a beautiful light!") - self_sustaining = TRUE - update_icon() - /////////////////////////////////////////////////////////////////////////////// /obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk! name = "soil" @@ -974,9 +706,6 @@ flags_1 = NODECONSTRUCT_1 unwrenchable = FALSE -/obj/machinery/hydroponics/soil/update_icon_hoses() - return // Has no hoses - /obj/machinery/hydroponics/soil/update_icon_lights() return // Has no lights @@ -986,3 +715,6 @@ qdel(src) else return ..() + +/obj/machinery/hydroponics/soil/CtrlClick(mob/user) + return //Dirt doesn't have electricity, last I checked. diff --git a/code/modules/hydroponics/hydroponics_chemreact.dm b/code/modules/hydroponics/hydroponics_chemreact.dm new file mode 100644 index 0000000000..a4ef78a21f --- /dev/null +++ b/code/modules/hydroponics/hydroponics_chemreact.dm @@ -0,0 +1,32 @@ +/** + *This is NOW the gradual affects that each chemical applies on every process() proc. Nutrients now use a more robust reagent holder in order to apply less insane + * stat changes as opposed to 271 lines of individual statline effects. Shoutout to the original comments on chems, I just cleaned a few up. + */ +/obj/machinery/hydroponics/proc/apply_chemicals(mob/user) + ///Contains the reagents within the tray. + if(myseed) + myseed.on_chem_reaction(reagents) //In case seeds have some special interactions with special chems, currently only used by vines + for(var/c in reagents.reagent_list) + var/datum/reagent/chem = c + chem.on_hydroponics_apply(myseed, reagents, src, user) + + +/obj/machinery/hydroponics/proc/mutation_roll(mob/user) + switch(rand(100)) + if(91 to 100) + adjustHealth(-10) + visible_message("\The [myseed.plantname] starts to wilt and burn!") + return + if(41 to 90) + if(myseed && !self_sustaining) //Stability + myseed.adjust_instability(5) + return + if(21 to 40) + visible_message("\The [myseed.plantname] appears unusually reactive...") + return + if(11 to 20) + mutateweed() + return + if(1 to 10) + mutatepest(user) + return diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 887ea0417c..da19fa11f8 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -89,6 +89,12 @@ /datum/plant_gene/core/potency/apply_stat(obj/item/seeds/S) S.potency = value +/datum/plant_gene/core/instability + name = "Stability" + value = 10 + +/datum/plant_gene/core/instability/apply_stat(obj/item/seeds/S) + S.instability = value /datum/plant_gene/core/weed_rate name = "Weed Growth Rate" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index c7314bf180..2dc80cd8fc 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -24,6 +24,7 @@ var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested. var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways. var/growthstages = 6 // Amount of growth sprites the plant has. + var/instability = 5 //Chance that a plant will mutate in each stage of it's life. var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom. var/list/mutatelist = list() // The type of plants that this plant can mutate into. var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info. @@ -36,6 +37,7 @@ var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth var/weed_chance = 5 //Percentage chance per tray update to grow weeds + var/seed_flags = MUTATE_EARLY //Determines if a plant is allowed to mutate early at 30+ instability /obj/item/seeds/Initialize(mapload, nogenes = 0) . = ..() @@ -61,6 +63,7 @@ genes += new /datum/plant_gene/core/production(production) if(potency != -1) genes += new /datum/plant_gene/core/potency(potency) + genes += new /datum/plant_gene/core/instability(instability) for(var/p in genes) if(ispath(p)) @@ -74,6 +77,10 @@ /obj/item/seeds/examine(mob/user) . = ..() . += "Use a pen on it to rename it or change its description." + if(reagents_add && user.can_see_reagents()) + . += "- Plant Reagents -" + for(var/datum/plant_gene/reagent/G in genes) + . += "- [G.get_name()] -" /obj/item/seeds/proc/Copy() var/obj/item/seeds/S = new type(null, 1) @@ -85,6 +92,7 @@ S.yield = yield S.potency = potency S.weed_rate = weed_rate + S.instability = instability S.weed_chance = weed_chance S.name = name S.plantname = plantname @@ -121,18 +129,20 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) if(g) g.mutability_flags &= ~mutability -/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) +/obj/item/seeds/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0, stabmut = 3) adjust_lifespan(rand(-lifemut,lifemut)) adjust_endurance(rand(-endmut,endmut)) adjust_production(rand(-productmut,productmut)) adjust_yield(rand(-yieldmut,yieldmut)) adjust_potency(rand(-potmut,potmut)) + adjust_instability(rand(-stabmut,stabmut)) adjust_weed_rate(rand(-wrmut, wrmut)) adjust_weed_chance(rand(-wcmut, wcmut)) if(prob(traitmut)) - add_random_traits(1, 1) - - + if(prob(50)) + add_random_traits(1, 1) + else + add_random_reagents(1, 1) /obj/item/seeds/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables. if(istype(Proj, /obj/item/projectile/energy/florayield)) @@ -165,13 +175,40 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /obj/item/seeds/proc/harvest(mob/user) + ///Reference to the tray/soil the seeds are planted in. var/obj/machinery/hydroponics/parent = loc //for ease of access + ///Count used for creating the correct amount of results to the harvest. var/t_amount = 0 + ///List of plants all harvested from the same batch. var/list/result = list() + ///Tile of the harvester to deposit the growables. var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK + ///Name of the grown products. var/product_name - while(t_amount < getYield()) - var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + ///The Number of products produced by the plant, typically the yield. + var/product_count = getYield() + + while(t_amount < product_count) + var/obj/item/reagent_containers/food/snacks/grown/t_prod + if(instability >= 30 && (seed_flags & MUTATE_EARLY) && LAZYLEN(mutatelist) && prob(instability/3)) + var/obj/item/seeds/new_prod = pick(mutatelist) + t_prod = initial(new_prod.product) + if(!t_prod) + continue + t_prod = new t_prod(output_loc, src) + t_prod.seed = new new_prod + t_prod.seed.name = initial(new_prod.name) + t_prod.seed.desc = initial(new_prod.desc) + t_prod.seed.plantname = initial(new_prod.plantname) + t_prod.transform = initial(t_prod.transform) + t_prod.transform *= TRANSFORM_USING_VARIABLE(t_prod.seed.potency, 100) + 0.5 + t_amount++ + if(t_prod.seed) + //t_prod.seed = new new_prod + t_prod.seed.instability = round(instability * 0.5) + continue + else + t_prod = new product(output_loc, src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) t_prod.name = lowertext(parent.myseed.plantname) if(productdesc) @@ -186,8 +223,8 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) product_name = parent.myseed.plantname if(getYield() >= 1) SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) - parent.investigate_log("[user] harvested [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY) parent.update_tray(user) + return result /obj/item/seeds/proc/harvest_userless() @@ -263,6 +300,14 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) if(C) C.value = production +/obj/item/seeds/proc/adjust_instability(adjustamt) + if(instability == -1) + return + instability = clamp(instability + adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/instability) + if(C) + C.value = instability + /obj/item/seeds/proc/adjust_potency(adjustamt) if(potency != -1) potency = clamp(potency + adjustamt, 0, 100) @@ -320,6 +365,14 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) if(C) C.value = potency +/obj/item/seeds/proc/set_instability(adjustamt) + if(instability == -1) + return + instability = clamp(adjustamt, 0, 100) + var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/instability) + if(C) + C.value = instability + /obj/item/seeds/proc/set_weed_rate(adjustamt) weed_rate = clamp(adjustamt, 0, 10) var/datum/plant_gene/core/C = get_gene(/datum/plant_gene/core/weed_rate) @@ -352,6 +405,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) text += "- Production speed: [production]\n" text += "- Endurance: [endurance]\n" text += "- Lifespan: [lifespan]\n" + text += "- Instability: [instability]\n" text += "- Weed Growth Rate: [weed_rate]\n" text += "- Weed Vulnerability: [weed_chance]\n" if(rarity) @@ -362,9 +416,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) continue all_traits += " [traits.get_name()]" text += "- Plant Traits:[all_traits]\n" - text += "*---------*" - return text /obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) //in case seeds have some special interaction with special chems @@ -373,9 +425,19 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) /obj/item/seeds/attackby(obj/item/O, mob/user, params) if (istype(O, /obj/item/plant_analyzer)) to_chat(user, "*---------*\n This is \a [src].") - var/text = get_analyzer_text() - if(text) - to_chat(user, "[text]") + var/text + var/obj/item/plant_analyzer/P_analyzer = O + if(P_analyzer.scan_mode == PLANT_SCANMODE_STATS) + text = get_analyzer_text() + if(text) + to_chat(user, "[text]") + if(reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS) + to_chat(user, "- Plant Reagents -") + to_chat(user, "*---------*") + for(var/datum/plant_gene/reagent/G in genes) + to_chat(user, "- [G.get_name()] -") + to_chat(user, "*---------*") + return diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index e8981ed685..9abf5d86a0 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -261,13 +261,11 @@ set_pin_data(IC_OUTPUT, 12, H.pestlevel) set_pin_data(IC_OUTPUT, 13, H.toxic) set_pin_data(IC_OUTPUT, 14, H.waterlevel) - set_pin_data(IC_OUTPUT, 15, H.nutrilevel) + set_pin_data(IC_OUTPUT, 15, H.reagents.total_volume) set_pin_data(IC_OUTPUT, 16, H.harvest) set_pin_data(IC_OUTPUT, 17, H.dead) set_pin_data(IC_OUTPUT, 18, H.plant_health) set_pin_data(IC_OUTPUT, 19, H.self_sustaining) - set_pin_data(IC_OUTPUT, 20, H.using_irrigation) - set_pin_data(IC_OUTPUT, 21, H.FindConnected()) push_data() activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 991c806f43..f69fa08aaf 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -19,30 +19,26 @@ // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. // This is a dirty hack to make injecting reagents into them work. // TODO: refactor that. -/obj/item/integrated_circuit/reagent/proc/inject_tray(obj/machinery/hydroponics/tray, atom/movable/source, amount) - var/atom/movable/acting_object = get_object() - var/list/trays = list(tray) - var/visi_msg = "[acting_object] transfers fluid into [tray]" +//Time for someone to refactor this. Trays can now hold reagents. +//obj/item/integrated_circuit/reagent/proc/inject_tray(obj/machinery/hydroponics/tray, atom/movable/source, amount) + //var/atom/movable/acting_object = get_object() + //var/list/trays = list(tray) + //var/visi_msg = "[acting_object] transfers fluid into [tray]" - if(amount > 30 && source.reagents.total_volume >= 30 && tray.using_irrigation) - trays = tray.FindConnected() - if (trays.len > 1) - visi_msg += ", setting off the irrigation system" + //acting_object.visible_message("[visi_msg].") + //playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - acting_object.visible_message("[visi_msg].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + //var/split = round(amount/trays.len) - var/split = round(amount/trays.len) + //for(var/obj/machinery/hydroponics/H in trays) + //var/datum/reagents/temp_reagents = new /datum/reagents() + //temp_reagents.my_atom = H - for(var/obj/machinery/hydroponics/H in trays) - var/datum/reagents/temp_reagents = new /datum/reagents() - temp_reagents.my_atom = H + //source.reagents.trans_to(temp_reagents, split) + //H.on_hydroponics_apply(temp_reagents) - source.reagents.trans_to(temp_reagents, split) - H.applyChemicals(temp_reagents) - - temp_reagents.clear_reagents() - qdel(temp_reagents) + //temp_reagents.clear_reagents() + //qdel(temp_reagents) /obj/item/integrated_circuit/reagent/injector name = "integrated hypo-injector" @@ -116,10 +112,10 @@ return if(!AM.reagents) - if(istype(AM, /obj/machinery/hydroponics) && direction_mode == SYRINGE_INJECT && reagents.total_volume && transfer_amount)//injection into tray. - inject_tray(AM, src, transfer_amount) - activate_pin(2) - return + //if(istype(AM, /obj/machinery/hydroponics) && direction_mode == SYRINGE_INJECT && reagents.total_volume && transfer_amount)//injection into tray. + //inject_tray(AM, src, transfer_amount) + //activate_pin(2) + //return activate_pin(3) return @@ -242,13 +238,14 @@ if(!source.reagents) return - if(!target.reagents) + //if(!target.reagents) // Hydroponics trays have no reagents holder and handle reagents in their own snowflakey way. // This is a dirty hack to make injecting reagents into them work. - if(istype(target, /obj/machinery/hydroponics) && source.reagents.total_volume) - inject_tray(target, source, transfer_amount) - activate_pin(2) - return + //Someone should redo this. Trays should hold reagents now. + //if(istype(target, /obj/machinery/hydroponics) && source.reagents.total_volume) + //inject_tray(target, source, transfer_amount) + //activate_pin(2) + //return if(!source.is_drainable() || !target.is_refillable()) return diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index d1f7f15ac9..4faef230df 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -51,7 +51,7 @@ /datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return (!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) + return (!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/xeno_head/standard name = "Standard" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index 7515ce560a..1d9138465f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return (!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) + return (!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/ears/none name = "None" @@ -187,7 +187,7 @@ /datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return (!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) + return (!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/ears/mam_ears/none name = "None" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index aff342c7a6..accbc4ee36 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/horns/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return (!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) + return (!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/horns/none name = "None" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 99d2c67cc9..0cd7d301db 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) + return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/snout/guilmon name = "Guilmon" @@ -163,7 +163,7 @@ /datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) - return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) + return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || (HD.status == BODYPART_ROBOTIC && !HD.render_like_organic)) /datum/sprite_accessory/snouts/mam_snouts/none name = "None" diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index a853416e6f..59a119a89a 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -284,11 +284,19 @@ QDEL_LIST(traumas) return ..() +//other types of brains + /obj/item/organ/brain/alien name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" +/obj/item/organ/brain/ipc + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. It has an IPC serial number engraved on the top. It is usually slotted into the head of synthetic crewmembers." + icon = 'icons/obj/surgery.dmi' + icon_state = "posibrain-ipc" + ////////////////////////////////////TRAUMAS//////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ecaa5e16c3..96fda36370 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -407,6 +407,9 @@ if(. & EMP_PROTECT_CONTENTS) return var/informed = FALSE + if(isrobotic(src)) + apply_status_effect(/datum/status_effect/no_combat_mode/robotic_emp, severity / 20) + severity *= 0.5 for(var/obj/item/bodypart/L in src.bodyparts) if(L.status == BODYPART_ROBOTIC) if(!informed) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index b6fdbfafdd..554013c7bc 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -362,7 +362,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(H.client && has_field_of_vision && CONFIG_GET(flag/use_field_of_vision)) H.LoadComponent(/datum/component/field_of_vision, H.field_of_vision_type) - update_species_slowdown(C) + C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, TRUE, multiplicative_slowdown = speedmod) + + if(ROBOTIC_LIMBS in species_traits) + for(var/obj/item/bodypart/B in C.bodyparts) + B.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE) // Makes all Bodyparts robotic. + B.render_like_organic = TRUE + SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) /datum/species/proc/update_species_slowdown(mob/living/carbon/human/H) @@ -403,6 +409,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(F) qdel(F) + + if(ROBOTIC_LIMBS in species_traits) + for(var/obj/item/bodypart/B in C.bodyparts) + B.change_bodypart_status(BODYPART_ORGANIC, FALSE, TRUE) + B.render_like_organic = FALSE + SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) /datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour) @@ -423,7 +435,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/dynamic_fhair_suffix = "" //for augmented heads - if(HD.status == BODYPART_ROBOTIC) + if(HD.status == BODYPART_ROBOTIC && !HD.render_like_organic) return //we check if our hat or helmet hides our facial hair. diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index c5b57b82ab..5d43d18429 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -2,7 +2,7 @@ name = "Android" id = "android" say_mod = "states" - species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL) + species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL,ROBOTIC_LIMBS) inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index b675925aeb..9bfe661f47 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -5,19 +5,26 @@ default_color = "00FF00" blacklisted = 0 sexes = 0 - species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE,HAIR) + inherent_traits = list(TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NO_PROCESS_FOOD) + species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE,HAIR,ROBOTIC_LIMBS) hair_alpha = 210 inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutant_bodyparts = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) - mutanttongue = /obj/item/organ/tongue/robot/ipc -//Just robo looking parts. + + //Just robo looking parts. mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc + mutantears = /obj/item/organ/ears/ipc + mutanttongue = /obj/item/organ/tongue/robot/ipc + mutant_brain = /obj/item/organ/brain/ipc + + //special cybernetic organ for getting power from apcs + mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) exotic_bloodtype = "HF" exotic_blood_color = BLOOD_COLOR_OIL diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index 70afa2f476..b446e3796e 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -3,18 +3,24 @@ id = "synthliz" say_mod = "beeps" default_color = "00FF00" - species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE) + species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE) + inherent_traits = list(TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NO_PROCESS_FOOD) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutant_bodyparts = list("ipc_antenna" = "Synthetic Lizard - Antennae","mam_tail" = "Synthetic Lizard", "mam_snouts" = "Synthetic Lizard - Snout", "legs" = "Digitigrade", "mam_body_markings" = "Synthetic Lizard - Plates", "taur" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) - mutanttongue = /obj/item/organ/tongue/robot/ipc //Just robo looking parts. mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc mutantstomach = /obj/item/organ/stomach/ipc mutanteyes = /obj/item/organ/eyes/ipc + mutantears = /obj/item/organ/ears/ipc + mutanttongue = /obj/item/organ/tongue/robot/ipc + mutant_brain = /obj/item/organ/brain/ipc + + //special cybernetic organ for getting power from apcs + mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) exotic_bloodtype = "S" exotic_blood_color = BLOOD_COLOR_OIL diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm index 8496d27aee..20b8e6012a 100644 --- a/code/modules/plumbing/plumbers/autohydro.dm +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -4,8 +4,6 @@ icon_state = "hydrotray4" obj_flags = CAN_BE_HIT | UNIQUE_RENAME circuit = /obj/item/circuitboard/machine/hydroponics/automagic - self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly. - canirrigate = FALSE /obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) @@ -44,7 +42,7 @@ /obj/machinery/hydroponics/constructable/automagic/process() if(reagents) - applyChemicals(reagents) + reagents.add_reagent(reagents) reagents.clear_reagents() if(dead) dead = 0 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 6dcb08512c..3f1e688120 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -549,11 +549,16 @@ By design, d1 is the smallest direction and d2 is the highest var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) if(affecting && affecting.status == BODYPART_ROBOTIC) + //only heal to 25 if limb is damaged to or past 25 burn, otherwise heal normally + var/difference = affecting.burn_dam - 25 + var/heal_amount = 15 + if(difference >= 0) + heal_amount = difference if(user == H) user.visible_message("[user] starts to fix some of the wires in [H]'s [affecting.name].", "You start fixing some of the wires in [H]'s [affecting.name].") if(!do_mob(user, H, 50)) return - if(item_heal_robotic(H, user, 0, 15)) + if(item_heal_robotic(H, user, 0, heal_amount)) use(1) return else diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 4dac668adc..fe05365dd9 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -185,6 +185,23 @@ /obj/item/stock_parts/cell/get_part_rating() return rating * maxcharge +// stuff so ipcs and synthlizards can eat power cells, taken from how moths can eat clothing +/obj/item/reagent_containers/food/snacks/cell + name = "oops" + desc = "If you're reading this it means I messed up. This is related to ipcs/synths eating cells and I didn't know a better way to do it than making a new food object." + list_reagents = list(/datum/reagent/consumable/nutriment = 0.5) + tastes = list("electricity" = 1, "metal" = 1) + +/obj/item/stock_parts/cell/attack(mob/M, mob/user, def_zone) + if(user.a_intent != INTENT_HARM && isrobotic(M)) + var/obj/item/reagent_containers/food/snacks/cell/cell_as_food = new + cell_as_food.name = name + if(cell_as_food.attack(M, user, def_zone)) + take_damage(40, sound_effect=FALSE) + qdel(cell_as_food) + else + return ..() + /* Cell variants*/ /obj/item/stock_parts/cell/empty start_charged = FALSE diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 672127cb11..d6b7201ef9 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -213,6 +213,16 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if(prob(30)) to_chat(M, "You're not feeling good at all! You really need some [name].") +/** + * New, standardized method for chemicals to affect hydroponics trays. + * Defined on a per-chem level as opposed to by the tray. + * Can affect plant's health, stats, or cause the plant to react in certain ways. + */ +/datum/reagent/proc/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray || !chems) + return + return + /proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc var/list/rs = list() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 289b92f06d..c2bb678904 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -90,6 +90,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A freezing pint of beer." pH = 4 + // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? +/datum/reagent/consumable/ethanol/beer/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 0.05)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 0.7)) + /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3675efa283..37fc075c6f 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -214,6 +214,14 @@ pH = 6.5 value = REAGENT_VALUE_VERY_COMMON + // Milk is good for humans, but bad for plants. The sugars cannot be used by plants, and the milk fat harms growth. Not shrooms though. I can't deal with this now... +/datum/reagent/consumable/milk/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 0.3)) + if(myseed) + myseed.adjust_potency(-chems.get_reagent_amount(type) * 0.5) + /datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER)) M.heal_bodypart_damage(1.5,0, 0) @@ -607,6 +615,15 @@ glass_name = "honeycomb of Buzz Fuzz" glass_desc = "Stinging with flavour." + //This drink seems to be just made for plants.. how curious. +/datum/reagent/consumable/buzz_fuzz/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src,1)) + mytray.adjustPests(-rand(2,5)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5)) + /datum/reagent/consumable/buzz_fuzz/on_mob_life(mob/living/carbon/M) M.reagents.add_reagent(/datum/reagent/consumable/sugar,1) if(prob(5)) @@ -678,6 +695,15 @@ glass_name = "glass of soda water" glass_desc = "Soda water. Why not make a scotch and soda?" + + // A variety of nutrients are dissolved in club soda, without sugar. + // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. +/datum/reagent/consumable/sodawater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.1)) + /datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) M.drowsyness = max(0,M.drowsyness-3) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 18203f1a4c..1975eede70 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -17,8 +17,9 @@ var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) - current_cycle++ - M.adjust_nutrition(nutriment_factor, max_nutrition) + if(!HAS_TRAIT(M, TRAIT_NO_PROCESS_FOOD)) + current_cycle++ + M.adjust_nutrition(nutriment_factor, max_nutrition) M.CheckBloodsuckerEatFood(nutriment_factor) holder.remove_reagent(type, metabolization_rate) @@ -49,10 +50,11 @@ var/burn_heal = 0 /datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M) - if(prob(50)) - M.heal_bodypart_damage(brute_heal,burn_heal, 0) - . = 1 - ..() + if(!HAS_TRAIT(M, TRAIT_NO_PROCESS_FOOD)) + if(prob(50)) + M.heal_bodypart_damage(brute_heal,burn_heal, 0) + . = 1 + ..() /datum/reagent/consumable/nutriment/on_new(list/supplied_data) // taste data can sometimes be ("salt" = 3, "chips" = 1) @@ -157,6 +159,13 @@ taste_description = "sweetness" value = REAGENT_VALUE_NONE +// Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... +/datum/reagent/consumable/sugar/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWeeds(rand(2,3)) + mytray.adjustPests(rand(1,2)) + /datum/reagent/consumable/sugar/overdose_start(mob/living/M) to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!") M.AdjustSleeping(600, FALSE) @@ -174,6 +183,12 @@ color = "#899613" // rgb: 137, 150, 19 taste_description = "watery milk" +// Compost for EVERYTHING +/datum/reagent/consumable/virus_food/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 0.5)) + /datum/reagent/consumable/soysauce name = "Soysauce" description = "A salty sauce made from the soy plant." diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 37010cbbb5..f3d299cce5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -36,6 +36,25 @@ taste_description = "badmins" value = REAGENT_VALUE_GLORIOUS +// The best stuff there is. For testing/debugging. +/datum/reagent/medicine/adminordrazine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustPests(-rand(1,5)) + mytray.adjustWeeds(-rand(1,5)) + if(chems.has_reagent(type, 3)) + switch(rand(100)) + if(66 to 100) + mytray.mutatespecie() + if(33 to 65) + mytray.mutateweed() + if(1 to 32) + mytray.mutatepest(user) + else if(prob(20)) + mytray.visible_message("Nothing happens...") + /datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M) M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) M.setCloneLoss(0, 0) @@ -1168,6 +1187,11 @@ ..() . = 1 +// Antitoxin binds plants pretty well. So the tox goes significantly down +/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2)) + /datum/reagent/medicine/inaprovaline name = "Inaprovaline" description = "Stabilizes the breathing of patients. Good for those in critical condition." @@ -1297,6 +1321,21 @@ pH = 11 value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already. + +//Earthsblood is still a wonderdrug. Just... don't expect to be able to mutate something that makes plants so healthy. +/datum/reagent/medicine/earthsblood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustPests(-rand(1,3)) + mytray.adjustWeeds (-rand(1,3)) + if(myseed) + myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1.3)) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) *1)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) + myseed.adjust_endurance(round(chems.get_reagent_amount(src.type) * 0.5)) + myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.5)) + /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-3 * REM, FALSE) M.adjustFireLoss(-3 * REM, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 86f8b341d9..418062ce92 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -13,6 +13,12 @@ shot_glass_icon_state = "shotglassred" pH = 7.4 +// FEED ME,SEYMOUR! +/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustPests(rand(2,3)) + /datum/reagent/blood/reaction_mob(mob/living/L, method = TOUCH, reac_volume) if(data && data["viruses"]) for(var/thing in data["viruses"]) @@ -313,6 +319,13 @@ metabolization_rate = 45 * REAGENTS_METABOLISM . = 1 +///For weird backwards situations where water manages to get added to trays nutrients, as opposed to being snowflaked away like usual. +/datum/reagent/water/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + if(chems.has_reagent(src.type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + //You don't belong in this world, monster! + chems.remove_reagent(/datum/reagent/water, chems.get_reagent_amount(src.type)) + /datum/reagent/water/hollowwater name = "Hollow Water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." @@ -329,6 +342,14 @@ glass_desc = "A glass of holy water." pH = 7.5 //God is alkaline + // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits. Also ALSO increases instability. +/datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + if(chems.has_reagent(src.type, 1)) + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.15)) + /datum/reagent/water/holywater/on_mob_metabolize(mob/living/L) . = ..() ADD_TRAIT(L, TRAIT_HOLY, type) @@ -401,6 +422,13 @@ qdel(R) T.Bless() +/datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + mytray.adjustWater(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + if(myseed) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.15)) + /datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke name = "Unholy Water" overdose_threshold = 150 //Same as normal water @@ -973,6 +1001,15 @@ taste_description = "chlorine" pH = 7.4 +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/chlorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 1.5)) + mytray.adjustWater(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjustWeeds(-rand(1,3)) + /datum/reagent/chlorine/on_mob_life(mob/living/carbon/M) M.take_bodypart_damage(1*REM, 0, 0, 0) . = 1 @@ -986,6 +1023,15 @@ taste_description = "acid" pH = 2 +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/fluorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 2)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 2.5)) + mytray.adjustWater(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjustWeeds(-rand(1,4)) + /datum/reagent/fluorine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(1*REM, 0) . = 1 @@ -1037,6 +1083,12 @@ taste_description = "the colour blue and regret" pH = 10 +/datum/reagent/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 1)) + /datum/reagent/radium/on_mob_life(mob/living/carbon/M) M.apply_effect(2*REM/M.metabolism_efficiency,EFFECT_IRRADIATE,0) ..() @@ -1148,6 +1200,14 @@ GG = new/obj/effect/decal/cleanable/greenglow(T) GG.reagents.add_reagent(/datum/reagent/uranium, reac_volume) +//Mutagenic chem side-effects. +/datum/reagent/uranium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.mutation_roll(user) + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(src.type) * 2)) + /datum/reagent/bluespace name = "Bluespace Dust" description = "A dust composed of microscopic bluespace crystals, with minor space-warping properties." @@ -1406,6 +1466,15 @@ taste_description = "mordant" pH = 11.6 +/datum/reagent/ammonia/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + // Ammonia is bad ass. + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.12)) + if(myseed && prob(10)) + myseed.adjust_yield(1) + myseed.adjust_instability(1) + /datum/reagent/diethylamine name = "Diethylamine" description = "A secondary amine, mildly corrosive." @@ -1413,6 +1482,16 @@ taste_description = "iron" pH = 12 +// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. The new trade off is it culls stability. +/datum/reagent/diethylamine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustPests(-rand(1,2)) + if(myseed) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) + myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1)) + /datum/reagent/carbondioxide name = "Carbon Dioxide" reagent_state = GAS @@ -1606,24 +1685,68 @@ /datum/reagent/plantnutriment/eznutriment name = "E-Z-Nutrient" - description = "Cheap and extremely common type of plant nutriment." + description = "Contains electrolytes. It's what plants crave." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 - pH = 2.5 + +/datum/reagent/plantnutriment/eznutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_instability(0.2) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.3)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 0.1)) /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 - pH = 3.5 + +/datum/reagent/plantnutriment/left4zednutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_instability(round(chems.get_reagent_amount(src.type) * 0.2)) /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" - description = "Very potent nutriment that prevents plants from mutating." + description = "Very potent nutriment that slows plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 - pH = 2.5 + +/datum/reagent/plantnutriment/robustharvestnutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_instability(-0.25) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 0.2)) + +/datum/reagent/plantnutriment/endurogrow + name = "Enduro Grow" + description = "A specialized nutriment, which decreases product quantity and potency, but strengthens the plants endurance." + color = "#a06fa7" // RBG: 160, 111, 167 + tox_prob = 15 + +/datum/reagent/plantnutriment/endurogrow/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_potency(-round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_yield(-round(chems.get_reagent_amount(src.type) * 0.075)) + myseed.adjust_endurance(round(chems.get_reagent_amount(src.type) * 0.35)) + +/datum/reagent/plantnutriment/liquidearthquake + name = "Liquid Earthquake" + description = "A specialized nutriment, which increases the plant's production speed, as well as it's susceptibility to weeds." + color = "#912e00" // RBG: 145, 46, 0 + tox_prob = 25 + +/datum/reagent/plantnutriment/liquidearthquake/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) + . = ..() + if(myseed && chems.has_reagent(src.type, 1)) + myseed.adjust_weed_rate(round(chems.get_reagent_amount(src.type) * 0.1)) + myseed.adjust_weed_chance(round(chems.get_reagent_amount(src.type) * 0.3)) + myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.075)) + // GOON OTHERS @@ -1679,6 +1802,13 @@ taste_description = "ash" pH = 6.5 +// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer +/datum/reagent/ash/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjustWeeds(-1) + /datum/reagent/acetone name = "Acetone" description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life." @@ -1799,6 +1929,16 @@ taste_description = "alkali" //who put ACID for NaOH ???? pH = 11.9 +// Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants +/datum/reagent/saltpetre/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + var/salt = chems.get_reagent_amount(src.type) + mytray.adjustHealth(round(salt * 0.18)) + if(myseed) + myseed.adjust_production(-round(salt/10)-prob(salt%10)) + myseed.adjust_potency(round(salt*1)) + /datum/reagent/drying_agent name = "Drying agent" description = "A desiccant. Can be used to dry things." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 07934d9880..0d0a234afc 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -10,6 +10,12 @@ value = REAGENT_VALUE_COMMON //Encouraging people to mix toxins for reasons beyond harming each other or mixing reagents such as pen acid. var/toxpwr = 1.5 +// Are you a bad enough dude to poison your own plants? +/datum/reagent/toxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 2)) + /datum/reagent/toxin/on_mob_life(mob/living/carbon/M) if(toxpwr) M.adjustToxLoss(toxpwr*REM, 0) @@ -54,6 +60,11 @@ C.apply_effect(5,EFFECT_IRRADIATE,0) return ..() +/datum/reagent/toxin/mutagen/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + mytray.mutation_roll(user) + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(1.5) //It is still toxic, mind you, but not to the same degree. + /datum/reagent/toxin/plasma name = "Plasma" description = "Plasma in its liquid form." @@ -245,6 +256,13 @@ pH = 2.7 value = REAGENT_VALUE_NONE +/datum/reagent/toxin/plantbgone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 10)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 6)) + mytray.adjustWeeds(-rand(4,8)) + /datum/reagent/toxin/plantbgone/reaction_obj(obj/O, reac_volume) if(istype(O, /obj/structure/alien/weeds)) var/obj/structure/alien/weeds/alien_weeds = O @@ -270,6 +288,14 @@ pH = 3 value = REAGENT_VALUE_NONE +//Weed Spray +/datum/reagent/toxin/plantbgone/weedkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray) + return + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 0.5)) + mytray.adjustWeeds(-rand(1,2)) + /datum/reagent/toxin/pestkiller name = "Pest Killer" description = "A harmful toxic mixture to kill pests. Do not ingest!" @@ -278,6 +304,14 @@ pH = 3.2 value = REAGENT_VALUE_NONE +//Pest Spray +/datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + if(!mytray) + return + if(chems.has_reagent(type, 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustPests(-rand(1,2)) + /datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume) ..() if(M.mob_biotypes & MOB_BUG) @@ -838,6 +872,14 @@ pH = 2.75 value = REAGENT_VALUE_NONE +// Sure, go ahead and pour acid on your precious plants. What's the worst that could happen? +/datum/reagent/toxin/acid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 1)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 1.5)) + mytray.adjustWeeds(-rand(1,2)) + /datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) if(!istype(C)) return @@ -870,6 +912,14 @@ acidpwr = 42.0 value = REAGENT_VALUE_COMMON +// ACID II: UNHEEDED WARNINGS +/datum/reagent/toxin/acid/fluacid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 2)) + mytray.adjustToxic(round(chems.get_reagent_amount(type) * 3)) + mytray.adjustWeeds(-rand(1,4)) + /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(current_cycle/10, 0) . = 1 diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index 2cf9df6d50..bdaf39732f 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -77,6 +77,22 @@ make_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 10) category = list("initial","Botany Chemicals") +/datum/design/end_gro + name = "30u Enduro Grow" + id = "end_gro" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 30) + make_reagents = list(/datum/reagent/plantnutriment/endurogrow = 30) + category = list("initial","Botany Chemicals") + +/datum/design/liq_earth + name = "30u Liquid Earthquake" + id = "liq_earth" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass= 30) + make_reagents = list(/datum/reagent/plantnutriment/liquidearthquake = 30) + category = list("initial","Botany Chemicals") + /datum/design/weed_killer name = "Weed Killer" id = "weed_killer" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 773415b15c..421c3bccca 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -71,6 +71,8 @@ var/medium_burn_msg = "blistered" var/heavy_burn_msg = "peeling away" + var/render_like_organic = FALSE // forces limb to render as if it were an organic limb + /// The wounds currently afflicting this body part var/list/wounds @@ -555,7 +557,7 @@ if(status == BODYPART_ORGANIC) icon = base_bp_icon || DEFAULT_BODYPART_ICON_ORGANIC else if(status == BODYPART_ROBOTIC) - icon = DEFAULT_BODYPART_ICON_ROBOTIC + icon = base_bp_icon || DEFAULT_BODYPART_ICON_ROBOTIC if(owner) owner.updatehealth() @@ -669,8 +671,9 @@ if(status == BODYPART_ROBOTIC) dmg_overlay_type = "robotic" - body_markings = null - aux_marking = null + if(!render_like_organic) + body_markings = null + aux_marking = null if(dropping_limb) no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner. @@ -736,7 +739,7 @@ if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST)) should_draw_gender = FALSE - if(is_organic_limb()) + if(is_organic_limb() || render_like_organic) limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi' if(should_draw_gender) limb.icon_state = "[species_id]_[body_zone]_[icon_gender]" diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index afaa66dae9..239bd8a98d 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -10,7 +10,7 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_HEAD) - requires_bodypart_type = 0 + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery_step/fix_brain name = "fix brain" implements = list(TOOL_HEMOSTAT = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index d1d478ddfe..69f5062032 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -3,6 +3,7 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise_heart, /datum/surgery_step/coronary_bypass, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target, obj/item/tool) var/obj/item/organ/heart/H = target.getorganslot(ORGAN_SLOT_HEART) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 87e6d096b3..57803f7461 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -2,6 +2,7 @@ name = "dental implant" steps = list(/datum/surgery_step/drill, /datum/surgery_step/insert_pill) possible_locs = list(BODY_ZONE_PRECISE_MOUTH) + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery_step/insert_pill name = "insert pill" diff --git a/code/modules/surgery/embalming.dm b/code/modules/surgery/embalming.dm index c6d2c72caa..a4494c606a 100644 --- a/code/modules/surgery/embalming.dm +++ b/code/modules/surgery/embalming.dm @@ -7,7 +7,7 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST) - requires_bodypart_type = 0 + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery_step/embalming name = "embalming body" diff --git a/code/modules/surgery/emergency_cardioversion_recovery.dm b/code/modules/surgery/emergency_cardioversion_recovery.dm index 5df90c5e80..2508bf135f 100644 --- a/code/modules/surgery/emergency_cardioversion_recovery.dm +++ b/code/modules/surgery/emergency_cardioversion_recovery.dm @@ -3,6 +3,7 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise_heart, /datum/surgery_step/ventricular_electrotherapy, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery_step/ventricular_electrotherapy name = "ventricular electrotherapy" diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 006dbe2af1..c26fda4158 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -3,7 +3,8 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_PRECISE_EYES) - requires_bodypart_type = 0 + requires_bodypart_type = BODYPART_ORGANIC + //fix eyes /datum/surgery_step/fix_eyes name = "fix eyes" diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 0680dda404..f5b23e6087 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -8,7 +8,7 @@ target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST) - requires_bodypart_type = FALSE + requires_bodypart_type = BODYPART_ORGANIC replaced_by = /datum/surgery ignore_clothes = TRUE var/healing_step_type diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 5a0fd819f1..ecdc5477f1 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -2,10 +2,13 @@ name = "Lipoplasty" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ORGANIC + /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target, obj/item/tool) if(HAS_TRAIT(target, TRAIT_FAT)) return 1 return 0 + //cut fat /datum/surgery_step/cut_fat name = "cut excess fat" diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 7ef7e4cd7f..34b40258c8 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -3,6 +3,7 @@ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/lobectomy, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ORGANIC /datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target, obj/item/tool) var/obj/item/organ/lungs/L = target.getorganslot(ORGAN_SLOT_LUNGS) diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 9366e585c3..101be7f103 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -85,3 +85,107 @@ display_results(user, target, "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...", "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].", "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].") + +//cut wires +/datum/surgery_step/cut_wires + name = "cut wires" + implements = list( + TOOL_WIRECUTTER = 100, + TOOL_SCALPEL = 75, + /obj/item/kitchen/knife = 50, + /obj/item = 10) // 10% success with any sharp item. + time = 24 + +/datum/surgery_step/cut_wires/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to cut loose wires in [target]'s [parse_zone(target_zone)]...", + "[user] begins to cut loose wires in [target]'s [parse_zone(target_zone)].", + "[user] begins to cut loose wires in [target]'s [parse_zone(target_zone)].") + +/datum/surgery_step/cut_wires/tool_check(mob/user, obj/item/tool) + if(implement_type == /obj/item && !tool.get_sharpness()) + return FALSE + return TRUE + +//pry off plating +/datum/surgery_step/pry_off_plating + name = "pry off plating" + implements = list( + TOOL_CROWBAR = 100, + TOOL_HEMOSTAT = 10) + time = 24 + +/datum/surgery_step/pry_off_plating/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + do_sparks(rand(5, 9), FALSE, target.loc) + return TRUE + +/datum/surgery_step/pry_off_plating/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to pry off [target]'s [parse_zone(target_zone)] plating...", + "[user] begins to pry off [target]'s [parse_zone(target_zone)] plating.", + "[user] begins to pry off [target]'s [parse_zone(target_zone)] plating.") + +//weld plating +/datum/surgery_step/weld_plating + name = "weld plating" + implements = list( + TOOL_WELDER = 100) + time = 24 + +/datum/surgery_step/weld_plating/tool_check(mob/user, obj/item/tool) + if(implement_type == TOOL_WELDER && !tool.use_tool(user, user, 0, volume=50, amount=1)) + return FALSE + return TRUE + +/datum/surgery_step/weld_plating/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to weld [target]'s [parse_zone(target_zone)] plating...", + "[user] begins to weld [target]'s [parse_zone(target_zone)] plating.", + "[user] begins to weld [target]'s [parse_zone(target_zone)] plating.") + +//replace wires +/datum/surgery_step/replace_wires + name = "replace wires" + implements = list(/obj/item/stack/cable_coil = 100) + time = 24 + var/cableamount = 5 + +/datum/surgery_step/replace_wires/tool_check(mob/user, obj/item/tool) + var/obj/item/stack/cable_coil/coil = tool + if(coil.get_amount() < cableamount) + to_chat(user, "Not enough cable!") + return FALSE + return TRUE + +/datum/surgery_step/replace_wires/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/stack/cable_coil/coil = tool + if(coil && !(coil.get_amount()You begin to replace [target]'s [parse_zone(target_zone)] wiring...", + "[user] begins to replace [target]'s [parse_zone(target_zone)] wiring.", + "[user] begins to replace [target]'s [parse_zone(target_zone)] wiring.") + +//add plating +/datum/surgery_step/add_plating + name = "add plating" + implements = list(/obj/item/stack/sheet/metal = 100) + time = 24 + var/metalamount = 5 + +/datum/surgery_step/add_plating/tool_check(mob/user, obj/item/tool) + var/obj/item/stack/sheet/metal/plat = tool + if(plat.get_amount() < metalamount) + to_chat(user, "Not enough metal!") + return FALSE + return TRUE + +/datum/surgery_step/add_plating/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/stack/sheet/metal/plat = tool + if(plat && !(plat.get_amount()You begin to add plating to [target]'s [parse_zone(target_zone)]...", + "[user] begins to add plating to [target]'s [parse_zone(target_zone)].", + "[user] begins to add plating to [target]'s [parse_zone(target_zone)].") \ No newline at end of file diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 4ce51ae119..85b400d2da 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -2,6 +2,7 @@ name = "organ manipulation" target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) + requires_bodypart_type = BODYPART_ORGANIC requires_real_bodypart = 1 steps = list( /datum/surgery_step/incise, diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index b42770723b..e3c32ad009 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -306,3 +306,69 @@ var/obj/item/assembly/flash/armimplant/F = new(src) items_list += F F.I = src + +///////////////// + + +//IPC/Synth Arm// + + +///////////////// + +/obj/item/organ/cyberimp/arm/power_cord + name = "power cord implant" + desc = "An internal power cord hooked up to a battery. Useful if you run on volts." + contents = newlist(/obj/item/apc_powercord) + zone = "l_arm" + +/obj/item/apc_powercord + name = "power cord" + desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.DelayNextAction(CLICK_CD_MELEE) + var/obj/machinery/power/apc/A = target + var/mob/living/carbon/human/H = user + var/obj/item/organ/stomach/ipc/cell = locate(/obj/item/organ/stomach/ipc) in H.internal_organs + if(!cell) + to_chat(H, "You try to siphon energy from the [A], but your power cell is gone!") + return + + if(A.cell && A.cell.charge > 0) + if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) + to_chat(user, "You are already fully charged!") + return + else + powerdraw_loop(A, H) + return + + to_chat(user, "There is no charge to draw from that APC.") + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") + while(do_after(H, 10, target = A)) + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "The [A] doesn't have enough charge to spare.") + break + A.charging = 1 + if(A.cell.charge >= 500) + do_sparks(1, FALSE, A) + H.nutrition += 50 + A.cell.charge -= 150 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off as much as the [A] can spare.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 7b55b842dc..3787d4e781 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -131,4 +131,31 @@ . = ..() if(. & EMP_PROTECT_SELF) return - damage += 0.5 * severity + damage += 0.15 * severity + +/obj/item/organ/ears/ipc + name = "auditory sensors" + icon_state = "ears-c" + desc = "A pair of microphones intended to be installed in an IPC head, that grant the ability to hear." + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EARS + gender = PLURAL + organ_flags = ORGAN_SYNTHETIC + +/obj/item/organ/ears/ipc/emp_act(severity) + . = ..() + if(!owner || . & EMP_PROTECT_SELF) + return + to_chat(owner, "Alert: Auditory systems corrupted!.") + switch(severity) + if(1) + owner.Jitter(30) + owner.Dizzy(30) + owner.DefaultCombatKnockdown(80) + deaf = 30 + + if(2) + owner.Jitter(15) + owner.Dizzy(15) + owner.DefaultCombatKnockdown(40) + damage += 0.15 * severity diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 7c28be6883..efceefc131 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -421,6 +421,15 @@ name = "ipc eyes" icon_state = "cybernetic_eyeballs" +/obj/item/organ/eyes/ipc/emp_act(severity) + . = ..() + if(!owner || . & EMP_PROTECT_SELF) + return + to_chat(owner, "Alert: Perception visuals damaged!") + owner.flash_act(visual = 1) + if(severity >= 70) + owner.adjustOrganLoss(ORGAN_SLOT_EYES, 20) + #undef BLURRY_VISION_ONE #undef BLURRY_VISION_TWO #undef BLIND_VISION_THREE diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 2e210bd6e4..953c8b2c1b 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -521,9 +521,20 @@ failed = FALSE /obj/item/organ/lungs/ipc - name = "ipc lungs" + name = "ipc cooling system" icon_state = "lungs-c" +/obj/item/organ/lungs/ipc/emp_act(severity) //Should probably put it somewhere else later + . = ..() + if(. & EMP_PROTECT_SELF) + return + to_chat(owner, "Alert: Critical cooling system failure!") + switch(severity) + if(1) + owner.adjust_bodytemperature(100*TEMPERATURE_DAMAGE_COEFFICIENT) + if(2) + owner.adjust_bodytemperature(30*TEMPERATURE_DAMAGE_COEFFICIENT) + /obj/item/organ/lungs/plasmaman name = "plasma filter" desc = "A spongy rib-shaped mass for filtering plasma from the air." diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm old mode 100755 new mode 100644 index 44b4f6362a..cabe49db25 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -89,9 +89,20 @@ desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." /obj/item/organ/stomach/ipc - name = "ipc stomach" + name = "ipc cell" icon_state = "stomach-ipc" +/obj/item/organ/stomach/ipc/emp_act(severity) + . = ..() + if(!owner || . & EMP_PROTECT_SELF) + return + switch(severity) + if(1) + owner.nutrition = min(owner.nutrition - 50, 0) + to_chat(owner, "Alert: Detected severe battery discharge!") + if(2) + owner.nutrition = min(owner.nutrition - 100, 0) + to_chat(owner, "Alert: Minor battery discharge!") /obj/item/organ/stomach/ethereal name = "biological battery" diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index c4e056583c..d3597ba516 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -2,6 +2,8 @@ name = "Plastic surgery" steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_HEAD) + requires_bodypart_type = BODYPART_ORGANIC + //reshape_face /datum/surgery_step/reshape_face name = "reshape face" diff --git a/code/modules/surgery/robot_brain_surgery.dm b/code/modules/surgery/robot_brain_surgery.dm new file mode 100644 index 0000000000..5feca7382f --- /dev/null +++ b/code/modules/surgery/robot_brain_surgery.dm @@ -0,0 +1,51 @@ +/datum/surgery/robot_brain_surgery + name = "Reset posibrain logic (Brain surgery)" + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/mechanic_unwrench, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/prepare_electronics, + /datum/surgery_step/fix_robot_brain, + /datum/surgery_step/mechanic_close) + + target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list(BODY_ZONE_HEAD) + requires_bodypart_type = BODYPART_ROBOTIC + desc = "A surgical procedure that restores the default behavior logic and personality matrix of an IPC posibrain." + +/datum/surgery_step/fix_robot_brain + name = "fix posibrain (multitool)" + implements = list(TOOL_MULTITOOL = 100, TOOL_HEMOSTAT = 35, TOOL_SCREWDRIVER = 15) + time = 120 //long and complicated + +/datum/surgery/robot_brain_surgery/can_start(mob/user, mob/living/carbon/target, obj/item/tool) + var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!B) + return FALSE + return TRUE + +/datum/surgery_step/fix_robot_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You begin to fix [target]'s posibrain...", + "[user] begins to fix [target]'s posibrain.", + "[user] begins to perform surgery on [target]'s posibrain.") + +/datum/surgery_step/fix_robot_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You succeed in fixing [target]'s posibrain.", + "[user] successfully fixes [target]'s posibrain!", + "[user] completes the surgery on [target]'s posibrain.") + if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) + target.mind.remove_antag_datum(/datum/antagonist/brainwashed) + target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 60) //we set damage in this case in order to clear the "failing" flag + target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) //Lobotomy tier fix cause you can't clone this! + return TRUE + +/datum/surgery_step/fix_robot_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(target.getorganslot(ORGAN_SLOT_BRAIN)) + display_results(user, target, "You screw up, causing more damage!", + "[user] screws up, causing damage to the circuits!", + "[user] completes the surgery on [target]'s posibrain.") + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) + target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) + else + user.visible_message("[user] suddenly notices that the posibrain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the posibrain you were working on is not there anymore.") + return FALSE diff --git a/code/modules/surgery/robot_healing.dm b/code/modules/surgery/robot_healing.dm new file mode 100644 index 0000000000..6355410a79 --- /dev/null +++ b/code/modules/surgery/robot_healing.dm @@ -0,0 +1,125 @@ +//Almost copypaste of tend wounds, with some changes + +/datum/surgery/robot_healing + name = "Repair robotic limbs (basic)" + desc = "A surgical procedure that provides repairs and maintenance to robotic limbs. Is slightly more efficient when the patient is severely damaged." + + steps = list(/datum/surgery_step/mechanic_open, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/cut_wires, + /datum/surgery_step/robot_heal, + /datum/surgery_step/mechanic_close) + + target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = BODYPART_ROBOTIC + ignore_clothes = TRUE + var/antispam = FALSE + var/healing_step_type = /datum/surgery_step/robot_heal/basic + +/datum/surgery/robot_healing/New(surgery_target, surgery_location, surgery_bodypart) + ..() + if(healing_step_type) + steps = list(/datum/surgery_step/mechanic_open, + /datum/surgery_step/pry_off_plating, + /datum/surgery_step/cut_wires, + healing_step_type, + /datum/surgery_step/mechanic_close) + +/datum/surgery_step/robot_heal + name = "repair body (welder/cable)" + implements = list(TOOL_WELDER = 100, /obj/item/stack/cable_coil = 100) + repeatable = TRUE + time = 15 + var/healsbrute = FALSE + var/healsburn = FALSE + var/brutehealing = 0 + var/burnhealing = 0 + var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! + +/datum/surgery_step/robot_heal/tool_check(mob/user, obj/item/tool) + if(implement_type == TOOL_WELDER && !tool.tool_use_check(user, 1)) + return FALSE + return TRUE + +/datum/surgery_step/robot_heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/woundtype + if(implement_type == TOOL_WELDER) + healsbrute = TRUE + healsburn = FALSE + woundtype = "dents" + else + healsbrute = FALSE + healsburn = TRUE + woundtype = "wiring" + + if(istype(surgery,/datum/surgery/robot_healing)) + var/datum/surgery/robot_healing/the_surgery = surgery + if(!the_surgery.antispam) + display_results(user, target, "You attempt to fix some of [target]'s [woundtype].", + "[user] attempts to fix some of [target]'s [woundtype].", + "[user] attempts to fix some of [target]'s [woundtype].") + +/datum/surgery_step/robot_heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) + if(..()) + while((healsbrute && target.getBruteLoss() && tool.tool_use_check(user,1)) || (healsburn && target.getFireLoss() && tool)) + if(!..()) + break + +/datum/surgery_step/robot_heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/umsg = "You succeed in fixing some of [target]'s damage" //no period, add initial space to "addons" + var/tmsg = "[user] fixes some of [target]'s damage" //see above + var/urhealedamt_brute = 0 + if(healsbrute) + urhealedamt_brute = brutehealing + tool.use_tool(target, user, 0, volume=50, amount=1) + var/urhealedamt_burn = 0 + if(healsburn) + urhealedamt_burn = burnhealing + if(tool) + tool.use(1) + if(missinghpbonus) + if(target.stat != DEAD) + urhealedamt_brute += round((target.getBruteLoss()/ missinghpbonus),0.1) + urhealedamt_burn += round((target.getFireLoss()/ missinghpbonus),0.1) + else //less healing bonus for the dead since they're expected to have lots of damage to begin with (to make TW into defib not TOO simple) + urhealedamt_brute += round((target.getBruteLoss()/ (missinghpbonus*5)),0.1) + urhealedamt_burn += round((target.getFireLoss()/ (missinghpbonus*5)),0.1) + if(!get_location_accessible(target, target_zone)) + urhealedamt_brute *= 0.55 + urhealedamt_burn *= 0.55 + umsg += " as best as you can while they have clothing on" + tmsg += " as best as they can while [target] has clothing on" + target.heal_bodypart_damage(urhealedamt_brute,urhealedamt_burn, only_organic = FALSE, only_robotic = TRUE) + display_results(user, target, "[umsg].", + "[tmsg].", + "[tmsg].") + if(istype(surgery, /datum/surgery/robot_healing)) + var/datum/surgery/robot_healing/the_surgery = surgery + the_surgery.antispam = TRUE + return TRUE + +/datum/surgery_step/robot_heal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You screwed up!", + "[user] screws up!", + "[user] fixes some of [target]'s damage.", TRUE) + var/urdamageamt_brute = 0 + if(healsbrute) + urdamageamt_brute = brutehealing * 0.8 + var/urdamageamt_burn = 0 + if(healsburn) + urdamageamt_burn = burnhealing * 0.8 + if(missinghpbonus) + urdamageamt_brute += round((target.getBruteLoss()/ (missinghpbonus*2)),0.1) + urdamageamt_burn += round((target.getFireLoss()/ (missinghpbonus*2)),0.1) + + target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn) + return FALSE + +/***************************STEPS***************************/ + +/datum/surgery_step/robot_heal/basic + name = "repair damage" + brutehealing = 10 + burnhealing = 10 + missinghpbonus = 15 \ No newline at end of file diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index bc824cc994..14cdd30931 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -29,6 +29,16 @@ /obj/item/clothing/glasses/monocle =1, /obj/item/clothing/head/bowler = 1, /obj/item/cane = 1, + /obj/item/clothing/under/rank/civilian/victorian_redsleeves = 1, + /obj/item/clothing/under/rank/civilian/victorian_redvest = 1, + /obj/item/clothing/under/rank/civilian/victorian_vest = 1, + /obj/item/clothing/under/rank/civilian/victorian_purple = 1, + /obj/item/clothing/suit/tailcoat = 1, + /obj/item/clothing/under/rank/civilian/victorianreddress = 1, + /obj/item/clothing/suit/vickyred = 1, + /obj/item/clothing/under/rank/civilian/victorianblackdress = 1, + /obj/item/clothing/suit/vickyblack =1, + /obj/item/clothing/under/rank/civilian/dutch = 2, /obj/item/clothing/under/suit/sl = 1, /obj/item/clothing/mask/fakemoustache = 1, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 7005a0b02f..bd821d80e3 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,6 +21,11 @@ /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, /obj/item/clothing/suit/hooded/cloak/david = 4, + /obj/item/clothing/suit/bomber = 5, + /obj/item/clothing/under/suit/turtle/teal = 3, + /obj/item/clothing/under/suit/turtle/grey = 3, + /obj/item/clothing/under/rank/civilian/util = 5, + /obj/item/clothing/under/rank/civilian/util/greyshirt = 5, /obj/item/clothing/under/suit/navy = 3, /obj/item/clothing/under/suit/black_really = 3, /obj/item/clothing/under/suit/burgundy = 3, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e408414254..e15e02f0d5 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -27,7 +27,10 @@ /obj/item/clothing/mask/bandana/red = 5, /obj/item/clothing/under/rank/security/officer/skirt = 5, /obj/item/clothing/under/rank/security/officer/grey = 5, - /obj/item/clothing/under/pants/khaki = 5) + /obj/item/clothing/under/pants/khaki = 5, + /obj/item/clothing/suit/toggle/labcoat/depjacket/sec = 5, + /obj/item/clothing/under/rank/security/officer/util = 5, + /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp = 5) premium = list(/obj/item/clothing/under/rank/security/officer/formal = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5) refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe @@ -39,6 +42,44 @@ /obj/item/vending_refill/wardrobe/sec_wardrobe machine_name = "SecDrobe" + +/obj/machinery/vending/wardrobe/det_wardrobe + name = "\improper DetDrobe" + desc = "A machine for all your detective needs, as long as you need clothes." + icon_state = "detdrobe" + product_ads = "Apply your brilliant deductive methods in style!" + vend_reply = "Thank you for using the DetDrobe!" + products = list(/obj/item/clothing/under/rank/security/detective = 2, + /obj/item/clothing/under/rank/security/detective/skirt = 2, + /obj/item/clothing/under/rank/security/detective/brown = 2, + /obj/item/clothing/under/rank/security/detective/brown/brown2 = 2, + /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/detcorp = 2, + /obj/item/clothing/under/rank/security/officer/util = 2, + /obj/item/clothing/shoes/sneakers/brown = 2, + /obj/item/clothing/suit/det_suit = 2, + /obj/item/clothing/head/fedora/det_hat = 2, + /obj/item/clothing/under/rank/security/detective/grey = 2, + /obj/item/clothing/under/rank/security/detective/grey/skirt = 2, + /obj/item/clothing/accessory/waistcoat = 2, + /obj/item/clothing/shoes/laceup = 2, + /obj/item/clothing/suit/det_suit/grey = 1, + /obj/item/clothing/suit/det_suit/forensicsred = 1, + /obj/item/clothing/suit/det_suit/forensicsred/long = 1, + /obj/item/clothing/suit/det_suit/forensicsblue = 1, + /obj/item/clothing/suit/det_suit/forensicsblue/long = 1, + /obj/item/clothing/head/fedora = 2, + /obj/item/clothing/gloves/color/black = 2, + /obj/item/clothing/gloves/color/latex = 2, + /obj/item/reagent_containers/food/drinks/flask/det = 2, + /obj/item/storage/fancy/cigarettes = 5) + premium = list(/obj/item/clothing/head/flatcap = 1) + refill_canister = /obj/item/vending_refill/wardrobe/det_wardrobe + extra_price = 350 + payment_department = ACCOUNT_SEC + +/obj/item/vending_refill/wardrobe/det_wardrobe + machine_name = "DetDrobe" + /obj/machinery/vending/wardrobe/medi_wardrobe name = "\improper MediDrobe" desc = "A vending machine rumoured to be capable of dispensing clothing for medical personnel." @@ -66,10 +107,15 @@ /obj/item/clothing/suit/toggle/labcoat = 5, /obj/item/clothing/suit/toggle/labcoat/paramedic = 5, /obj/item/clothing/suit/toggle/labcoat/emt = 5, + /obj/item/clothing/suit/toggle/labcoat/depjacket/med = 5, /obj/item/clothing/shoes/sneakers/white = 5, /obj/item/clothing/head/soft/emt = 5, /obj/item/clothing/suit/apron/surgical = 5, - /obj/item/clothing/mask/surgical = 5) + /obj/item/clothing/mask/surgical = 5, + /obj/item/clothing/under/rank/medical/doctor/util = 5, + /obj/item/clothing/under/rank/medical/paramedic/red = 5, + /obj/item/clothing/suit/toggle/labcoat/emt/red = 5, + /obj/item/clothing/suit/toggle/labcoat/emt/highvis = 5) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -94,6 +140,9 @@ /obj/item/clothing/under/rank/engineering/engineer/hazard = 5, /obj/item/clothing/under/rank/engineering/engineer/hazard/green = 5, /obj/item/clothing/under/rank/engineering/engineer/hazard/white = 5, + /obj/item/clothing/suit/toggle/labcoat/depjacket/eng = 5, + /obj/item/clothing/under/rank/engineering/engineer/util = 5, + /obj/item/clothing/under/rank/engineering/engineer/mechanic = 5, /obj/item/clothing/suit/hazardvest = 5, /obj/item/clothing/shoes/workboots = 5, /obj/item/clothing/head/hardhat = 5, @@ -137,6 +186,8 @@ products = list(/obj/item/clothing/suit/hooded/wintercoat/cargo = 3, /obj/item/clothing/under/rank/cargo/tech = 5, /obj/item/clothing/under/rank/cargo/tech/skirt = 5, + /obj/item/clothing/under/rank/cargo/util = 5, + /obj/item/clothing/suit/toggle/labcoat/depjacket/sup = 5, /obj/item/clothing/under/rank/cargo/tech/long = 5, /obj/item/clothing/shoes/sneakers/black = 5, /obj/item/clothing/gloves/fingerless = 5, @@ -158,6 +209,7 @@ products = list(/obj/item/clothing/glasses/hud/diagnostic = 3, /obj/item/clothing/head/beret/robo = 3, /obj/item/clothing/under/rank/rnd/roboticist = 3, + /obj/item/clothing/under/rank/rnd/roboticist/sleek = 3, /obj/item/clothing/under/rank/rnd/roboticist/skirt = 3, /obj/item/clothing/suit/hooded/wintercoat/robotics = 3, /obj/item/clothing/suit/toggle/labcoat = 3, @@ -188,8 +240,10 @@ /obj/item/storage/backpack/satchel/tox = 3, /obj/item/clothing/suit/hooded/wintercoat/science = 3, /obj/item/clothing/under/rank/rnd/scientist = 4, + /obj/item/clothing/under/rank/rnd/scientist/util = 4, /obj/item/clothing/under/rank/rnd/scientist/skirt = 4, /obj/item/clothing/suit/toggle/labcoat/science = 4, + /obj/item/clothing/suit/toggle/labcoat/depjacket/sci = 4, /obj/item/clothing/shoes/sneakers/white = 4, /obj/item/radio/headset/headset_sci = 4, /obj/item/clothing/mask/gas = 5) @@ -478,6 +532,7 @@ /obj/item/clothing/neck/cloak/cap = 1, /obj/item/clothing/shoes/sneakers/brown = 2, /obj/item/clothing/under/rank/captain = 1, + /obj/item/clothing/under/rank/captain/util = 1, /obj/item/clothing/under/rank/captain/skirt = 1, /obj/item/clothing/head/caphat = 1, /obj/item/clothing/head/caphat/parade = 1, diff --git a/html/changelogs/AutoChangeLog-pr-12439.yml b/html/changelogs/AutoChangeLog-pr-12439.yml new file mode 100644 index 0000000000..0089e07129 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12439.yml @@ -0,0 +1,6 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "ipcs and synthlizards are now treated as actual robots, with robotic limbs, an extra organ, and better emp acts" + - rscadd: "surgeries for healing robotic limbs, and brain surgery for robotic heads" + - bugfix: "androids limbs now show up as intended" diff --git a/html/changelogs/AutoChangeLog-pr-13314.yml b/html/changelogs/AutoChangeLog-pr-13314.yml new file mode 100644 index 0000000000..86316680b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13314.yml @@ -0,0 +1,8 @@ +author: "ArcaneMusic, with minor tweaks by TheObserver-sys" +delete-after: True +changes: + - rscadd: "Adds and modifies fertilizers, as well as a new stat, Instability." + - rscdel: "Removes the rather disused functionality of irrigation hoses, temporarily disables circuit use on hydroponics trays." + - tweak: "Plant Analyzer have been upgraded. Using one in hand will now switch between a stat view of your plant, and a chemical view of your plant. +tweak:Trays now accept and store reagents, as well as coming with an autogrow mode. However, these upgrades came at the cost of old self sufficiency, meaning you must attend to your plants a bit more often." + - tweak: "Earthsblood, while not being able to gild trays anymore, has been found to still be quite powerful as a fertilizer." diff --git a/html/changelogs/AutoChangeLog-pr-13471.yml b/html/changelogs/AutoChangeLog-pr-13471.yml new file mode 100644 index 0000000000..7f365aeb27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13471.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "ratvar gf is complete" diff --git a/html/changelogs/AutoChangeLog-pr-13475.yml b/html/changelogs/AutoChangeLog-pr-13475.yml new file mode 100644 index 0000000000..45c6b4be8f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13475.yml @@ -0,0 +1,5 @@ +author: "Detective-Google" +delete-after: True +changes: + - rscadd: "a smattering of clothes from the RP server" + - rscadd: "detective wardrobe" diff --git a/html/changelogs/AutoChangeLog-pr-13486.yml b/html/changelogs/AutoChangeLog-pr-13486.yml new file mode 100644 index 0000000000..9efbdf764e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13486.yml @@ -0,0 +1,4 @@ +author: "CoreFlare" +delete-after: True +changes: + - rscadd: "Altcloaks! Available in loadout." diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index c13b6a50bc..743ed03f48 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 2b28d06976..67d1849ef6 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 7bfecb4158..276b5c9458 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index 6a6233c251..d4bb1224cc 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi index 5f0c48e4e3..ffbb8b8b5b 100644 Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 7d13e3f802..510adc97b4 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index 6f4de62cc0..cc5f4f3392 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index f23cdaee46..d3e4c0f7e9 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index e8b70489af..c12720bc8b 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 609ed056e8..a566a05591 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 8db1156dea..454138a254 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index b11e43d665..d8f5c1d334 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index 19311f703a..c7eff6ce78 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -86,3 +86,7 @@ /datum/gear/neck/polycloak name = "Polychromatic Cloak" path = /obj/item/clothing/neck/cloak/polychromic + +/datum/gear/neck/altpolycloak + name = "Alternate Cloak" + path = /obj/item/clothing/neck/cloak/alt/polychromic diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 7e926ea8c3..45d8fc1ef1 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -211,6 +211,14 @@ name = "Keyhole Sweater" path = /obj/item/clothing/under/misc/keyholesweater +/datum/gear/uniform/tealturtle + name = "Teal Turtleneck" + path = /obj/item/clothing/under/suit/turtle/teal + +/datum/gear/uniform/greyturtle + name = "Grey Turtleneck" + path = /obj/item/clothing/under/suit/turtle/grey + /datum/gear/uniform/polyjump name = "Polychromic Jumpsuit" path = /obj/item/clothing/under/misc/polyjumpsuit @@ -246,6 +254,127 @@ path = /obj/item/clothing/under/shorts/polychromic cost = 2 +/datum/gear/uniform/hopcasual + name = "Casual Head of Personnel's uniform" + path = /obj/item/clothing/under/rank/civilian/head_of_personnel/whimsy + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Head of Personnel" + restricted_roles = list("Head of Personnel") + +/datum/gear/uniform/robosleek + name = "Sleek roboticist's jumpsuit" + path = /obj/item/clothing/under/rank/rnd/roboticist/sleek + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Roboticist" + restricted_roles = list("Roboticist") + +/datum/gear/uniform/seccorp + name = "Corporate Security Uniform" + path = /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Security Officer" + restricted_roles = list("Security Officer") + +/datum/gear/uniform/wardencorp + name = "Corporate Warden's Uniform" + path = /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/wardencorp + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Warden" + restricted_roles = list("Warden") + +/datum/gear/uniform/hoscorp + name = "Corporate Head of Security's Uniform" + path = /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/hoscorp + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Head Of Security" + restricted_roles = list("Head Of Security") + +/datum/gear/uniform/detcorp + name = "Corporate Detective's Uniform" + path = /obj/item/clothing/under/rank/security/officer/blueshirt/seccorp/detcorp + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Detective" + restricted_roles = list("Detective") + +/datum/gear/uniform/detbrown + name = "Brown Worn Suit" + path = /obj/item/clothing/under/rank/security/detective/brown + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Detective" + restricted_roles = list("Detective") + +/datum/gear/uniform/detbrown/detbrown2 + name = "Padded Worn Suit" + path = /obj/item/clothing/under/rank/security/detective/brown/brown2 + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Detective" + restricted_roles = list("Detective") + + +// Grey utility + +/datum/gear/uniform/grey + name = "Grey Uniform" + path = /obj/item/clothing/under/rank/civilian/util/greyshirt + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_GENERAL + +/datum/gear/uniform/grey/util + name = "Grey Utility Uniform" + path = /obj/item/clothing/under/rank/civilian/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_GENERAL + +/datum/gear/uniform/grey/sec + name = "Security Utility Uniform" + path = /obj/item/clothing/under/rank/security/officer/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Security" + restricted_roles = list("Detective", "Security Officer", "Warden", "Head of Security") + +/datum/gear/uniform/grey/sci + name = "Science Utility Uniform" + path = /obj/item/clothing/under/rank/rnd/scientist/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Science" + restricted_roles = list("Scientist", "Roboticist", "Research Director", "Geneticist") + +/datum/gear/uniform/grey/med + name = "Medical Utility Uniform" + path = /obj/item/clothing/under/rank/medical/doctor/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Medical" + restricted_roles = list("Medical Doctor", "Virologist", "Chemist", "Geneticist", "Paramedic") + +/datum/gear/uniform/grey/eng + name = "Engineering Utility Uniform" + path = /obj/item/clothing/under/rank/engineering/engineer/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Engineering" + restricted_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer") + +/datum/gear/uniform/grey/supply + name = "Supply Utility Uniform" + path = /obj/item/clothing/under/rank/cargo/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Supply" + restricted_roles = list("Shaft Miner", "Cargo Technician", "Quartermaster") + +/datum/gear/uniform/grey/com + name = "Command Utility Uniform" + path = /obj/item/clothing/under/rank/captain/util + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + restricted_desc = "Command" + restricted_roles = list("Quartermaster", "Research Director", "Chief Medical Officer", "Head Of Security", "Head Of Personnel", "Captain") + +/datum/gear/uniform/grey/eng/mech + name = "Mechanic's Uniform" + path = /obj/item/clothing/under/rank/engineering/engineer/mechanic + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + +/datum/gear/unifrom/grey/med/red + name = "Red Paramedic's Uniform" + path = /obj/item/clothing/under/rank/medical/paramedic/red + subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS + // Trekie things //TOS /datum/gear/uniform/trekcmdtos diff --git a/strings/tips.txt b/strings/tips.txt index 5dc4e1b985..2039b30359 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -163,7 +163,7 @@ As a Botanist, you can mutate the plants growing in your hydroponics trays with As a Botanist, you should look into increasing the potency of your plants. This is shown by the size of the plant's sprite, and can increase the amount of chemicals, points gained from grinding them in the biogenerator, and lets people know you are a proficient botanist. As a Botanist, you can combine production trait chemicals and mix your own complex chemicals inside of the plants themselves using precursors. Chlorine (blumpkin) + radium and phosphorus (glowshrooms) equals unstable mutagen! As a Botanist, earthsblood is an incredibly powerful chemical found in Ambrosia Gaia, it heals all types of damages very rapidly but causes lingering brain damage and has a nasty overdose. You can combine the chemicals from watermelons (water), grass (hydrogen), and cherries (sugar) to mix mannitol in with your earthsblood to completely counteract its main drawback! -As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood can make your trays and soil plots completely self sufficient when a plant containing such reagent is composted into them, meaning they won't need nutrients or water, and they'll automatically kill their own weeds and pests. +As a Botanist, Ambrosia Gaia is a plant mutated from Ambrosia Deus, which is a plant mutated from Ambrosia Vulgaris. The reagent contained within this plant known as earthsblood makes for a vastly superior fertilizer than most, giving decent stat boosts to most stats, and automatically killing weeds and pests! As a Cook, you can load your food into snack vending machines. As a Cook, you can rename your custom made food with a pen. As a Cook, any food you make will be much healthier than the junk food found in vendors. Having the crew routinely eating from you will provide minor buffs. diff --git a/tgstation.dme b/tgstation.dme index 44394e0673..23f262d7a5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,6 +26,7 @@ #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\botany.dm" #include "code\__DEFINES\bsql.config.dm" #include "code\__DEFINES\bsql.dm" #include "code\__DEFINES\callbacks.dm" @@ -2135,6 +2136,7 @@ #include "code\modules\hydroponics\growninedible.dm" #include "code\modules\hydroponics\hydroitemdefines.dm" #include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\hydroponics_chemreact.dm" #include "code\modules\hydroponics\plant_genes.dm" #include "code\modules\hydroponics\sample.dm" #include "code\modules\hydroponics\seed_extractor.dm" @@ -3398,6 +3400,8 @@ #include "code\modules\surgery\prosthetic_replacement.dm" #include "code\modules\surgery\remove_embedded_object.dm" #include "code\modules\surgery\repair_puncture.dm" +#include "code\modules\surgery\robot_brain_surgery.dm" +#include "code\modules\surgery\robot_healing.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\surgery_step.dm" #include "code\modules\surgery\tools.dm"