Merge remote-tracking branch 'upstream/master'

This commit is contained in:
DeltaFire
2020-10-03 16:56:59 +02:00
122 changed files with 1798 additions and 739 deletions
+6 -18
View File
@@ -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
+8 -17
View File
@@ -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)
+15 -36
View File
@@ -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)
+2 -5
View File
@@ -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,
+2 -10
View File
@@ -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" = (
+6 -21
View File
@@ -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
+8 -43
View File
@@ -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{
+18 -27
View File
@@ -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
+3 -27
View File
@@ -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" = (
+4 -4
View File
@@ -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"
+12
View File
@@ -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)
+1
View File
@@ -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
+1
View File
@@ -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
+1 -1
View File
@@ -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))
+3
View File
@@ -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
+6 -1
View File
@@ -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("<span class='notice'>[user] starts to fix some of the dents on [H]'s [affecting.name].</span>",
"<span class='notice'>You start fixing some of the dents on [H]'s [affecting.name].</span>")
if(!do_mob(user, H, 50))
return
item_heal_robotic(H, user, 15, 0)
item_heal_robotic(H, user, heal_amount, 0)
else
return ..()
@@ -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)
@@ -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)
+17
View File
@@ -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)
+34 -1
View File
@@ -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
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"
+45
View File
@@ -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)
@@ -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"
@@ -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"
@@ -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\"."
@@ -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\"."
@@ -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."
@@ -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."
+13
View File
@@ -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."
+40 -1
View File
@@ -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
can_adjust = FALSE
+16
View File
@@ -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
@@ -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)
+1
View File
@@ -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)
@@ -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
@@ -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
@@ -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)
+1
View File
@@ -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
@@ -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"
+1
View File
@@ -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
+1
View File
@@ -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"
@@ -11,6 +11,7 @@
maturation = 2
production = 5
yield = 5
instability = 10
growthstages = 2
icon_grow = "grass-grow"
icon_dead = "grass-dead"
+1
View File
@@ -11,6 +11,7 @@
lifespan = 20
endurance = 10
yield = 4
instability = 55
growthstages = 4
rarity = 30
var/list/mutations = list()
+2 -1
View File
@@ -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, "<span class='warning'>[src] rapidly turns into ash!</span>")
qdel(src)
new /obj/effect/decal/cleanable/ash(drop_location())
*/
*/
+4 -1
View File
@@ -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)
qdel(src)
+5 -1
View File
@@ -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)
investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY)
+1
View File
@@ -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)
+1
View File
@@ -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'
+2
View File
@@ -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"
+2
View File
@@ -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)
@@ -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)
+1
View File
@@ -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"
+20 -1
View File
@@ -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, "<span class='notice'>You switch [src] to [scan_mode == PLANT_SCANMODE_CHEMICALS ? "scan for chemical reagents and traits" : "scan for plant growth statistics"].</span>")
/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("<span class='notice'>[user] analyzes [M]'s vitals.</span>", \
"<span class='notice'>You analyze [M]'s vitals.</span>")
if(scan_mode== PLANT_SCANMODE_STATS)
healthscan(user, M, advanced = TRUE)
else
chemscan(user, M)
add_fingerprint(user)
return
return ..()
// *************************************
// Hydroponics Tools
+158 -426
View File
@@ -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)
. = ..()
. += "<span class='notice'>Use <b>Ctrl-Click</b> to activate autogrow. <b>Alt-Click</b> to empty the tray's nutrients.</span>"
if(in_range(user, src) || isobserver(user))
. += "<span class='notice'>The status display reads: Tray efficiency at <b>[rating*100]%</b>.</span>"
/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, "<span class='warning'>Disconnect the hoses first!</span>")
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("<span class='warning'>[name]'s auto-grow functionality shuts off!</span>")
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
. += "<span class='info'>It's empty.</span>"
if(!self_sustaining)
. += "<span class='info'>Water: [waterlevel]/[maxwater].</span>"
. += "<span class='info'>Nutrient: [nutrilevel]/[maxnutri].</span>"
if(self_sufficiency_progress > 0)
var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
. += "<span class='info'>Treatment for self-sustenance are [percent_progress]% complete.</span>"
else
. += "<span class='info'>It doesn't require any water or nutrients.</span>"
. += "<span class='info'>Water: [waterlevel]/[maxwater].</span>\n"+\
"<span class='info'>Nutrient: [reagents.total_volume]/[maxnutri].</span>"
if(self_sustaining)
. += "<span class='info'>The tray's autogrow is active, halving active reagent drain, and actively maintaning the plant.</span>"
if(weedlevel >= 5)
. += "<span class='warning'>It's filled with weeds!</span>"
to_chat(user, "<span class='warning'>It's filled with weeds!</span>")
if(pestlevel >= 5)
. += "<span class='warning'>It's filled with tiny worms!</span>"
to_chat(user, "<span class='warning'>It's filled with tiny worms!</span>")
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("<span class='warning'>[oldPlantName] suddenly mutates into [myseed.plantname]!</span>")
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("<span class='warning'>The mutated weeds in [src] spawn some [myseed.plantname]!</span>")
TRAY_NAME_UPDATE
else
to_chat(usr, "<span class='warning'>The few weeds in [src] seem to react, but only for a moment...</span>")
/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, "<span class='warning'>The pests seem to behave oddly, but quickly settle down...</span>")
/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, "<span class='warning'>The plant shrivels and burns.</span>")
if(81 to 90)
mutatespecie()
if(66 to 80)
hardmutate()
if(41 to 65)
mutate()
if(21 to 41)
to_chat(user, "<span class='notice'>The plants don't seem to react...</span>")
if(11 to 20)
mutateweed()
if(1 to 10)
mutatepest(user)
else
to_chat(user, "<span class='notice'>Nothing happens...</span>")
// 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, "<span class='notice'>[src] warms as it might on a spring day under a genuine Sun.</span>")
// 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, "<span class='warning'>Nothing happens...</span>")
/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, "<span class='notice'>[reagent_source] is empty.</span>")
return 1
if(reagents.total_volume >= reagents.maximum_volume && !reagent_source.reagents.has_reagent(/datum/reagent/water, 1))
to_chat(user, "<span class='notice'>[src] is full.</span>")
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("<span class='notice'>[visi_msg].</span>")
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, "<span class='notice'>You plant [O].</span>")
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, "<span class='warning'>[src] already has seeds in it!</span>")
return
else if(istype(O, /obj/item/plant_analyzer))
var/obj/item/plant_analyzer/P_analyzer = O
if(myseed)
to_chat(user, "*** <B>[myseed.plantname]</B> ***" )
to_chat(user, "- Plant Age: <span class='notice'>[age]</span>")
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, "*** <B>[myseed.plantname]</B> ***" )
to_chat(user, "- Plant Age: <span class='notice'>[age]</span>")
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, "- <B>Plant Reagents</B> -")
to_chat(user, "*---------*")
for(var/datum/plant_gene/reagent/G in myseed.genes)
to_chat(user, "<span class='notice'>- [G.get_name()] -</span>")
to_chat(user, "*---------*")
else
to_chat(user, "<B>No plant found.</B>")
to_chat(user, "- Weed level: <span class='notice'>[weedlevel] / 10</span>")
to_chat(user, "- Pest level: <span class='notice'>[pestlevel] / 10</span>")
to_chat(user, "- Toxicity level: <span class='notice'>[toxic] / 100</span>")
to_chat(user, "- Water level: <span class='notice'>[waterlevel] / [maxwater]</span>")
to_chat(user, "- Nutrition level: <span class='notice'>[nutrilevel] / [maxnutri]</span>")
to_chat(user, "- Nutrition level: <span class='notice'>[reagents.total_volume] / [maxnutri]</span>")
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, "<span class='warning'>Anchor the tray first!</span>")
return
if(canirrigate)
using_irrigation = !using_irrigation
O.play_tool_sound(src)
user.visible_message("<span class='notice'>[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.</span>", \
"<span class='notice'>You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.</span>")
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, "<span class='warning'>[src] doesn't have any plants or weeds!</span>")
@@ -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, "<span class='warning'>Disconnect the hoses first!</span>")
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, "<span class='notice'>You remove the dead plant from [src].</span>")
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, "<span class='warning'>[name] has no power.</span>")
return
if(!anchored)
return
self_sustaining = !self_sustaining
idle_power_usage = self_sustaining ? 2500 : 0
to_chat(user, "<span class='notice'>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, "<span class='warning'>You empty [src]'s nutrient tank.</span>")
/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, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
to_chat(user, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
else if(myseed.getYield() <= 0)
if(user)
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
else
if(user)
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
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("<span class='boldnotice'>[src] begins to glow with a beautiful light!</span>")
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.
@@ -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("<span class='warning'>\The [myseed.plantname] starts to wilt and burn!</span>")
return
if(41 to 90)
if(myseed && !self_sustaining) //Stability
myseed.adjust_instability(5)
return
if(21 to 40)
visible_message("<span class='notice'>\The [myseed.plantname] appears unusually reactive...</span>")
return
if(11 to 20)
mutateweed()
return
if(1 to 10)
mutatepest(user)
return
+6
View File
@@ -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"
+74 -12
View File
@@ -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)
. = ..()
. += "<span class='notice'>Use a pen on it to rename it or change its description.</span>"
if(reagents_add && user.can_see_reagents())
. += "<span class='notice'>- Plant Reagents -</span>"
for(var/datum/plant_gene/reagent/G in genes)
. += "<span class='notice'>- [G.get_name()] -</span>"
/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, "<span class='info'>*---------*\n This is \a <span class='name'>[src]</span>.</span>")
var/text = get_analyzer_text()
if(text)
to_chat(user, "<span class='notice'>[text]</span>")
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, "<span class='notice'>[text]</span>")
if(reagents_add && P_analyzer.scan_mode == PLANT_SCANMODE_CHEMICALS)
to_chat(user, "<span class='notice'>- Plant Reagents -</span>")
to_chat(user, "<span class='notice'>*---------*</span>")
for(var/datum/plant_gene/reagent/G in genes)
to_chat(user, "<span class='notice'>- [G.get_name()] -</span>")
to_chat(user, "<span class='notice'>*---------*</span>")
return
@@ -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)
@@ -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("<span class='notice'>[visi_msg].</span>")
//playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
acting_object.visible_message("<span class='notice'>[visi_msg].</span>")
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
@@ -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"
@@ -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"
@@ -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"
@@ -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"
@@ -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////////////////////////////////////////
@@ -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)
@@ -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.
@@ -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
@@ -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
@@ -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
+1 -3
View File
@@ -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
+6 -1
View File
@@ -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("<span class='notice'>[user] starts to fix some of the wires in [H]'s [affecting.name].</span>", "<span class='notice'>You start fixing some of the wires in [H]'s [affecting.name].</span>")
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
+17
View File
@@ -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
@@ -213,6 +213,16 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
if(prob(30))
to_chat(M, "<span class='boldannounce'>You're not feeling good at all! You really need some [name].</span>")
/**
* 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()
@@ -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."
@@ -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)
@@ -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, "<span class='userdanger'>You go into hyperglycaemic shock! Lay off the twinkies!</span>")
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."
@@ -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("<span class='warning'>Nothing happens...</span>")
/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)
@@ -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."
@@ -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
@@ -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"
+7 -4
View File
@@ -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]"
+1 -1
View File
@@ -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
+1
View File
@@ -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)
+1
View File
@@ -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"
+1 -1
View File
@@ -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"
@@ -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"
+2 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+3
View File
@@ -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"
+1
View File
@@ -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)
+104
View File
@@ -85,3 +85,107 @@
display_results(user, target, "<span class='notice'>You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...</span>",
"[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, "<span class='notice'>You begin to cut loose wires in [target]'s [parse_zone(target_zone)]...</span>",
"[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, "<span class='notice'>You begin to pry off [target]'s [parse_zone(target_zone)] plating...</span>",
"[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, "<span class='notice'>You begin to weld [target]'s [parse_zone(target_zone)] plating...</span>",
"[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, "<span class='warning'>Not enough cable!</span>")
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()<cableamount)) //failproof
coil.use(cableamount)
return TRUE
/datum/surgery_step/replace_wires/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You begin to replace [target]'s [parse_zone(target_zone)] wiring...</span>",
"[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, "<span class='warning'>Not enough metal!</span>")
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()<metalamount)) //failproof
plat.use(metalamount)
return TRUE
/datum/surgery_step/add_plating/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You begin to add plating to [target]'s [parse_zone(target_zone)]...</span>",
"[user] begins to add plating to [target]'s [parse_zone(target_zone)].",
"[user] begins to add plating to [target]'s [parse_zone(target_zone)].")
@@ -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,
@@ -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, "<span class='warning'>You try to siphon energy from the [A], but your power cell is gone!</span>")
return
if(A.cell && A.cell.charge > 0)
if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
to_chat(user, "<span class='warning'>You are already fully charged!</span>")
return
else
powerdraw_loop(A, H)
return
to_chat(user, "<span class='warning'>There is no charge to draw from that APC.</span>")
/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
H.visible_message("<span class='notice'>[H] inserts a power connector into the [A].</span>", "<span class='notice'>You begin to draw power from the [A].</span>")
while(do_after(H, 10, target = A))
if(loc != H)
to_chat(H, "<span class='warning'>You must keep your connector out while charging!</span>")
break
if(A.cell.charge == 0)
to_chat(H, "<span class='warning'>The [A] doesn't have enough charge to spare.</span>")
break
A.charging = 1
if(A.cell.charge >= 500)
do_sparks(1, FALSE, A)
H.nutrition += 50
A.cell.charge -= 150
to_chat(H, "<span class='notice'>You siphon off some of the stored charge for your own use.</span>")
else
H.nutrition += A.cell.charge/10
A.cell.charge = 0
to_chat(H, "<span class='notice'>You siphon off as much as the [A] can spare.</span>")
break
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
to_chat(H, "<span class='notice'>You are now fully charged.</span>")
break
H.visible_message("<span class='notice'>[H] unplugs from the [A].</span>", "<span class='notice'>You unplug from the [A].</span>")
+28 -1
View File
@@ -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, "<span class='warning'>Alert: Auditory systems corrupted!.</span>")
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
+9
View File
@@ -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, "<span class='warning'>Alert: Perception visuals damaged!</span>")
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
+12 -1
View File
@@ -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, "<span class='warning'>Alert: Critical cooling system failure!</span>")
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."
+12 -1
View File
@@ -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, "<span class='warning'>Alert: Detected severe battery discharge!</span>")
if(2)
owner.nutrition = min(owner.nutrition - 100, 0)
to_chat(owner, "<span class='warning'>Alert: Minor battery discharge!</span>")
/obj/item/organ/stomach/ethereal
name = "biological battery"
+2
View File
@@ -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"
@@ -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, "<span class='notice'>You begin to fix [target]'s posibrain...</span>",
"[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, "<span class='notice'>You succeed in fixing [target]'s posibrain.</span>",
"[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, "<span class='warning'>You screw up, causing more damage!</span>",
"<span class='warning'>[user] screws up, causing damage to the circuits!</span>",
"[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("<span class='warning'>[user] suddenly notices that the posibrain [user.p_they()] [user.p_were()] working on is not there anymore.", "<span class='warning'>You suddenly notice that the posibrain you were working on is not there anymore.</span>")
return FALSE
+125
View File
@@ -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, "<span class='notice'>You attempt to fix some of [target]'s [woundtype].</span>",
"<span class='notice'>[user] attempts to fix some of [target]'s [woundtype].</span>",
"<span class='notice'>[user] attempts to fix some of [target]'s [woundtype].</span>")
/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, "<span class='notice'>[umsg].</span>",
"[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, "<span class='warning'>You screwed up!</span>",
"<span class='warning'>[user] screws up!</span>",
"<span class='notice'>[user] fixes some of [target]'s damage.</span>", 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
+10
View File
@@ -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,
+5
View File
@@ -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,

Some files were not shown because too many files have changed in this diff Show More