diff --git a/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm b/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm index d1d7d1bc8ab..74727a94110 100644 --- a/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm +++ b/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm @@ -568,11 +568,11 @@ /obj/item/stack/medical/gauze/improvised, /obj/item/stack/medical/gauze/improvised, /obj/item/stack/medical/gauze/improvised, -/obj/item/reagent_containers/pill/patch/silver_sulf{ +/obj/item/reagent_containers/pill/patch/alvitane{ pixel_x = 5; pixel_y = 3 }, -/obj/item/reagent_containers/pill/patch/styptic, +/obj/item/reagent_containers/pill/patch/indomide, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/ruin/beach/piratecrash) diff --git a/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm b/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm index 291c80de6a1..7f11e3e9dfc 100644 --- a/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm +++ b/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm @@ -372,7 +372,7 @@ "hF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/item/paper{ - default_raw_text = "

Export expectations

By the end of the month facility No.475-24 is expected to provide the following amounts of medicine to be ready for export:

  1. 300u of Perfluorodecalin
  2. 270u of Thializid
  3. 50 Burnpatches
  4. 65 Synthflesh patches
  5. 275u of atropine

Production is to be proceeded with imidiately.

"; + default_raw_text = "

Export expectations

By the end of the month facility No.475-24 is expected to provide the following amounts of medicine to be ready for export:

  1. 300u of Panacea
  2. 270u of Thializid
  3. 50 Burnpatches
  4. 65 Synthflesh patches
  5. 275u of atropine

Production is to be proceeded with imidiately.

"; name = "Export orders"; pixel_x = 4; pixel_y = 5 diff --git a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm index a0d3e3d6c6a..d977486b5f8 100644 --- a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm +++ b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm @@ -1616,7 +1616,7 @@ /obj/item/slimecrossbeaker/autoinjector/slimestimulant{ pixel_y = 11 }, -/obj/item/slimecrossbeaker/omnizine, +/obj/item/slimecrossbeaker/panacea, /obj/item/reagent_containers/glass/beaker{ pixel_y = 10; pixel_x = -9 @@ -2493,7 +2493,7 @@ /obj/structure/closet/crate/medical{ anchored = 1 }, -/obj/item/reagent_containers/syringe/thializid, +/obj/item/reagent_containers/syringe/pancrazine, /turf/open/floor/plasteel/tech, /area/ruin/unpowered/codelab/storage) "DZ" = ( diff --git a/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm b/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm index 7fecf3bfe5c..05d165c5e4e 100644 --- a/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm +++ b/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm @@ -210,7 +210,6 @@ /area/ruin/unpowered) "fY" = ( /obj/structure/closet/crate/miningcar, -/obj/item/storage/pill_bottle/mining, /obj/item/storage/belt/mining/primitive, /obj/item/pickaxe/improvised, /turf/open/floor/plating/asteroid/basalt, diff --git a/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm b/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm index 6f117b97223..6d157b82ddf 100644 --- a/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm +++ b/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm @@ -917,10 +917,6 @@ /obj/effect/turf_decal/techfloor{ dir = 1 }, -/obj/structure/cursed_money{ - pixel_x = 3; - pixel_y = 10 - }, /turf/open/floor/plasteel/tech, /area/ruin/rockplanet/nomad) "Me" = ( diff --git a/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm b/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm index 3610147858a..ece9a7b8ea2 100644 --- a/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm +++ b/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm @@ -278,7 +278,7 @@ /turf/open/floor/plasteel, /area/ruin/powered) "gy" = ( -/obj/item/reagent_containers/hypospray/medipen/oxandrolone, +/obj/item/reagent_containers/hypospray/medipen/ysiltane, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -410,7 +410,7 @@ /area/ruin/powered) "jh" = ( /obj/structure/rack, -/obj/item/reagent_containers/hypospray/medipen/salacid{ +/obj/item/reagent_containers/hypospray/medipen/silfrine{ pixel_x = 3; pixel_y = -3 }, diff --git a/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm b/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm index 79e3e5274c7..f5b561bda1e 100644 --- a/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm +++ b/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm @@ -1247,10 +1247,7 @@ pixel_x = 5; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/item/storage/box/bodybags, /obj/structure/cable{ icon_state = "1-8" diff --git a/_maps/PentestMaps/Shuttles/independent/independent_box.dmm b/_maps/PentestMaps/Shuttles/independent/independent_box.dmm index a03bd80f442..81e836d85b8 100644 --- a/_maps/PentestMaps/Shuttles/independent/independent_box.dmm +++ b/_maps/PentestMaps/Shuttles/independent/independent_box.dmm @@ -429,10 +429,7 @@ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/structure/closet/secure_closet{ icon_state = "med"; name = "medicine locker" diff --git a/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm b/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm index 9713cc80cc7..5ffd2054739 100644 --- a/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm +++ b/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm @@ -3404,10 +3404,7 @@ pixel_x = 5; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/item/reagent_containers/syringe, /obj/effect/turf_decal/borderfloorwhite{ dir = 10 diff --git a/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm b/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm index 0bb1a9f3516..d0ebc5f1f85 100644 --- a/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm +++ b/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm @@ -387,9 +387,7 @@ pixel_x = 8; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle"; +/obj/item/reagent_containers/glass/bottle/gjalrazine{ pixel_x = 5 }, /obj/structure/closet/secure_closet/wall/directional/east{ diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm index cfbe09ef66b..7aad5845d9d 100644 --- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm +++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm @@ -8503,10 +8503,7 @@ }, /obj/item/clothing/gloves/color/latex/nitrile, /obj/item/storage/box/rxglasses, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid = 30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/item/reagent_containers/glass/bottle{ list_reagents = list(/datum/reagent/medicine/rezadone = 30); name = "rezadone bottle"; diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm index 23206514aac..eadcde18571 100644 --- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm +++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm @@ -4152,7 +4152,7 @@ /obj/effect/decal/cleanable/vomit/old, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/closet/wall/directional/west, -/obj/item/reagent_containers/syringe/contraband/fentanyl{ +/obj/item/reagent_containers/syringe/contraband/morphine{ pixel_x = -3; pixel_y = 4 }, diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm index ebd19a99f25..f3b112d7391 100644 --- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm +++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm @@ -5136,9 +5136,7 @@ pixel_x = 8; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle"; +/obj/item/reagent_containers/glass/bottle/gjalrazine{ pixel_x = 5 }, /obj/effect/turf_decal/industrial/warning/corner{ diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm index 934d78c7f87..b0da4c52f04 100644 --- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm +++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm @@ -1471,10 +1471,7 @@ /obj/item/storage/pill_bottle/charcoal/less{ pixel_x = -9 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/item/reagent_containers/glass/bottle/formaldehyde{ pixel_x = 6; pixel_y = 8 diff --git a/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm b/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm index 40062ccfb8a..2aa222e06a5 100644 --- a/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm +++ b/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm @@ -761,7 +761,7 @@ /area/ruin/unpowered) "CL" = ( /obj/structure/table/chem, -/obj/item/reagent_containers/glass/beaker/large/styptic, +/obj/item/reagent_containers/glass/beaker/large/epinephrine, /obj/item/stock_parts/micro_laser/high, /turf/open/floor/plasteel/dark/airless, /area/ruin/unpowered) @@ -1374,7 +1374,7 @@ /area/ruin/unpowered) "WS" = ( /obj/structure/table/chem, -/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine, +/obj/item/reagent_containers/glass/beaker/large/hadrakine, /obj/machinery/light/dim/directional/north, /turf/open/floor/plasteel/dark/airless, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm index b1362d35ca6..533c9ce581d 100644 --- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm @@ -486,11 +486,11 @@ /turf/open/floor/concrete/slab_1, /area/ruin/beach/complex/wall) "iB" = ( -/obj/item/reagent_containers/pill/patch/styptic{ +/obj/item/reagent_containers/pill/patch/indomide{ name = "industrial medicine"; pixel_y = 5 }, -/obj/item/reagent_containers/pill/patch/styptic{ +/obj/item/reagent_containers/pill/patch/indomide{ name = "industrial medicine" }, /obj/structure/table, @@ -1726,10 +1726,10 @@ /area/ruin/beach/complex) "Cb" = ( /obj/structure/table, -/obj/item/reagent_containers/pill/patch/silver_sulf{ +/obj/item/reagent_containers/pill/patch/alvitane{ name = "industrial medicine" }, -/obj/item/reagent_containers/pill/patch/silver_sulf{ +/obj/item/reagent_containers/pill/patch/alvitane{ pixel_y = -5; name = "industrial medicine" }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm b/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm index 79b6c62f133..e7c68ba6241 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm @@ -5257,7 +5257,7 @@ pixel_y = 5; pixel_x = -5 }, -/obj/item/reagent_containers/pill/trophazole{ +/obj/item/reagent_containers/pill/indomide{ pixel_x = 11; pixel_y = -10 }, diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index 534fcdd337c..6ab13da026d 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -2568,10 +2568,6 @@ /turf/open/floor/plating, /area/ruin/jungle/cavecrew/ship) "IZ" = ( -/obj/item/reagent_containers/syringe/contraband/fentanyl{ - pixel_x = -3; - pixel_y = 4 - }, /obj/item/reagent_containers/syringe/contraband/methamphetamine, /obj/item/reagent_containers/food/drinks/beer{ pixel_x = -4 @@ -2590,6 +2586,10 @@ pixel_y = 11; pixel_x = 5 }, +/obj/item/reagent_containers/syringe/contraband/morphine{ + pixel_y = 4; + pixel_x = -4 + }, /turf/open/floor/wood{ icon_state = "wood-broken2" }, diff --git a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm index c075d11c602..9015669308b 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm @@ -4452,7 +4452,7 @@ /area/overmap_encounter/planetoid/cave/explored) "FM" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/item/reagent_containers/syringe/oxandrolone{ +/obj/item/reagent_containers/syringe/ysiltane{ pixel_x = 5; pixel_y = -7 }, diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm index 5c7b593bd69..647feae1d8c 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm @@ -1207,11 +1207,11 @@ /obj/effect/turf_decal/industrial/outline/red, /obj/structure/closet/crate/medical, /obj/item/storage/firstaid/regular, -/obj/item/reagent_containers/glass/bottle/bicaridine{ +/obj/item/reagent_containers/glass/bottle/indomide{ pixel_x = -6 }, /obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/glass/bottle/bicaridine{ +/obj/item/reagent_containers/glass/bottle/indomide{ pixel_x = 6 }, /turf/open/floor/plasteel/patterned/brushed/rockplanet, diff --git a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm index 56551d08777..0fa0c5a2e1f 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm @@ -485,7 +485,7 @@ pixel_x = 6; pixel_y = 2 }, -/obj/item/reagent_containers/hypospray/medipen/stimulants{ +/obj/item/reagent_containers/hypospray/medipen/stimpack/crisis{ pixel_x = 10; pixel_y = 7 }, diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm index 1ec27f82370..af5c71eb982 100644 --- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm @@ -9910,7 +9910,6 @@ /obj/effect/turf_decal/road/line/transparent/solgovblue, /obj/effect/turf_decal/corner/transparent/black/diagonal, /obj/structure/rack, -/obj/item/hot_potato/harmless/toy, /obj/item/toy/talking/AI, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/shop2) diff --git a/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm index 0e452c4b555..bf7f8e20ee3 100644 --- a/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm @@ -6839,8 +6839,8 @@ /obj/item/reagent_containers/hypospray/medipen/rabbit, /obj/item/reagent_containers/hypospray/medipen/survival, /obj/item/reagent_containers/hypospray/medipen/survival, -/obj/item/reagent_containers/hypospray/medipen/tricord, -/obj/item/reagent_containers/hypospray/medipen/tricord, +/obj/item/reagent_containers/hypospray/medipen/cureall, +/obj/item/reagent_containers/hypospray/medipen/cureall, /obj/item/reagent_containers/hypospray/medipen/bonefixingjuice, /obj/item/reagent_containers/hypospray/medipen/bonefixingjuice, /obj/item/reagent_containers/hypospray/medipen/morphine, diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm index f93f529b540..cda339a49e6 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm @@ -285,10 +285,7 @@ pixel_y = 2; pixel_x = 8 }, -/obj/item/reagent_containers/glass/bottle/antitoxin{ - pixel_x = -4; - pixel_y = 2 - }, +/obj/item/reagent_containers/glass/bottle/charcoal, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 9 }, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d5b13fb9e9b..4ab7449fc58 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -627,7 +627,7 @@ /turf/open/floor/plating/abductor, /area/abductor_ship) "alE" = ( -/obj/structure/table/optable/abductor, +/obj/structure/table/optable, /turf/open/floor/plating/abductor, /area/abductor_ship) "alF" = ( @@ -18594,7 +18594,7 @@ aaa akq aJB ali -alE +ali ali amu and @@ -18621,7 +18621,7 @@ aaa akq akN ali -alE +ali ali amu and @@ -18648,7 +18648,7 @@ aaa akq aAv ali -alE +ali ali amu and diff --git a/_maps/shuttles/cybersun/cybersun_nimbus.dmm b/_maps/shuttles/cybersun/cybersun_nimbus.dmm index 95ac6a25233..51d3f05eb94 100644 --- a/_maps/shuttles/cybersun/cybersun_nimbus.dmm +++ b/_maps/shuttles/cybersun/cybersun_nimbus.dmm @@ -38,14 +38,9 @@ /obj/item/storage/firstaid/medical{ pixel_x = -4 }, -/obj/item/hypospray/mkii/tricord{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord, -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord{ - pixel_x = -5 - }, +/obj/item/hypospray/mkii/cureall, +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall, +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall, /turf/open/floor/plasteel/mono/white, /area/ship/cargo) "aL" = ( diff --git a/_maps/shuttles/independent/independent_atoll.dmm b/_maps/shuttles/independent/independent_atoll.dmm index 7c146a610e1..6813610b8fb 100644 --- a/_maps/shuttles/independent/independent_atoll.dmm +++ b/_maps/shuttles/independent/independent_atoll.dmm @@ -1006,8 +1006,7 @@ /area/ship/hallway/aft) "in" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /obj/machinery/airalarm/directional/south, /turf/open/floor/wood/walnut, @@ -2123,8 +2122,7 @@ "sv" = ( /obj/structure/fluff/hedge, /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /turf/open/floor/wood/walnut, /area/ship/crew/ccommons) @@ -2190,8 +2188,7 @@ /area/ship/crew/dorm/captain) "sX" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -2277,8 +2274,7 @@ /area/ship/medical) "ux" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /turf/open/floor/wood/walnut, /area/ship/crew/ccommons) @@ -2292,9 +2288,7 @@ /turf/open/floor/plasteel/tech, /area/ship/engineering/engines/starboard) "uL" = ( -/obj/machinery/power/smes/shuttle/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/precharged, /obj/structure/cable/yellow{ icon_state = "0-8" }, @@ -2716,8 +2710,7 @@ /area/ship/crew/dorm/captain) "yA" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /turf/open/floor/wood/walnut, /area/ship/crew/office) @@ -2732,9 +2725,7 @@ /turf/open/floor/plating, /area/ship/engineering/engines/port) "yF" = ( -/obj/machinery/power/smes/shuttle/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/precharged, /obj/structure/cable/yellow{ icon_state = "0-8" }, @@ -3380,8 +3371,7 @@ /area/ship/hallway/port) "Fv" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/computer/med_data/laptop{ @@ -4830,9 +4820,7 @@ /turf/open/floor/plasteel/patterned/ridged, /area/ship/crew/office) "Rj" = ( -/obj/machinery/power/shuttle/engine/electric{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric, /obj/structure/cable/yellow{ icon_state = "0-4" }, @@ -5001,24 +4989,22 @@ pixel_x = -6; pixel_y = 14 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle"; - pixel_x = 6; - pixel_y = 14 - }, /obj/item/reagent_containers/glass/bottle/atropine{ pixel_x = -6; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_x = 6; - pixel_y = 8 - }, /obj/item/storage/pill_bottle/mannitol{ pixel_x = -8 }, /obj/item/storage/pill_bottle/mutadone, +/obj/item/reagent_containers/glass/bottle/gjalrazine{ + pixel_y = 14; + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = 6; + pixel_y = 8 + }, /obj/item/storage/pill_bottle/penacid{ pixel_x = 8 }, @@ -5101,9 +5087,7 @@ /turf/open/floor/carpet, /area/ship/crew/ccommons) "TZ" = ( -/obj/machinery/power/shuttle/engine/electric{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric, /obj/structure/cable/yellow{ icon_state = "0-4" }, @@ -5742,8 +5726,7 @@ /area/ship/hallway/aft) "ZQ" = ( /obj/effect/turf_decal/siding/wood{ - color = "#543C30"; - dir = 2 + color = "#543C30" }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood/walnut, diff --git a/_maps/shuttles/independent/independent_mudskipper.dmm b/_maps/shuttles/independent/independent_mudskipper.dmm index 5fbd51aa17d..5a40be16d03 100644 --- a/_maps/shuttles/independent/independent_mudskipper.dmm +++ b/_maps/shuttles/independent/independent_mudskipper.dmm @@ -366,8 +366,8 @@ /obj/item/bodybag, /obj/item/bodybag, /obj/item/pickaxe/mini, -/obj/item/reagent_containers/pill/patch/styptic, -/obj/item/reagent_containers/pill/patch/silver_sulf, +/obj/item/reagent_containers/pill/patch/indomide, +/obj/item/reagent_containers/pill/patch/alvitane, /obj/item/multitool, /obj/item/stack/marker_beacon/thirty, /obj/item/gear_pack/anglegrinder, diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm index 21acdaac8e7..c893782c580 100644 --- a/_maps/shuttles/independent/independent_rigger.dmm +++ b/_maps/shuttles/independent/independent_rigger.dmm @@ -365,11 +365,7 @@ pixel_x = 8; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle"; - pixel_x = 5 - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /obj/item/reagent_containers/syringe{ pixel_x = 7 }, @@ -4488,7 +4484,6 @@ /area/ship/hallway/central) "ZI" = ( /obj/item/storage/case/surgery{ - pixel_x = 0; pixel_y = 3 }, /obj/item/clothing/gloves/color/latex/nitrile, diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm index 933904b9216..bb9ab8bd84b 100644 --- a/_maps/shuttles/independent/independent_shetland.dmm +++ b/_maps/shuttles/independent/independent_shetland.dmm @@ -1295,14 +1295,14 @@ pixel_x = 5; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, /obj/item/storage/box/bodybags, /obj/structure/cable{ icon_state = "1-8" }, +/obj/item/reagent_containers/glass/bottle/gjalrazine{ + pixel_x = 5; + pixel_y = -8 + }, /turf/open/floor/plasteel/white, /area/ship/medical) "lc" = ( diff --git a/_maps/shuttles/independent/independent_sola.dmm b/_maps/shuttles/independent/independent_sola.dmm index 81bb07da0d8..7a6f87df481 100644 --- a/_maps/shuttles/independent/independent_sola.dmm +++ b/_maps/shuttles/independent/independent_sola.dmm @@ -2882,11 +2882,11 @@ /obj/item/storage/box/bodybags, /obj/item/storage/box/syringes, /obj/item/roller, -/obj/item/reagent_containers/syringe/thializid, /obj/effect/turf_decal/corner/opaque/bottlegreen{ dir = 6 }, /obj/item/healthanalyzer, +/obj/item/reagent_containers/syringe/pancrazine, /turf/open/floor/plasteel/white, /area/ship/medical) "LR" = ( diff --git a/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm b/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm index ac01c1bbae3..25b37c2d3c8 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm @@ -1966,7 +1966,7 @@ }, /obj/machinery/airalarm/directional/west, /obj/item/storage/box/syringes, -/obj/item/reagent_containers/glass/bottle/bicaridine, +/obj/item/reagent_containers/glass/bottle/indomide, /obj/item/storage/pill_bottle/charcoal, /obj/effect/spawner/random/medical/medkit, /obj/item/storage/firstaid/medical, diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm index aabb0c5bd31..c6d051ed4df 100644 --- a/_maps/shuttles/solgov/solgov_paracelsus.dmm +++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm @@ -683,8 +683,7 @@ pixel_y = -1 }, /obj/item/paper_bin{ - pixel_x = 9; - pixel_y = 0 + pixel_x = 9 }, /obj/item/pen/solgov{ pixel_x = 9; @@ -1161,7 +1160,6 @@ /area/ship/storage/eva) "kN" = ( /obj/structure/sign/solgov_seal{ - pixel_x = 0; pixel_y = -1 }, /turf/closed/wall/mineral/titanium, @@ -1421,8 +1419,7 @@ "nG" = ( /obj/structure/filingcabinet/double{ dir = 4; - pixel_x = -10; - pixel_y = 0 + pixel_x = -10 }, /obj/machinery/light/directional/west, /turf/open/floor/carpet/royalblue, @@ -1651,8 +1648,7 @@ pixel_y = -1 }, /obj/item/paper_bin{ - pixel_x = 9; - pixel_y = 0 + pixel_x = 9 }, /obj/item/pen/solgov{ pixel_x = 9; @@ -2500,10 +2496,7 @@ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle{ - list_reagents = list(/datum/reagent/medicine/thializid=30); - name = "thializid bottle" - }, +/obj/item/reagent_containers/glass/bottle/gjalrazine, /turf/open/floor/mineral/titanium/tiled/white, /area/ship/medical/surgery) "wY" = ( @@ -3650,8 +3643,7 @@ /area/ship/crew/canteen) "IP" = ( /obj/structure/sign/solgov_flag{ - pixel_x = -1; - pixel_y = 0 + pixel_x = -1 }, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ship/security/armory) @@ -4195,7 +4187,6 @@ }, /obj/structure/table, /obj/item/storage/box/bodybags{ - pixel_x = 0; pixel_y = 4 }, /turf/open/floor/plasteel/white, @@ -4914,9 +4905,7 @@ /area/ship/hallway/port) "TD" = ( /obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/opaque/solgovblue/filled/line{ - dir = 2 - }, +/obj/effect/turf_decal/trimline/opaque/solgovblue/filled/line, /obj/structure/bed/roller, /turf/open/floor/plasteel/white, /area/ship/crew/crewtwo) @@ -5381,8 +5370,7 @@ /area/ship/medical) "XQ" = ( /obj/structure/mirror{ - pixel_y = -25; - pixel_x = 0 + pixel_y = -25 }, /obj/structure/cable{ icon_state = "1-4" diff --git a/_maps/shuttles/subshuttles/syndicate_runner.dmm b/_maps/shuttles/subshuttles/syndicate_runner.dmm index 036a10b4904..c4b723e24db 100644 --- a/_maps/shuttles/subshuttles/syndicate_runner.dmm +++ b/_maps/shuttles/subshuttles/syndicate_runner.dmm @@ -50,9 +50,7 @@ /turf/open/floor/plasteel/white, /area/ship/bridge) "aj" = ( -/obj/machinery/power/shuttle/engine/electric/premium{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric/premium, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 1 @@ -85,18 +83,11 @@ /area/ship/bridge) "al" = ( /obj/structure/table/chem, -/obj/item/reagent_containers/glass/bottle/bicaridine{ +/obj/item/reagent_containers/glass/bottle/indomide{ pixel_x = 7; pixel_y = 14 }, -/obj/item/reagent_containers/glass/bottle/antitoxin{ - pixel_x = -4; - pixel_y = 10 - }, -/obj/item/reagent_containers/glass/bottle/kelotane{ - pixel_x = 4; - pixel_y = 7 - }, +/obj/item/reagent_containers/glass/bottle/charcoal, /obj/item/reagent_containers/glass/bottle/dexalin{ pixel_x = -3; pixel_y = 2 @@ -104,6 +95,10 @@ /obj/item/reagent_containers/syringe{ pixel_x = 8 }, +/obj/item/reagent_containers/glass/bottle/alvitane{ + pixel_x = 4; + pixel_y = 3 + }, /turf/open/floor/plasteel/mono/dark, /area/ship/bridge) "bz" = ( @@ -237,7 +232,6 @@ /area/ship/bridge) "gi" = ( /obj/item/storage/case/surgery{ - pixel_x = 0; pixel_y = 3 }, /obj/structure/table/chem, @@ -434,9 +428,7 @@ /turf/open/floor/plasteel/white, /area/ship/bridge) "DW" = ( -/obj/machinery/power/shuttle/engine/electric/premium{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric/premium, /obj/structure/window/reinforced{ dir = 1 }, diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index e8da2479685..0e62fb150c6 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -126,9 +126,10 @@ SUBSYSTEM_DEF(traumas) /obj/item/melee/baton/abductor, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien, /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, - /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, + /obj/structure/table/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, /obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor, - /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)), + /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor, + /obj/structure/table/optable/abductor)), // PENTEST RESTORED - ALIEN OBJECTS "birds" = typecacheof(list( /obj/item/clothing/mask/gas/plaguedoctor, /obj/item/food/cracker, diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index bae7a4f905b..e02ad5c832f 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -218,8 +218,8 @@ if(harmful) var/damage = weapon.w_class * remove_pain_mult // It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow - limb.receive_damage(brute = (1 - pain_stam_pct) * damage, stamina = pain_stam_pct * damage, sharpness = SHARP_EDGED) - victim.force_scream() + var/scream_power = limb.receive_damage(brute = (1 - pain_stam_pct) * damage, stamina = pain_stam_pct * damage, sharpness = SHARP_EDGED) + victim.force_pain_noise(scream_power) victim.visible_message( span_notice("[victim] successfully rips [weapon] [harmful ? "out" : "off"] of [victim.p_their()] [limb.name]!"), diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 112ca515d0f..9fc2971084b 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -395,7 +395,7 @@ playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE) playsound(user, 'sound/effects/splat.ogg', 70, TRUE) playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE) - user.force_scream() + user.force_pain_noise(400) user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed! shake_camera(user, 7, 7) user.flash_act(1, TRUE, TRUE, length = 4.5) //PENTEST EDIT diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index db748da77e2..d4a5e0315df 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -60,7 +60,7 @@ /datum/reagent/pax, /datum/reagent/drug/happiness, /datum/reagent/medicine/ephedrine ), list( // level 9 - /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/sal_acid + /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/silfrine ), list( // level 10 /datum/reagent/medicine/haloperidol, /datum/reagent/drug/aranesp, /datum/reagent/medicine/diphenhydramine diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 6ddd9e8ad3a..713dada975d 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -3,8 +3,8 @@ name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" - cure_text = "Spaceacillin & Perfluorodecalin" - cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/perfluorodecalin) + cure_text = "Spaceacillin & Salbutamol" + cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salbutamol) agent = "Fungal Tubercle bacillus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 63f65d8dd75..619d8aa3f06 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -626,7 +626,7 @@ dna.remove_all_mutations() dna.stability = 100 if(prob(max(70-instability,0))) - switch(rand(0,10)) //not complete and utter death + switch(rand(0,8)) //not complete and utter death if(0) monkeyize() if(1) @@ -641,14 +641,8 @@ to_chat(src, span_notice("Oh, I actually feel quite alright!")) //you thought physiology.damage_resistance = -20000 if(5) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - reagents.add_reagent(/datum/reagent/aslimetoxin, 10) - if(6) apply_status_effect(STATUS_EFFECT_GO_AWAY) - if(7) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS - if(8) + if(6) var/list/elligible_organs = list() for(var/obj/item/organ/O in internal_organs) //make sure we dont get an implant or cavity item elligible_organs += O @@ -658,7 +652,7 @@ O.Remove(src) visible_message(span_danger("[src] vomits up their [O.name]!"), span_danger("You vomit up your [O.name]")) //no "vomit up your the heart" O.forceMove(drop_location()) - if(9 to 10) + if(7 to 9) ForceContractDisease(new/datum/disease/gastrolosis()) to_chat(src, span_notice("Oh, I actually feel quite alright!")) else diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 358d4e15592..0c016e7fc92 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -114,6 +114,11 @@ mood_change = -4 timeout = 3 MINUTES +/datum/mood_event/uncomfortable_medicine + description = span_warning("Medicine may be good for me, but right now I feel worse.") + mood_change = -3 + timeout = 120 SECONDS + /datum/mood_event/painful_medicine description = span_warning("Medicine may be good for me but right now it stings like hell.") mood_change = -5 diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 9a3f37015c2..2e97bbe5d9e 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -327,6 +327,14 @@ /datum/wound/proc/on_synthflesh(power) return +/// When silfrine is applied to the victim, we call this. +/datum/wound/proc/on_silfrine(power) + return + +/// When ysiltane/alvitane/quardextane is applied to the victim, we call this. +/datum/wound/proc/on_tane(power) + return + /// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them /datum/wound/proc/on_stasis() return diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index f881c115b57..73420e2e439 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -102,7 +102,8 @@ if(prob((severity - 1) * 15)) // And you have a 70% or 50% chance to actually land the blow, respectively if(prob(70 - 20 * (severity - 1))) - to_chat(victim, span_userdanger("The fracture in your [limb.name] shoots with pain as you strike [target]!")) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(victim, span_userdanger("The fracture in your [limb.name] shoots with pain as you strike [target]!")) limb.receive_damage(brute = rand(1,2)) else victim.visible_message( @@ -287,7 +288,7 @@ ignored_mobs = victim, ) to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] back into place!")) - victim.force_scream() + victim.force_pain_noise(80) limb.receive_damage(brute = 5, wound_bonus = CANT_WOUND) qdel(src) else @@ -314,7 +315,7 @@ ignored_mobs = victim, ) to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] with a sickening crack!")) - victim.force_scream() + victim.force_pain_noise(100) limb.receive_damage(brute = 20, wound_bonus = 40) else user.visible_message( @@ -431,7 +432,7 @@ return I.use(1) - victim.force_scream() + victim.force_pain_noise(60) if(user != victim) user.visible_message( span_notice("[user] finishes applying [I] to [victim]'s [limb.name], giving off a wet fizzle."), diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index cb6eff02d3c..922c67ecd87 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -227,10 +227,21 @@ to_chat(user, span_warning("You need to open [mesh_check] first.")) return ointmentmesh(mesh_check, user) -e + /datum/wound/burn/on_synthflesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard +/// When a -tane chem is applied to the victim, we call this. +/datum/wound/burn/on_tane(amount) + if(amount > 10 && severity <= WOUND_SEVERITY_SEVERE) + qdel(src) + return + + flesh_healing += amount * 0.25 + sanitization += amount * 0.1 + return + + // we don't even care about first degree burns, straight to second /datum/wound/burn/moderate name = "Second Degree Burns" diff --git a/code/datums/wounds/muscle.dm b/code/datums/wounds/muscle.dm index cf13b3bf2a5..88b7093ab69 100644 --- a/code/datums/wounds/muscle.dm +++ b/code/datums/wounds/muscle.dm @@ -73,7 +73,8 @@ if(prob(severity * 15)) //And you have a 70% or 50% chance to actually land the blow, respectively if(prob(70 - 20 * severity)) - to_chat(victim, span_userdanger("The damaged muscle in your [limb.name] shoots with pain as you strike [target]!")) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(victim, span_userdanger("The damaged muscle in your [limb.name] shoots with pain as you strike [target]!")) limb.receive_damage(brute=rand(1,3)) else victim.visible_message( diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index cc607e3a6c8..a7ddf660d0b 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -116,6 +116,18 @@ . = ..() blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates +/datum/wound/pierce/on_silfrine(power) + switch(power) + if(0 to 3) + EMPTY_BLOCK_GUARD + if(4 to 8) + if(severity < WOUND_SEVERITY_MODERATE) + qdel(src) + if(8 to 30) + if(severity < WOUND_SEVERITY_SEVERE) + qdel(src) + blood_flow -= 0.05 * power + /// If someone is using a suture to close this puncture /datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1 : 1) @@ -158,7 +170,7 @@ ) limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) if(prob(15)) - victim.force_scream() + victim.force_pain_noise(50) var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult)) blood_flow -= blood_cauterized diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 7648ff07880..a3003c22a6c 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -151,6 +151,18 @@ . = ..() blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow +/datum/wound/slash/on_silfrine(power) + switch(power) + if(0 to 5) + EMPTY_BLOCK_GUARD + if(6 to 11) + if(severity < WOUND_SEVERITY_MODERATE) + qdel(src) + if(12 to 30) + if(severity < WOUND_SEVERITY_SEVERE) + qdel(src) + blood_flow -= 0.05 * power + /// If someone's putting a laser gun up to our cut to cauterize it /datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) var/self_penalty_mult = (user == victim ? 1.25 : 1) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 46e419666c2..36fc981ed53 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -286,7 +286,7 @@ connected_message("Clone Ejected: Not enough material.") if(internal_radio) SPEAK("The cloning of [mob_occupant.real_name] has been ended prematurely due to insufficient material.") - if(mob_occupant && (mob_occupant.stat == DEAD) || mob_occupant.hellbound) //Autoeject corpses. + if(mob_occupant && (mob_occupant.stat == DEAD)) //Autoeject corpses. connected_message("Clone Rejected: Deceased.") if(internal_radio) SPEAK("The cloning of [mob_occupant.real_name] has been \ diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 9abb6ed8b15..ff84c41c349 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -40,7 +40,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/clockwork_watch = 2, /obj/item/toy/toy_dagger = 2, /obj/item/extendohand/acme = 1, - /obj/item/hot_potato/harmless/toy = 1, /obj/item/card/emagfake = 1, /obj/item/clothing/shoes/kindleKicks = 2, /obj/item/toy/plush/goatplushie/angry/realgoat = 2, @@ -50,7 +49,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/brokenradio = 2, /obj/item/toy/braintoy = 2, /obj/item/clothing/glasses/trickblindfold = 2, - /obj/item/toy/prize/honk = 1)) //PENTEST RESTORED + /obj/item/toy/prize/honk = 1, //PENTEST RESTORED - Honk + /obj/item/hot_potato/harmless/toy = 1,)) //PENTEST RESTORED - Harmless Hot Potato /obj/machinery/computer/arcade name = "random arcade" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cea3f2eadaa..9218c140d3b 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -542,10 +542,6 @@ scantemp = "Unable to locate valid genetic data." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return - if(!body_only && mob_occupant.hellbound) - scantemp = "Subject's brain is not responding to scanning stimuli." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) scantemp = "Subject's body is too damaged to scan properly." playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index 749c1aa322b..1d385839df2 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -11,8 +11,8 @@ /obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, /obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine, /obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol, - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, - /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, + /obj/item/reagent_containers/hypospray/medipen/ysiltane = /datum/reagent/medicine/ysiltane, + /obj/item/reagent_containers/hypospray/medipen/silfrine = /datum/reagent/medicine/silfrine, /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid ) /// var to prevent glitches in the animation diff --git a/code/game/machinery/sleeper.dm b/code/game/machinery/sleeper.dm index 6d89618d6e1..c99eff22ded 100644 --- a/code/game/machinery/sleeper.dm +++ b/code/game/machinery/sleeper.dm @@ -27,11 +27,11 @@ var/list/dispensable_reagents var/list/starting_beakers = list( - /obj/item/reagent_containers/glass/bottle/antitoxin/sleeper, - /obj/item/reagent_containers/glass/bottle/bicaridine/sleeper, + /obj/item/reagent_containers/glass/bottle/charcoal/sleeper, + /obj/item/reagent_containers/glass/bottle/indomide/sleeper, /obj/item/reagent_containers/glass/bottle/dexalin/sleeper, /obj/item/reagent_containers/glass/bottle/epinephrine/sleeper, - /obj/item/reagent_containers/glass/bottle/kelotane/sleeper, + /obj/item/reagent_containers/glass/bottle/alvitane/sleeper, /obj/item/reagent_containers/glass/bottle/morphine/sleeper) ///Chembag which holds all the beakers, don't look at me like that diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index 4cc66f19e23..b2b7975e907 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -36,7 +36,6 @@ /obj/item/reagent_containers/syringe/contraband/crank = 1, /obj/item/reagent_containers/syringe/contraband/methamphetamine = 1, /obj/item/reagent_containers/syringe/contraband/mammoth = 1, - /obj/item/reagent_containers/syringe/contraband/fentanyl = 1, /obj/item/reagent_containers/syringe/contraband/morphine = 1, /obj/item/storage/pill_bottle/happy = 1, /obj/item/storage/pill_bottle/lsd = 1, diff --git a/code/game/objects/effects/spawners/random/salvaging.dm b/code/game/objects/effects/spawners/random/salvaging.dm index dfa50c49bb4..b94b0576393 100644 --- a/code/game/objects/effects/spawners/random/salvaging.dm +++ b/code/game/objects/effects/spawners/random/salvaging.dm @@ -61,7 +61,7 @@ /obj/item/clothing/gloves/combat = 200, /obj/item/clothing/head/chameleon = 200, /obj/item/pen/sleepy = 200, - /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 100, + /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis = 100, /obj/item/grenade/c4 = 100, /obj/item/wrench/syndie = 30, diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 9a8a6e4174d..5803c1efad2 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -339,11 +339,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM chem_volume = 60 smoketime = 2 * 60 smoke_all = TRUE - list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/omnizine = 15) - -/obj/item/clothing/mask/cigarette/xeno - desc = "A Xeno Filtered brand cigarette." - list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15) + list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/panacea = 15) // Rollies. @@ -744,7 +740,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM heat = 3000 //Blue flame! light_color = LIGHT_COLOR_CYAN overlay_state = "slime" - grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5) + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5) /obj/item/lighter/clockwork name = "bronze zippo" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 86af260dae6..c5a8fd4d9e0 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -552,10 +552,7 @@ shock_touching(30, H) var/failed - - if (H.hellbound) - failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile.") - else if (!heart) + if (!heart) failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing.") else if (heart.organ_flags & ORGAN_FAILING) failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged, replace or repair and try again.") diff --git a/code/game/objects/items/food/donk.dm b/code/game/objects/items/food/donk.dm index d9eb797c7a0..5d6c2662891 100644 --- a/code/game/objects/items/food/donk.dm +++ b/code/game/objects/items/food/donk.dm @@ -50,7 +50,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, - /datum/reagent/medicine/omnizine = 6 + /datum/reagent/medicine/panacea/effluvial = 6 ) tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtypes = GRAIN @@ -92,7 +92,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea/effluvial = 2, /datum/reagent/consumable/capsaicin = 5 ) tastes = list("meat" = 2, "dough" = 2, "weird spices" = 2) @@ -120,7 +120,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 3, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea/effluvial = 2, /datum/reagent/consumable/soysauce = 2, ) tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2) @@ -148,7 +148,7 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea/effluvial = 2, /datum/reagent/consumable/tomatojuice = 2 ) tastes = list("meat" = 2, "dough" = 2, "melty cheese"= 2) @@ -174,7 +174,7 @@ icon_state = "donkpocketberry" food_reagents = list( /datum/reagent/consumable/nutriment = 4, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea/effluvial = 2, /datum/reagent/consumable/berryjuice = 3 ) tastes = list("dough" = 2, "warm jam" = 2) diff --git a/code/game/objects/items/food/donut.dm b/code/game/objects/items/food/donut.dm index c589231d612..7c8a9194751 100644 --- a/code/game/objects/items/food/donut.dm +++ b/code/game/objects/items/food/donut.dm @@ -89,7 +89,7 @@ /datum/reagent/toxin/slimejelly, /datum/reagent/consumable/banana, /datum/reagent/consumable/berryjuice, - /datum/reagent/medicine/omnizine, + /datum/reagent/medicine/panacea, ) reagents.add_reagent(extra_reagent, 3) diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index 3947456a987..f4edc995bdb 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -862,7 +862,7 @@ bite_consumption = 1 food_reagents = list( /datum/reagent/consumable/nutriment = 1, - /datum/reagent/medicine/regen_jelly = 1, + /datum/reagent/medicine/panacea/effluvial = 1, ) tastes = list("jelly" = 1, "sweet meat" = 1, "oil" = 1) foodtypes = MEAT diff --git a/code/game/objects/items/food/pastry.dm b/code/game/objects/items/food/pastry.dm index 1e56a1de310..fa0ff82e86e 100644 --- a/code/game/objects/items/food/pastry.dm +++ b/code/game/objects/items/food/pastry.dm @@ -188,13 +188,11 @@ name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" food_reagents = list( - /datum/reagent/medicine/omnizine = 5, + /datum/reagent/medicine/panacea = 5, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, ) . = ..() - if(fey) - reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) /obj/item/food/cracker name = "cracker" diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm index 77c7ff22f0a..f43cd337824 100644 --- a/code/game/objects/items/food/pie.dm +++ b/code/game/objects/items/food/pie.dm @@ -201,7 +201,7 @@ desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" food_reagents = list( /datum/reagent/consumable/nutriment = 11, - /datum/reagent/medicine/omnizine = 5, + /datum/reagent/medicine/panacea = 5, /datum/reagent/consumable/nutriment/vitamin = 4, ) . = ..() diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm index 58d846c331b..3d163bf7a20 100644 --- a/code/game/objects/items/food/pizza.dm +++ b/code/game/objects/items/food/pizza.dm @@ -136,7 +136,7 @@ /datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/protein = 15, /datum/reagent/consumable/tomatojuice = 6, - /datum/reagent/medicine/omnizine = 10, + /datum/reagent/medicine/panacea/effluvial = 10, /datum/reagent/consumable/nutriment/vitamin = 5, ) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1) diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm index 2af6ed6ec41..3bdded37c15 100644 --- a/code/game/objects/items/food/salad.dm +++ b/code/game/objects/items/food/salad.dm @@ -19,7 +19,7 @@ icon_state = "aesirsalad" food_reagents = list( /datum/reagent/consumable/nutriment = 8, - /datum/reagent/medicine/omnizine = 10, + /datum/reagent/medicine/panacea = 10, /datum/reagent/consumable/nutriment/vitamin = 12 ) tastes = list("leaves" = 1) diff --git a/code/game/objects/items/food/soup.dm b/code/game/objects/items/food/soup.dm index d93e6ff6e43..fe04a95a3ee 100644 --- a/code/game/objects/items/food/soup.dm +++ b/code/game/objects/items/food/soup.dm @@ -103,7 +103,7 @@ /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 9, - /datum/reagent/medicine/omnizine = 5 + /datum/reagent/medicine/neoxanthin = 5 ) tastes = list("nettles" = 1) foodtypes = VEGETABLES @@ -128,7 +128,7 @@ /datum/reagent/consumable/capsaicin, /datum/reagent/consumable/frostoil, /datum/reagent/medicine/oculine, - /datum/reagent/medicine/omnizine, + /datum/reagent/medicine/panacea, /datum/reagent/toxin, /datum/reagent/toxin/slimejelly, ) diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm index f3ec680a419..9ab28804f6d 100644 --- a/code/game/objects/items/food/sweets.dm +++ b/code/game/objects/items/food/sweets.dm @@ -124,7 +124,7 @@ /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea = 2, ) //lollipop, but vitamins = toxins tastes = list("cobwebs" = 1, "sugar" = 2) foodtypes = JUNKFOOD | SUGAR //| BUGS diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 684289c0f12..4aa1e369922 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -37,7 +37,7 @@ imp_in.set_resting(FALSE) imp_in.reagents.add_reagent(/datum/reagent/medicine/synaptizine, 10) - imp_in.reagents.add_reagent(/datum/reagent/medicine/omnizine, 10) + imp_in.reagents.add_reagent(/datum/reagent/medicine/panacea, 10) imp_in.reagents.add_reagent(/datum/reagent/medicine/stimulants, 10) if(!uses) qdel(src) diff --git a/code/game/objects/items/melee/sword.dm b/code/game/objects/items/melee/sword.dm index f0e7a90025b..094b288daa1 100644 --- a/code/game/objects/items/melee/sword.dm +++ b/code/game/objects/items/melee/sword.dm @@ -337,9 +337,8 @@ /datum/reagent/drug/mammoth = 5, /datum/reagent/drug/aranesp = 5, /datum/reagent/drug/pumpup = 10, - /datum/reagent/medicine/omnizine = 10, + /datum/reagent/medicine/panacea = 10, /datum/reagent/medicine/earthsblood = 15, - /datum/reagent/medicine/omnizine/protozine = 15 ) /obj/item/melee/sword/greyking/afterattack(atom/target, mob/user, proximity_flag, click_parameters) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b01eddb2580..f4186d3c1fd 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -402,7 +402,7 @@ desc = "An upgrade to the Medical module's hypospray, allowing it \ to treat a wider range of conditions and problems." additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, - /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, /datum/reagent/medicine/rezadone, + /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/ysiltane, /datum/reagent/medicine/silfrine, /datum/reagent/medicine/rezadone, /datum/reagent/medicine/pen_acid) /obj/item/borg/upgrade/piercing_hypospray diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 9f6a7c1dfb4..4f552bb5b68 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -138,7 +138,7 @@ self_delay = 2 SECONDS other_delay = 1.5 SECONDS heal_brute = 10 - grind_results = list(/datum/reagent/medicine/c2/libital = 10) + grind_results = list(/datum/reagent/medicine/indomide = 10) merge_type = /obj/item/stack/medical/bruise_pack /obj/item/stack/medical/gauze diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 7058b2ec8f0..e836a6aa711 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -661,7 +661,7 @@ new /obj/item/ammo_box/magazine/m9mm_rattlesnake(src) new /obj/item/ammo_box/magazine/m9mm_rattlesnake(src) new /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka(src) - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) + new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src) new /obj/item/grenade/syndieminibomb(src) /obj/item/storage/backpack/henchmen diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 9245c8109ce..b61e446a210 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -271,10 +271,10 @@ /obj/item/storage/belt/medical/webbing/combat/PopulateContents() . = ..() - new /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor(src) - new /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) - new /obj/item/reagent_containers/medigel/styptic(src) + new /obj/item/reagent_containers/hypospray/medipen/stimpack(src) + new /obj/item/reagent_containers/hypospray/medipen/stimpack(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) + new /obj/item/reagent_containers/medigel/quardexane(src) new /obj/item/stack/medical/gauze/twelve(src) new /obj/item/stack/medical/splint(src) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index be1fd38f9d7..3c6987ba071 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -260,9 +260,9 @@ /obj/item/storage/box/hypospray/PopulateContents() new /obj/item/hypospray/mkii(src) - new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src) - new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src) - new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane(src) new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src) /obj/item/storage/box/hypospray/mkiii @@ -270,10 +270,10 @@ /obj/item/storage/box/hypospray/mkiii/PopulateContents() new /obj/item/hypospray/mkii/mkiii(src) - new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine(src) - new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin(src) - new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane(src) - new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/silfrine(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/gjalrazine(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/ysiltane(src) + new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salbutamol(src) /obj/item/storage/box/medigels name = "box of medical gels" @@ -1177,14 +1177,14 @@ new /obj/item/circuitboard/machine/circuit_imprinter/department/science(src) new /obj/item/circuitboard/computer/rdconsole(src) -/obj/item/storage/box/silver_sulf - name = "box of silver sulfadiazine patches" +/obj/item/storage/box/alvitane + name = "box of alvitane patches" desc = "Contains patches used to treat burns." illustration = "firepatch" -/obj/item/storage/box/silver_sulf/PopulateContents() +/obj/item/storage/box/alvitane/PopulateContents() for(var/i in 1 to 7) - new /obj/item/reagent_containers/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/pill/patch/alvitane(src) /obj/item/storage/box/fountainpens name = "box of fountain pens" diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 0559b48445d..92cf5e0238d 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -329,13 +329,6 @@ if(prob(7)) spawn_type = /obj/item/clothing/mask/cigarette/candy/nicotine //uh oh! -/obj/item/storage/fancy/cigarettes/cigpack_xeno - name = "\improper Xeno Filtered packet" - desc = "Loaded with 100% pure slime. And also nicotine." - icon_state = "slime" - base_icon_state = "slime" - spawn_type = /obj/item/clothing/mask/cigarette/xeno - /obj/item/storage/fancy/cigarettes/cigpack_cannabis name = "\improper Freak Brothers' Special packet" desc = "A label on the packaging reads, \"Endorsed by Phineas, Freddy and Franklin.\"" diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 2aff38194bf..0021ae837f4 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -155,8 +155,8 @@ /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/mesh = 1, /obj/item/stack/medical/gauze = 1, - /obj/item/reagent_containers/pill/patch/silver_sulf = 1, - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, + /obj/item/reagent_containers/pill/patch/alvitane = 1, + /obj/item/reagent_containers/hypospray/medipen/ysiltane = 1, /obj/item/reagent_containers/hypospray/medipen = 1, /obj/item/reagent_containers/hypospray/medipen/ekit = 1, ) @@ -175,9 +175,9 @@ return var/static/items_inside = list( /obj/item/storage/pill_bottle/charcoal/less = 1, - /obj/item/reagent_containers/syringe/thializid = 3, + /obj/item/reagent_containers/syringe/pancrazine = 3, /obj/item/storage/pill_bottle/potassiodide = 1, - /obj/item/reagent_containers/hypospray/medipen/penacid = 1, + /obj/item/reagent_containers/hypospray/medipen/gjalrazine = 1, ) generate_items_inside(items_inside,src) @@ -211,7 +211,7 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/syringe/perfluorodecalin = 3, + /obj/item/reagent_containers/syringe/dexalin = 3, /obj/item/reagent_containers/hypospray/medipen/salbutamol = 1, /obj/item/reagent_containers/hypospray/medipen = 1, /obj/item/storage/pill_bottle/iron = 1, @@ -231,13 +231,13 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/pill/patch/styptic = 1, - /obj/item/storage/pill_bottle/trophazole = 1, + /obj/item/reagent_containers/medigel/hadrakine = 1, + /obj/item/storage/pill_bottle/indomide = 1, /obj/item/stack/medical/bone_gel = 1, /obj/item/stack/sticky_tape/surgical = 1, /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/splint = 1, - /obj/item/reagent_containers/hypospray/medipen/salacid = 1, + /obj/item/reagent_containers/hypospray/medipen/silfrine = 1, /obj/item/reagent_containers/hypospray/medipen/ekit = 1, ) generate_items_inside(items_inside,src) @@ -287,10 +287,10 @@ new /obj/item/stack/medical/gauze(src) new /obj/item/defibrillator/compact/combat/loaded(src) new /obj/item/reagent_containers/hypospray/combat(src) - new /obj/item/reagent_containers/pill/patch/styptic(src) - new /obj/item/reagent_containers/pill/patch/styptic(src) - new /obj/item/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/reagent_containers/pill/patch/silver_sulf(src) + new /obj/item/reagent_containers/hypospray/medipen/ysiltane(src) + new /obj/item/reagent_containers/hypospray/medipen/ysiltane(src) + new /obj/item/reagent_containers/hypospray/medipen/silfrine(src) + new /obj/item/reagent_containers/hypospray/medipen/silfrine(src) new /obj/item/clothing/glasses/hud/health/night(src) //medibot assembly @@ -406,15 +406,6 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/stimulant(src) -/obj/item/storage/pill_bottle/mining - name = "bottle of patches" - desc = "Contains patches used to treat brute and burn damage." - -/obj/item/storage/pill_bottle/mining/PopulateContents() - new /obj/item/reagent_containers/pill/patch/silver_sulf(src) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/pill/patch/styptic(src) - /obj/item/storage/pill_bottle/zoom name = "suspicious pill bottle" desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds." @@ -489,13 +480,13 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/floorpill(src) -/obj/item/storage/pill_bottle/trophazole - name = "bottle of trophazole pills" +/obj/item/storage/pill_bottle/indomide + name = "bottle of indomide pills" desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting'." -/obj/item/storage/pill_bottle/trophazole/PopulateContents() +/obj/item/storage/pill_bottle/indomide/PopulateContents() for(var/i in 1 to 4) - new /obj/item/reagent_containers/pill/trophazole(src) + new /obj/item/reagent_containers/pill/indomide(src) /obj/item/storage/pill_bottle/licarb name = "bottle of lithium carbonate pills" @@ -515,7 +506,7 @@ new /obj/item/reagent_containers/pill/finobranc(src) /obj/item/storage/pill_bottle/stardrop - name = "bottle of stardrop capsules" + name = "bottle of stardrop patches" desc = "Contains vision-enhancing patches." custom_price = 300 @@ -524,7 +515,7 @@ new /obj/item/reagent_containers/pill/patch/stardrop(src) /obj/item/storage/pill_bottle/starlight - name = "bottle of starlight capsules" + name = "bottle of starlight patches" desc = "Contains vision-enhancing patches." /obj/item/storage/pill_bottle/starlight/PopulateContents() diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index c8739f010d7..8b025e07cc9 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -119,7 +119,7 @@ new /obj/item/ammo_box/magazine/m10mm_ringneck(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/card/id/syndicate(src) - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) + new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src) new /obj/item/reagent_containers/glass/rag(src) if("ninja") @@ -369,7 +369,6 @@ /obj/item/storage/box/syndie_kit/chemical/PopulateContents() new /obj/item/reagent_containers/glass/bottle/polonium(src) new /obj/item/reagent_containers/glass/bottle/venom(src) - new /obj/item/reagent_containers/glass/bottle/fentanyl(src) new /obj/item/reagent_containers/glass/bottle/formaldehyde(src) new /obj/item/reagent_containers/glass/bottle/spewium(src) new /obj/item/reagent_containers/glass/bottle/cyanide(src) diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 3f2920c570e..98beb900d3e 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -39,7 +39,7 @@ return last_process = world.time to_chat(user, span_notice("The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.")) - user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20) + user.reagents.add_reagent(/datum/reagent/medicine/panacea,20) update_appearance() addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), time_between_uses) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 97cecda745f..e4c82fb29d7 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -835,7 +835,6 @@ /datum/reagent/toxin/acid/fluacid = -0.4, /datum/reagent/toxin/plantbgone = -0.5, /datum/reagent/napalm = -0.6, - /datum/reagent/hellwater = -1, /datum/reagent/liquidgibs = -0.2, /datum/reagent/consumable/ethanol/demonsblood = -0.8, /datum/reagent/medicine/soulus = -0.2 @@ -959,7 +958,7 @@ var/luck = rand(1, 100) if(karma > 100) if(luck > 90) - L.reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) + L.reagents.add_reagent(/datum/reagent/medicine/panacea, 5) else if (luck > 50) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/better_tree, name) else if (luck > 25) @@ -1032,7 +1031,6 @@ /datum/reagent/toxin/acid/fluacid = -0.4, /datum/reagent/toxin/plantbgone = -0.5, /datum/reagent/napalm = -0.6, - /datum/reagent/hellwater = -1, /datum/reagent/liquidgibs = -0.2, /datum/reagent/consumable/ethanol/demonsblood = -0.8, /datum/reagent/medicine/soulus = -0.2 diff --git a/code/game/objects/structures/geyser.dm b/code/game/objects/structures/geyser.dm index 58b117daeb3..27ae00f8f50 100644 --- a/code/game/objects/structures/geyser.dm +++ b/code/game/objects/structures/geyser.dm @@ -48,7 +48,7 @@ /datum/reagent/uranium/radium = 10, /datum/reagent/ammonia = 6, /datum/reagent/saltpetre = 6, - /datum/reagent/medicine/omnizine/protozine = 3, + /datum/reagent/medicine/panacea/effluvial = 3, /datum/reagent/wittel = 1 ) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 0ded860cdd5..8e4cf6eaf22 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -189,7 +189,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an for(var/mob/living/M in compiled) var/mob/living/mob_occupant = get_mob_or_brainmob(M) - if(mob_occupant.client && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) && !mob_occupant.hellbound) + if(mob_occupant.client && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA))) icon_state = "morgue4" // Revivable if(mob_occupant.stat == DEAD && beeper && COOLDOWN_FINISHED(src, next_beep)) playsound(src, 'sound/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Revive them you blind fucks diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 185133d5773..00940f667dc 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -797,10 +797,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} to_chat(user, span_warning("You need one sheet of silver to do this!")) return to_chat(user, span_notice("You start adding [P] to [src]...")) - if(do_after(user, 50, target = src)) + if(do_after(user, 50, target = src)) // PENTEST REVERT - START P.use(1) new /obj/structure/table/optable/abductor(src.loc) - qdel(src) + qdel(src) // PENTEST REVERT - END /obj/structure/table/abductor name = "alien table" @@ -816,47 +816,6 @@ Congratulations! You are now trained for invasive xenobiology research!"} canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_TABLES) frame = /obj/structure/table_frame/abductor -/obj/structure/table/optable/abductor - name = "alien operating table" - desc = "Used for alien medical procedures. The surface is covered in tiny spines." - frame = /obj/structure/table_frame/abductor - buildstack = /obj/item/stack/sheet/mineral/silver - framestack = /obj/item/stack/sheet/mineral/abductor - buildstackamount = 1 - framestackamount = 1 - icon = 'icons/obj/abductor.dmi' - icon_state = "bed" - can_buckle = 1 - /// Amount to inject per second - var/inject_am = 0.5 - - var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) - -/obj/structure/table/optable/abductor/Initialize() - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(iscarbon(AM)) - START_PROCESSING(SSobj, src) - to_chat(AM, span_danger("You feel a series of tiny pricks!")) - -/obj/structure/table/optable/abductor/process(seconds_per_tick) - . = PROCESS_KILL - for(var/mob/living/carbon/C in get_turf(src)) - . = TRUE - for(var/chemical in injected_reagents) - if(C.reagents.get_reagent_amount(chemical) < inject_am * seconds_per_tick) - C.reagents.add_reagent(chemical, inject_am * seconds_per_tick) - -/obj/structure/table/optable/abductor/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - /obj/structure/closet/abductor name = "alien locker" desc = "Contains secrets of the universe." diff --git a/code/modules/antagonists/borer/borer_chems.dm b/code/modules/antagonists/borer/borer_chems.dm index dc869b88c63..2b94b9e495b 100644 --- a/code/modules/antagonists/borer/borer_chems.dm +++ b/code/modules/antagonists/borer/borer_chems.dm @@ -29,9 +29,9 @@ chemname = "mannitol" chem_desc = "Heals any brain damage the host may have." -/datum/borer_chem/omnizine - chem = /datum/reagent/medicine/omnizine - chemname = "omnizine" +/datum/borer_chem/panacea + chem = /datum/reagent/medicine/panacea + chemname = "panacea" chem_desc = "Slowly heals all damage types in the host. Overdose will cause damage in all types instead." quantity = 5 diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 66397bc4e31..b19c8a81752 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -83,203 +83,6 @@ icon_state = "forge_off" STOP_PROCESSING(SSobj, src) -/obj/item/dice/d20/fate - name = "\improper Die of Fate" - desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky." - icon_state = "d20" - sides = 20 - microwave_riggable = FALSE - var/reusable = TRUE - var/used = FALSE - -/obj/item/dice/d20/fate/one_use - reusable = FALSE - -/obj/item/dice/d20/fate/cursed - name = "cursed Die of Fate" - desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea." - color = "#00BB00" - - rigged = DICE_TOTALLY_RIGGED - rigged_value = 1 - -/obj/item/dice/d20/fate/cursed/one_use - reusable = FALSE - -/obj/item/dice/d20/fate/stealth - name = "d20" - desc = "A die with twenty sides. The preferred die to throw at the GM." - -/obj/item/dice/d20/fate/stealth/one_use - reusable = FALSE - -/obj/item/dice/d20/fate/stealth/cursed - rigged = DICE_TOTALLY_RIGGED - rigged_value = 1 - -/obj/item/dice/d20/fate/stealth/cursed/one_use - reusable = FALSE - -/obj/item/dice/d20/fate/diceroll(mob/user) - . = ..() - if(!used) - if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) - to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans!")) - return - - if(!reusable) - used = TRUE - - var/turf/T = get_turf(src) - T.visible_message(span_userdanger("[src] flares briefly.")) - - addtimer(CALLBACK(src, PROC_REF(effect), user, .), 1 SECONDS) - -/obj/item/dice/d20/fate/equipped(mob/user, slot) - . = ..() - if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) - to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.")) - user.dropItemToGround(src) - - -/obj/item/dice/d20/fate/proc/effect(mob/living/carbon/human/user,roll) - var/turf/T = get_turf(src) - switch(roll) - if(1) - //Dust - T.visible_message(span_userdanger("[user] turns to dust!")) - user.hellbound = TRUE - user.dust() - if(2) - //Death - T.visible_message(span_userdanger("[user] suddenly dies!")) - user.death() - if(3) - //Swarm of creatures - T.visible_message(span_userdanger("A swarm of creatures surround [user]!")) - for(var/direction in GLOB.alldirs) - new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction)) - if(4) - //Destroy Equipment - T.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!")) - for(var/obj/item/I in user) - if(istype(I, /obj/item/implant)) - continue - qdel(I) - if(5) - //Monkeying - T.visible_message(span_userdanger("[user] transforms into a monkey!")) - user.monkeyize() - if(6) - //Cut speed - T.visible_message(span_userdanger("[user] starts moving slower!")) - user.add_movespeed_modifier(/datum/movespeed_modifier/die_of_fate) - if(7) - //Throw - T.visible_message(span_userdanger("Unseen forces throw [user]!")) - user.Stun(60) - user.adjustBruteLoss(50) - var/throw_dir = pick(GLOB.cardinals) - var/atom/throw_target = get_edge_target_turf(user, throw_dir) - user.throw_at(throw_target, 200, 4) - if(8) - //Fueltank Explosion - T.visible_message(span_userdanger("An explosion bursts into existence around [user]!")) - explosion(get_turf(user),-1,0,2, flame_range = 2) - if(9) - //Cold - var/datum/disease/D = new /datum/disease/cold() - T.visible_message(span_userdanger("[user] looks a little under the weather!")) - user.ForceContractDisease(D, FALSE, TRUE) - if(10) - //Nothing - T.visible_message(span_userdanger("Nothing seems to happen.")) - if(11) - //Cookie - T.visible_message(span_userdanger("A cookie appears out of thin air!")) - var/obj/item/food/cookie/C = new(drop_location()) - do_smoke(0, drop_location()) - C.name = "Cookie of Fate" - if(12) - //Healing - T.visible_message(span_userdanger("[user] looks very healthy!")) - user.revive(full_heal = TRUE, admin_revive = TRUE) - if(13) - //Mad Dosh - T.visible_message(span_userdanger("Mad dosh shoots out of [src]!")) - var/turf/Start = get_turf(src) - for(var/direction in GLOB.alldirs) - var/turf/dirturf = get_step(Start,direction) - if(rand(0,1)) - new /obj/item/spacecash/bundle/c1000(dirturf) - else - var/obj/item/storage/bag/money/M = new(dirturf) - for(var/i in 1 to rand(5,50)) - new /obj/item/coin/gold(M) - if(14) - //Free Gun - T.visible_message(span_userdanger("An impressive gun appears!")) - do_smoke(0, drop_location()) - new /obj/item/gun/ballistic/revolver/mateba(drop_location()) - if(15) - //Random One-use spellbook - T.visible_message(span_userdanger("A magical looking book drops to the floor!")) - do_smoke(0, drop_location()) - new /obj/item/book/granter/spell/random(drop_location()) - if(16) - //Servant & Servant Summon - T.visible_message(span_userdanger("A Dice Servant appears in a cloud of smoke!")) - var/mob/living/carbon/human/H = new(drop_location()) - do_smoke(0, drop_location()) - - H.equipOutfit(/datum/outfit/butler) - var/datum/mind/servant_mind = new /datum/mind() - var/datum/antagonist/magic_servant/A = new - servant_mind.add_antag_datum(A) - A.setup_master(user) - servant_mind.transfer_to(H) - - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") - H.key = C.key - - var/obj/effect/proc_holder/spell/targeted/summonmob/S = new - S.target_mob = H - user.mind.AddSpell(S) - - if(17) - //Tator Kit - T.visible_message(span_userdanger("A suspicious box appears!")) - new /obj/item/storage/box/syndicate/bundle_A(drop_location()) - do_smoke(0, drop_location()) - if(18) - //Captain ID - T.visible_message(span_userdanger("A golden identification card appears!")) - new /obj/item/card/id/captains_spare(drop_location()) - do_smoke(0, drop_location()) - if(19) - //Instrinct Resistance - T.visible_message(span_userdanger("[user] looks very robust!")) - user.physiology.brute_mod *= 0.5 - user.physiology.burn_mod *= 0.5 - - if(20) - //Free wizard! //NOT ANY MORE FUCKING CHRIST - T.visible_message(span_userdanger("Magic arches out of [src] and into ground under [user]!")) - new /obj/item/clothing/suit/wizrobe(drop_location()) - new /obj/item/clothing/head/wizard(drop_location()) - new /obj/item/clothing/gloves/combat/wizard(drop_location()) - new /obj/item/staff(drop_location()) - new /obj/structure/mirror/magic(drop_location()) - -/datum/outfit/butler - name = "Butler" - uniform = /obj/item/clothing/under/suit/black_really - shoes = /obj/item/clothing/shoes/laceup - gloves = /obj/item/clothing/gloves/color/white - /obj/effect/proc_holder/spell/targeted/summonmob name = "Summon Servant" desc = "This spell can be used to call your servant, whenever you need it." diff --git a/code/modules/cargo/blackmarket/packs/consumables.dm b/code/modules/cargo/blackmarket/packs/consumables.dm index 1eeb2faf887..45a0296c56f 100644 --- a/code/modules/cargo/blackmarket/packs/consumables.dm +++ b/code/modules/cargo/blackmarket/packs/consumables.dm @@ -43,7 +43,7 @@ /datum/blackmarket_item/consumable/syndie_cigs name = "Syndicate Cigarettes" - desc = "Who said smoking was bad for you? These omnizine laced cigarettes will have you feeling like a million bucks!" + desc = "Who said smoking was bad for you? These Panacea laced cigarettes will have you feeling like a million bucks!" item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost_min = 50 @@ -77,7 +77,7 @@ /datum/blackmarket_item/consumable/stimpack name = "Stimpack" desc = "A quick inject medipen loaded with a cocktail of powerful stimulants. Side effects may include nasuea, heartburn, constipation, weight loss, increased blood pressure, kidney stones, liver damage, mood swings, mania, anemia, weight gain, total organ failure, runny nose and minor retinal irritation." - item = /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor + item = /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis stock_min = 4 stock_max = 6 @@ -294,6 +294,16 @@ availability_prob = 30 spawn_weighting = FALSE +/datum/blackmarket_item/consumable/nesah + name = "Nesah Injector" + desc = "Other day some dude with black hair called us up and started talkin about some grand plan. Grand plan to sell merch, we assume, because he offloaded way too fuckin many of these injectors. Our chems guy said it's just a healing injector, so go fuckin wild. " + item = /obj/item/reagent_containers/hypospray/medipen/netzach + cost_min = 500 + cost_max = 1000 + stock_max = 12 + availability_prob = 50 + spawn_weighting = FALSE + /datum/blackmarket_item/consumable/finobranc name = "Finobranc Tablets" desc = "So get this, I know a Solarian Tgirl over the intranet, and we're chatting, and she sends me these things to try. I figure, hell yeah, try them, and got 5 days work done in one day. Now I'm sellin them. Miracle product I tell ya" diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 937f0036d53..9906e6dd3df 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -166,7 +166,6 @@ /obj/item/storage/firstaid/fire, /obj/item/defibrillator/loaded, /obj/item/reagent_containers/blood/OMinus, - /obj/item/storage/pill_bottle/mining, /obj/item/reagent_containers/pill/neurine, /obj/item/vending_refill/medical) crate_name = "medical surplus crate" @@ -226,32 +225,32 @@ /obj/item/reagent_containers/glass/bottle/vial/small) crate_name = "empty vial crate" -/datum/supply_pack/medical/vials/bica_vial - name = "Bicaridine Vial Crate" - desc = "Contains a spare bicaridine vial, for usage in a Hypospray." +/datum/supply_pack/medical/vials/indo_vial + name = "Indomide Vial Crate" + desc = "Contains a spare indomide vial, for usage in a Hypospray." cost = 400 contains = list( - /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine, + /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide, ) - crate_name = "bicaridine vial crate" + crate_name = "indomide vial crate" -/datum/supply_pack/medical/vials/kelo_vial - name = "Kelotane Vial Crate" - desc = "Contains a spare kelotane vial, for usage in a Hypospray." +/datum/supply_pack/medical/vials/alvi_vial + name = "Alvitane Vial Crate" + desc = "Contains a spare alvitane vial, for usage in a Hypospray." cost = 400 contains = list( - /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane, + /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane, ) - crate_name = "kelotane vial crate" + crate_name = "alvitane vial crate" /datum/supply_pack/medical/vials/dylo_vial - name = "Dylovene Vial Crate" + name = "Pancrazine Vial Crate" desc = "Contains a spare dylovene vial, for usage in a Hypospray." cost = 400 contains = list( - /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin, + /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine, ) - crate_name = "dylovene vial crate" + crate_name = "pancrazine vial crate" /datum/supply_pack/medical/vials/dexa_vial name = "Dexalin Vial Crate" @@ -263,13 +262,13 @@ crate_name = "dexalin vial crate" /datum/supply_pack/medical/vials/tric_vial - name = "Tricordrazine Vial Crate" - desc = "Contains a spare tricordrazine vial, for usage in a Hypospray." + name = "Cureall Vial Crate" + desc = "Contains a spare cureall vial, for usage in a Hypospray." cost = 300 contains = list( - /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord, + /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall, ) - crate_name = "tricordrazine vial crate" + crate_name = "cureall vial crate" /datum/supply_pack/medical/vials/morb_vial name = "Morphine Vial Crate" diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 72d29ce55b5..a3c3e7e6e9d 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,6 +20,7 @@ equip_delay_other = 25 resistance_flags = FLAMMABLE custom_price = 250 + alternate_worn_layer = UNDER_HEAD_LAYER /obj/item/clothing/ears/earmuffs/ComponentInitialize() . = ..() diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm index a1279f78fb0..b0317006acb 100644 --- a/code/modules/clothing/factions/clip.dm +++ b/code/modules/clothing/factions/clip.dm @@ -566,10 +566,10 @@ supports_variations = VOX_VARIATION /obj/item/storage/belt/medical/webbing/clip/prefilled/PopulateContents() - new /obj/item/reagent_containers/medigel/styptic(src) - new /obj/item/reagent_containers/medigel/styptic(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) + new /obj/item/reagent_containers/medigel/quardexane(src) + new /obj/item/reagent_containers/medigel/quardexane(src) new /obj/item/reagent_containers/medigel/synthflesh(src) new /obj/item/reagent_containers/medigel/synthflesh(src) new /obj/item/stack/medical/splint(src) diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm index 23f0c66fe41..5e0fc272b94 100644 --- a/code/modules/clothing/factions/frontiersmen.dm +++ b/code/modules/clothing/factions/frontiersmen.dm @@ -314,9 +314,9 @@ update_appearance() /obj/item/storage/belt/medical/webbing/frontiersmen/combat/PopulateContents() - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) - new /obj/item/reagent_containers/medigel/styptic(src) + new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src) + new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src) + new /obj/item/reagent_containers/medigel/quardexane(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) new /obj/item/stack/medical/gauze/twelve(src) new /obj/item/stack/medical/splint(src) diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm index 47c484c25af..5e250bd3fed 100644 --- a/code/modules/clothing/factions/gezena.dm +++ b/code/modules/clothing/factions/gezena.dm @@ -272,10 +272,10 @@ item_state = "whitecloth" /obj/item/storage/belt/medical/gezena/paramedic/PopulateContents() - new /obj/item/reagent_containers/medigel/styptic(src) - new /obj/item/reagent_containers/medigel/styptic(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) - new /obj/item/reagent_containers/medigel/silver_sulf(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) + new /obj/item/reagent_containers/medigel/hadrakine(src) + new /obj/item/reagent_containers/medigel/quardexane(src) + new /obj/item/reagent_containers/medigel/quardexane(src) new /obj/item/reagent_containers/medigel/synthflesh(src) new /obj/item/stack/medical/gauze/twelve(src) new /obj/item/stack/medical/splint(src) diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm index ad27bc6b4c0..161ef126091 100644 --- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm +++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm @@ -242,7 +242,7 @@ belt = /obj/item/storage/belt/medical/webbing/frontiersmen/combat glasses = /obj/item/clothing/glasses/hud/health - backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 3, /obj/item/ammo_box/magazine/m9mm_mauler/extended=2) + backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis = 3, /obj/item/ammo_box/magazine/m9mm_mauler/extended=2) /datum/outfit/job/frontiersmen/ert/engineer name = "ERT - Frontiersman Engineer" diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index afa588b745e..1157a10499e 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -185,10 +185,6 @@ list_reagents = list(/datum/reagent/water/holywater = 100) foodtype = NONE -/obj/item/reagent_containers/food/drinks/bottle/holywater/hell - desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list(/datum/reagent/hellwater = 100) - /obj/item/reagent_containers/food/drinks/bottle/vermouth name = "Whitespear Dry Vermouth" desc = "Dry and sweet vermouth, commonly used for mixed drinks. Some Solarians drink it as a digestive before meals." diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index cbaf24e8c97..2066506e6c5 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -651,7 +651,7 @@ /datum/chemical_reaction/molten_bubbles results = list(/datum/reagent/consumable/molten = 30) - required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1) + required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/hunter_extract = 1) /datum/chemical_reaction/plasma_bubbles results = list(/datum/reagent/consumable/molten/plasma_fizz = 3) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 09a31d99fca..a4de7ccd4eb 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -24,7 +24,7 @@ icon_dead = "ambrosia-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) - reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/medicine/bicaridine = 0.1, /datum/reagent/medicine/kelotane = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1) + reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/medicine/indomide = 0.1, /datum/reagent/medicine/alvitane = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1) /obj/item/food/grown/ambrosia/vulgaris seed = /obj/item/seeds/ambrosia @@ -41,7 +41,7 @@ plantname = "Ambrosia Deus" product = /obj/item/food/grown/ambrosia/deus mutatelist = list(/obj/item/seeds/ambrosia/gaia) - reagents_add = list(/datum/reagent/medicine/omnizine = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) + reagents_add = list(/datum/reagent/medicine/panacea = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) rarity = 40 research = PLANT_RESEARCH_TIER_2 diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 3b5b0bd8852..f97ea9d3b83 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -237,7 +237,7 @@ species = "greengrape" plantname = "Green-Grape Vine" product = /obj/item/food/grown/grapes/green - reagents_add = list(/datum/reagent/medicine/kelotane = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1) + reagents_add = list(/datum/reagent/medicine/alvitane = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1) // No rarity: technically it's a beneficial mutant, but it's not exactly "new"... mutatelist = list() research = PLANT_RESEARCH_TIER_0//see above diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index e82802745a3..b786be69435 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -51,7 +51,7 @@ plantname = "Lifeweed" product = /obj/item/food/grown/cannabis/white mutatelist = list() - reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15) + reagents_add = list(/datum/reagent/medicine/panacea = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15) rarity = 40 research = PLANT_RESEARCH_TIER_3 diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index 21f6994fd9c..4ba942ff2fd 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -38,7 +38,7 @@ product = /obj/item/food/grown/vanillapod genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list() - reagents_add = list(/datum/reagent/consumable/vanilla = 0.25, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/medicine/antitoxin = 0.2) + reagents_add = list(/datum/reagent/consumable/vanilla = 0.25, /datum/reagent/consumable/nutriment = 0.1) research = PLANT_RESEARCH_TIER_0 //nothing new, technically /obj/item/food/grown/vanillapod diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index d43cae2aa01..86358e79b22 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -15,7 +15,7 @@ icon_grow = "poppy-grow" icon_dead = "poppy-dead" mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily) - reagents_add = list(/datum/reagent/medicine/bicaridine = 0.2, /datum/reagent/consumable/nutriment = 0.05) + reagents_add = list(/datum/reagent/medicine/indomide = 0.2, /datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/poppy seed = /obj/item/seeds/poppy diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 1a91acc8a51..3f6d8133226 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -11,7 +11,7 @@ growthstages = 5 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/attack/nettle_attack, /datum/plant_gene/trait/backfire/nettle_burn) mutatelist = list(/obj/item/seeds/nettle/death) - reagents_add = list(/datum/reagent/toxin/acid = 0.5) + reagents_add = list(/datum/reagent/toxin/acid = 0.5, /datum/reagent/medicine/neoxanthin = 0.25) /obj/item/seeds/nettle/Initialize(mapload,nogenes) . = ..() @@ -50,7 +50,7 @@ bite_consumption_mod = 2 lefthand_file = 'icons/mob/inhands/weapons/plants_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi' - damtype = "fire" + damtype = BURN force = 15 hitsound = 'sound/weapons/bladeslice.ogg' throwforce = 5 diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 611de0ce5ca..437bd7f2ae9 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -84,9 +84,6 @@ else if(M.ckey == ckey && M.stat == DEAD) make_podman = TRUE - if(isliving(M)) - var/mob/living/L = M - make_podman = !L.hellbound break else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key for(var/mob/M in GLOB.player_list) @@ -96,9 +93,6 @@ if(!O.can_reenter_corpse) break make_podman = TRUE - if(isliving(M)) - var/mob/living/L = M - make_podman = !L.hellbound ckey_holder = M.ckey break diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 8ba2d38a33b..a9f2bab5caf 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -80,6 +80,7 @@ slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD force = 0 w_class = WEIGHT_CLASS_SMALL + alternate_worn_layer = UNDER_HEAD_LAYER custom_price = 125 instrument_range = 1 diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear/underwear_torso.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear/underwear_torso.dm index c48f679bf6f..85a9a587f41 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/underwear/underwear_torso.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear/underwear_torso.dm @@ -96,6 +96,18 @@ name = "Short Sleeve Button-Down (Greyscale)" icon_state = "button_short" +/datum/sprite_accessory/undershirt/croptank + name = "Cropped Tank Top (Greyscale)" + icon_state = "croptank" + +/datum/sprite_accessory/undershirt/cropshort + name = "Cropped Short Sleeve (Greyscale)" + icon_state = "cropshortsleeve" + +/datum/sprite_accessory/undershirt/croptshirt + name = "Cropped T-shirt (Greyscale)" + icon_state = "croptshirt" + /datum/sprite_accessory/undershirt/band name = "T-Shirt (Band)" icon_state = "band" diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index b4880eb5072..fe91d9b9799 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -33,6 +33,19 @@ return emote("scream") +/mob/proc/force_pain_noise(power) + if(HAS_TRAIT(src, TRAIT_ANALGESIA)) + power = power/4 + if(HAS_TRAIT(src, TRAIT_PAIN_RESIST)) + power = power/2 + switch(power) + if(10 to 25) + emote("gasp") + if(25 to 50) + emote("groan") + if(50 to INFINITY) // PENTEST FIX - Shiptest accidently set this to a maximum of 100, but has some effects have powers greater than 100 + emote("scream") + /mob/proc/force_manual_scream() if(HAS_TRAIT(src, TRAIT_ANALGESIA)) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5e10d67f5e2..98efd0f9dff 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -925,7 +925,7 @@ /mob/living/carbon/proc/can_defib() var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if (hellbound || HAS_TRAIT(src, TRAIT_HUSK)) + if (HAS_TRAIT(src, TRAIT_HUSK)) return if((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE)) return diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 59726dcacb4..2adbcee1976 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -136,8 +136,6 @@ just_sleeping = TRUE if(!just_sleeping) - if(hellbound) - . += span_warning("[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.") . += "" if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(even_if_they_cant_reenter = FALSE, ghosts_with_clients = FALSE)) //PENTEST EDIT START . += span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has moved on. [t_He] won't be coming back...") diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c67a58f0048..c41f67cc190 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -124,8 +124,6 @@ var/list/guaranteed_butcher_results = null ///these will always be yielded from butchering var/butcher_difficulty = 0 ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier - var/hellbound = 0 ///People who've signed infernal contracts are unrevivable. - var/list/weather_immunities = list() var/stun_absorption = null ///converted to a list of stun absorption sources this mob has when one is added diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm index bac09fde17a..8300da19999 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm @@ -315,15 +315,15 @@ for(var/i = 1 to 3) if(prob(75)) backpack_contents += pick_weight(list( - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, + /obj/item/reagent_containers/pill/patch/indomide = 5, + /obj/item/reagent_containers/pill/patch/alvitane = 5, /obj/item/storage/firstaid/medical = 3, /obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/glass/beaker = 2, /obj/item/reagent_containers/dropper = 2, /obj/item/reagent_containers/pill/charcoal = 2, - /obj/item/reagent_containers/medigel/styptic = 2, - /obj/item/reagent_containers/medigel/silver_sulf = 2, + /obj/item/reagent_containers/medigel/quardexane = 2, + /obj/item/reagent_containers/medigel/hadrakine = 2, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/flashlight/pen = 1, /obj/item/hypospray/mkii = 1, diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index d052f111e9d..2d24e57b9fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -191,5 +191,5 @@ for(counter=0, counter<=powerlevel, counter++) var/obj/item/food/hugemushroomslice/S = new /obj/item/food/hugemushroomslice(src.loc) S.reagents.add_reagent(/datum/reagent/drug/mushroomhallucinogen, powerlevel) - S.reagents.add_reagent(/datum/reagent/medicine/omnizine, powerlevel) + S.reagents.add_reagent(/datum/reagent/medicine/panacea, powerlevel) S.reagents.add_reagent(/datum/reagent/medicine/synaptizine, powerlevel) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 223e7d984b3..5940c567a63 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -59,8 +59,6 @@ O.dna.default_mutation_genes = dna.default_mutation_genes O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT)) - if(hellbound) - O.hellbound = hellbound O.a_intent = INTENT_HARM //keep viruses? @@ -236,9 +234,6 @@ O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT)) O.domutcheck() - if(hellbound) - O.hellbound = hellbound - //keep viruses? if (tr_flags & TR_KEEPVIRUS) O.diseases = diseases diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index a66baa6c516..e533cdd6d69 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -45,3 +45,9 @@ /datum/movespeed_modifier/reagent/shock_wine multiplicative_slowdown = -0.30 + +/datum/movespeed_modifier/reagent/silfrine + multiplicative_slowdown = 0.2 + +/datum/movespeed_modifier/reagent/silfrine_od + multiplicative_slowdown = 0.4 diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm index 98c2b012c55..5cb43543056 100644 --- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -10,7 +10,7 @@ use_power = NO_POWER_USE var/static/list/shortcuts = list( "meth" = /datum/reagent/drug/methamphetamine, - "tricord" = /datum/reagent/medicine/tricordrazine + "cureall" = /datum/reagent/medicine/cureall ) /obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm deleted file mode 100644 index b7becfa6e6e..00000000000 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ /dev/null @@ -1,519 +0,0 @@ -// Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful. -/datum/reagent/medicine/c2 - name = "Category two reagent" - harmful = TRUE - metabolization_rate = 0.2 - -/******BRUTE******/ -/*Suffix: -bital*/ - -/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit. - name = "Helbital" - description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." - color = "#9400D3" - taste_description = "cold and lifeless" - overdose_threshold = 35 - reagent_state = SOLID - var/helbent = FALSE - var/reaping = FALSE - -/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M) - . = TRUE - var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss()) - var/thou_shall_heal = 0 - var/good_kind_of_healing = FALSE - switch(M.stat) - if(CONSCIOUS) //bad - thou_shall_heal = death_is_coming/50 - M.adjustOxyLoss(2, TRUE) - if(SOFT_CRIT) //meh convert - thou_shall_heal = round(death_is_coming/47,0.1) - M.adjustOxyLoss(1, TRUE) - else //no convert - thou_shall_heal = round(death_is_coming/45,0.1) - good_kind_of_healing = TRUE - M.adjustBruteLoss(-thou_shall_heal, FALSE) - - if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper! - reaping = TRUE - var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to - if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING)) - helbent = TRUE - to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?")) - var/timeisticking = world.time - var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors - if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time)) - reaping = FALSE - return //good job, you ruined it - if(!RPSchoice) - to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon.")) - reaping = FALSE - return - var/grim = pick(RockPaperScissors) - if(grim == RPSchoice) //You Tied! - to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) - reaping = FALSE - else if(RockPaperScissors[RPSchoice] == grim) //You lost! - to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) - M.dust() - return - else //VICTORY ROYALE - to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) - M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M) - M.revive(full_heal = TRUE, admin_revive = FALSE) - M.reagents.del_reagent(type) - return - - ..() - return - -/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M) - if(!helbent) - M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) - helbent = TRUE - ..() - return TRUE - -/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L) - if(helbent) - L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) - ..() - -/datum/reagent/medicine/c2/libital //messes with your liber - name = "Libital" - description = "A bruise reliever. Does minor liver damage." - color = "#ECEC8D" // rgb: 236 236 141 - taste_description = "bitter with a hint of alcohol" - reagent_state = SOLID - -/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3*REM) - M.adjustBruteLoss(-3*REM) - ..() - return TRUE - -/*WS Begin - Medicine Fixes - -/datum/reagent/medicine/c2/probital - name = "Probital" - description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further." - reagent_state = SOLID - color = "#FFFF6B" - overdose_threshold = 20 - -/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-2.25*REM, FALSE) - var/ooo_youaregettingsleepy = 3.5 - switch(round(M.getStaminaLoss())) - if(10 to 40) - ooo_youaregettingsleepy = 3 - if(41 to 60) - ooo_youaregettingsleepy = 2.5 - if(61 to 200) //you really can only go to 120 - ooo_youaregettingsleepy = 2 - M.adjustStaminaLoss(ooo_youaregettingsleepy*REM, FALSE) - ..() - . = TRUE - -/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M) - M.adjustStaminaLoss(3*REM, 0) - if(M.getStaminaLoss() >= 80) - M.drowsyness++ - if(M.getStaminaLoss() >= 100) - to_chat(M,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit...")) - M.adjustStaminaLoss(-100, TRUE) - M.Sleeping(10 SECONDS) - ..() - . = TRUE - -/datum/reagent/medicine/c2/probital/on_transfer(atom/A, method=INGEST, trans_volume) - if(method != INGEST || !iscarbon(A)) - return - - A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05) - A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) - - ..() - -WS End */ - -/******BURN******/ -/*Suffix: -uri*/ -/datum/reagent/medicine/c2/lenturi - name = "Lenturi" - description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system." - reagent_state = LIQUID - color = "#6171FF" - var/resetting_probability = 0 - var/spammer = 0 - -/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-3 * REM) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM) - ..() - return TRUE - -/datum/reagent/medicine/c2/lenturi/on_mob_metabolize(mob/living/carbon/M) - M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() - -/datum/reagent/medicine/c2/lenturi/on_mob_end_metabolize(mob/living/carbon/M) - M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() - -/datum/reagent/medicine/c2/aiuri - name = "Aiuri" - description = "Used to treat burns. Does minor eye damage." - reagent_state = LIQUID - color = "#8C93FF" - var/resetting_probability = 0 - var/message_cd = 0 - -/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM) - M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM) - ..() - return TRUE - -/*WS Begin - Fixes Medicines - -/datum/reagent/medicine/c2/hercuri - name = "Hercuri" - description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia." - reagent_state = LIQUID - color = "#F7FFA5" - overdose_threshold = 25 - reagent_weight = 0.6 - -/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M) - if(M.getFireLoss() > 50) - M.adjustFireLoss(-2*REM, FALSE) - else - M.adjustFireLoss(-1.25*REM, FALSE) - M.adjust_bodytemperature(rand(-25,-5)*(TEMPERATURE_DAMAGE_COEFFICIENT*REM), 50) - M.reagents?.chem_temp +=(-10*REM) - M.adjust_fire_stacks(-1) - ..() - . = TRUE - -/datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume) - if(method != VAPOR) - return - - M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - M.adjust_fire_stacks(-reac_volume / 2) - if(reac_volume >= metabolization_rate) - M.ExtinguishMob() - - ..() - -/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M) - M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly - ..() - -WS End*/ - -/******OXY******/ -/*Suffix: -mol*/ -#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox - -/datum/reagent/medicine/c2/convermol - name = "Convermol" - description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." - reagent_state = LIQUID - color = "#FF6464" - overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long - -/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M) - var/oxycalc = 2.5*REM*current_cycle - if(!overdosed) - oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. - M.adjustOxyLoss(-oxycalc, 0) - M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0) - if(prob(current_cycle) && M.losebreath) - M.losebreath-- - ..() - return TRUE - -/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M) - metabolization_rate += 1 - ..() - return TRUE - -#undef CONVERMOL_RATIO - -/datum/reagent/medicine/c2/tirimol - name = "Tirimol" - description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes." - color = "#FF6464" - var/drowsycd = 0 - -/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M) - M.adjustOxyLoss(-3) - M.adjustStaminaLoss(2) - if(drowsycd && (world.time > drowsycd)) - M.drowsyness += 10 - drowsycd = world.time + (45 SECONDS) - else if(!drowsycd) - drowsycd = world.time + (15 SECONDS) - ..() - return TRUE - -/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L) - if(current_cycle > 20) - L.Sleeping(10 SECONDS) - ..() - -/******TOXIN******/ -/*Suffix: -iver*/ - -/datum/reagent/medicine/c2/seiver //a bit of a gray joke - name = "Seiver" - description = "A medicine that shifts functionality based on temperature. Colder temperatures incurs radiation removal while hotter temperatures promote antitoxicity. Damages the heart." //CHEM HOLDER TEMPS, NOT AIR TEMPS - var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads. - -/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/M) - . = ..() - radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once. - -/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/M) - var/chemtemp = min(holder.chem_temp, 1000) - chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty - var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints - - //you're hot - var/toxcalc = min(round((chemtemp-1000)/175+5,0.1),5) //max 5 tox healing a tick - if(toxcalc > 0) - M.adjustToxLoss(toxcalc*-1) - healypoints += toxcalc - - //and you're cold - var/radcalc = round((T0C-chemtemp)/6,0.1) //max ~45 rad loss unless you've hit below 0K. if so, wow. - if(radcalc > 0) - //no cost percent healing if you are SUPER cold (on top of cost healing) - if(chemtemp < radbonustemp*0.1) //if you're super chilly, it takes off 25% of your current rads - M.radiation = round(M.radiation * 0.75) - else if(chemtemp < radbonustemp)//else if you're under the chill-zone, it takes off 10% of your current rads - M.radiation = round(M.radiation * 0.9) - M.radiation -= radcalc - healypoints += (radcalc/5) - - - //you're yes and... oh no! - healypoints = round(healypoints,0.1) - M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints/5) - ..() - return TRUE - -/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines - name = "Multiver" - description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)." - -/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M) - var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 - for(var/r in M.reagents.reagent_list) - var/datum/reagent/the_reagent = r - if(istype(the_reagent, /datum/reagent/medicine)) - medibonus += 1 - M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u - for(var/r2 in M.reagents.reagent_list) - var/datum/reagent/the_reagent2 = r2 - if(the_reagent2 == src) - continue - var/amount2purge = 3 - if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines - continue - M.reagents.remove_reagent(the_reagent2.type, amount2purge) - ..() - return TRUE - -#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either - -/*WS Begin - Medicine Fixes - -/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge - name = "Syriniver" - description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver." - reagent_state = LIQUID - color = "#8CDF24" // heavy saturation to make the color blend better - metabolization_rate = 0.75 * REAGENTS_METABOLISM - overdose_threshold = 6 - var/conversion_amount - -/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume) - if(method != INJECT || !iscarbon(A)) - return - var/mob/living/carbon/C = A - if(trans_volume >= 0.6) //prevents cheesing with ultralow doses. - C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel. - var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER] - if((L.organ_flags & ORGAN_FAILING) || !L) - return - conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize. - C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount) - C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount) - ..() - -/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8) - M.adjustToxLoss(-1*REM, 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(issyrinormusc(R)) - continue - M.reagents.remove_reagent(R.type,0.4) - - ..() - . = 1 - -/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) - M.adjust_disgust(3) - M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM) - ..() - . = 1 - -/datum/reagent/medicine/c2/musiver //MUScles - name = "Musiver" - description = "The active metabolite of syriniver. Causes muscle weakness on overdose" - reagent_state = LIQUID - color = "#DFD54E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 25 - var/datum/brain_trauma/mild/muscle_weakness/U - -/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1) - M.adjustToxLoss(-1*REM, 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(issyrinormusc(R)) - continue - M.reagents.remove_reagent(R.type,0.2) - ..() - . = 1 - -/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M) - U = new() - M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE) - ..() - -/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M) - if(U) - QDEL_NULL(U) - return ..() - -/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) - M.adjust_disgust(3) - ..() - . = 1 - -#undef issyrinormusc - -WS End*/ - -/******COMBOS******/ -/*Suffix: Combo of healing, prob gonna get wack REAL fast*/ - - - -/* fucking whitesands left this in code while we had the OTHER synthflesh -/datum/reagent/medicine/c2/instabitaluri - name = "Synthflesh (Instabitaluri)" - description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only." - reagent_state = LIQUID - color = "#FFEBEB" - -/datum/reagent/medicine/c2/instabitaluri/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) - if(iscarbon(M)) - var/mob/living/carbon/carbies = M - if (carbies.stat == DEAD) - show_message = 0 - if(method in list(PATCH, TOUCH, SMOKE)) - var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) - var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) - for(var/i in carbies.all_wounds) - var/datum/wound/iter_wound = i - iter_wound.on_synthflesh(reac_volume) - carbies.adjustToxLoss((harmies+burnies)*0.66) - if(show_message) - to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) - SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100)) - carbies.cure_husk("burn") - carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something - ..() - return TRUE -*/ - -/******ORGAN HEALING******/ -/*Suffix: -rite*/ -/* -*How this medicine works: -*Penthrite if you are not in crit only stabilizes your heart. -*As soon as you pass crit threshold it's special effects kick in. Penthrite forces your heart to beat preventing you from entering -*soft and hard crit, but there is a catch. During this you will be healed and you will sustain -*heart damage that will not imapct you as long as penthrite is in your system. -*If you reach the threshold of -60 HP penthrite stops working and you get a heart attack, penthrite is flushed from your system in that very moment, -*causing you to loose your soft crit, hard crit and heart stabilization effects. -*Overdosing on penthrite also causes a heart failure. -*/ -/datum/reagent/medicine/c2/penthrite - name = "Penthrite" - description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. It reacts violently with other emergency medication." - color = "#F5F5F5" - overdose_threshold = 50 - -/datum/reagent/medicine/c2/penthrite/on_mob_add(mob/living/M) - . = ..() - to_chat(M,"Your heart begins to beat with great force!") - ADD_TRAIT(M, TRAIT_STABLEHEART, type) - ADD_TRAIT(M, TRAIT_NOHARDCRIT,type) - ADD_TRAIT(M, TRAIT_NOSOFTCRIT,type) - M.crit_threshold = M.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! - - -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H) - H.adjustOrganLoss(ORGAN_SLOT_STOMACH,0.25) - if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > H.crit_threshold) //we cannot save someone above our raised crit threshold. - - H.adjustToxLoss(-2 * REM, 0) - H.adjustBruteLoss(-2 * REM, 0) - H.adjustFireLoss(-2 * REM, 0) - H.adjustOxyLoss(-6 * REM, 0) - - H.losebreath = 0 - - H.adjustOrganLoss(ORGAN_SLOT_HEART,max(1,volume/10)) // your heart is barely keeping up! - - H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - - - if(prob(33)) - to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!")) - - if(H.health <= H.crit_threshold) //certain death above this threshold - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack - to_chat(H,span_danger("You feel something rupturing inside your chest!")) - H.force_scream() - H.set_heartattack(TRUE) - volume = 0 - . = ..() - -/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/M) - M.crit_threshold = M.crit_threshold - HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! - REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(M, TRAIT_NOHARDCRIT,type) - REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT,type) - . = ..() - -/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H) - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) - H.adjustStaminaLoss(10) - H.adjustOrganLoss(ORGAN_SLOT_HEART,10) - H.set_heartattack(TRUE) - - -/******NICHE******/ -//todo diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm new file mode 100644 index 00000000000..9cdf5d2a1d1 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm @@ -0,0 +1,8 @@ +/datum/reagent/medicine + name = "Medicine" + taste_description = "bitterness" + category = "Medicine" + +/datum/reagent/medicine/on_mob_life(mob/living/carbon/M) + current_cycle++ + holder.remove_reagent(type, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm new file mode 100644 index 00000000000..2e6f3c8adcc --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm @@ -0,0 +1,129 @@ +/* Reagents that primarily interface with blood and bleeding +** chitosan I guess +*/ + + +// helps bleeding wounds clot faster +/datum/reagent/medicine/chitosan + name = "Chitosan" + description = "Vastly improves the blood's natural ability to coagulate and stop bleeding by hightening platelet production and effectiveness. Overdosing will cause extreme blood clotting, resulting in potential brain damage." + reagent_state = LIQUID + color = "#bb2424" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 20 + /// The bloodiest wound that the patient has will have its blood_flow reduced by this much each tick + var/clot_rate = 0.3 + /// While this reagent is in our bloodstream, we reduce all bleeding by this factor + var/passive_bleed_modifier = 0.7 + /// For tracking when we tell the person we're no longer bleeding + var/was_working + +/datum/reagent/medicine/chitosan/on_mob_metabolize(mob/living/M) + ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan) + + if(!ishuman(M)) + return + + var/mob/living/carbon/human/blood_boy = M + blood_boy.physiology?.bleed_mod *= passive_bleed_modifier + return ..() + +/datum/reagent/medicine/chitosan/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan) + + if(was_working) + to_chat(M, span_warning("The medicine thickening your blood loses its effect!")) + if(!ishuman(M)) + return + + var/mob/living/carbon/human/blood_boy = M + blood_boy.physiology?.bleed_mod /= passive_bleed_modifier + + return ..() + +/datum/reagent/medicine/chitosan/on_mob_life(mob/living/carbon/M) + . = ..() + if(!M.blood_volume || !M.all_wounds) + return + + var/datum/wound/bloodiest_wound + + for(var/i in M.all_wounds) + var/datum/wound/iter_wound = i + if(iter_wound.blood_flow) + if(iter_wound.blood_flow > bloodiest_wound?.blood_flow) + bloodiest_wound = iter_wound + + if(bloodiest_wound) + if(!was_working) + to_chat(M, span_green("You can feel your flowing blood start thickening!")) + was_working = TRUE + bloodiest_wound.blood_flow = max(0, bloodiest_wound.blood_flow - clot_rate) + else if(was_working) + was_working = FALSE + +/datum/reagent/medicine/chitosan/overdose_process(mob/living/carbon/M) + . = ..() + if(!M.blood_volume) + return + + if(prob(15)) + M.losebreath += rand(2,4) + M.adjustOxyLoss(rand(1,3)) + if(prob(30)) + to_chat(M, span_danger("You can feel your blood clotting up in your veins!")) + else if(prob(10)) + to_chat(M, span_userdanger("You feel like your blood has stopped moving!")) + M.adjustOxyLoss(rand(3,4)) + + if(prob(50)) + var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) + our_lungs.applyOrganDamage(1) + else if(prob(25)) + var/obj/item/organ/lungs/our_brain = M.getorganslot(ORGAN_SLOT_BRAIN) + our_brain.applyOrganDamage(1) + else + var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) + our_heart.applyOrganDamage(1) + +/datum/reagent/medicine/salglu_solution + name = "Saline-Glucose Solution" + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." + reagent_state = LIQUID + color = "#DCDCDC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 + taste_description = "sweetness and salt" + var/last_added = 0 + var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active + var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick + +/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) + if(last_added) + M.blood_volume -= last_added + last_added = 0 + if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. + var/amount_to_add = min(M.blood_volume, volume*5) + var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) + last_added = new_blood_level - M.blood_volume + M.blood_volume = new_blood_level + extra_regen + if(prob(33)) + M.adjustBruteLoss(-0.5*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) + . = TRUE + ..() + +/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) + if(prob(3)) + to_chat(M, span_warning("You feel salty.")) + holder.add_reagent(/datum/reagent/consumable/sodiumchloride, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + else if(prob(3)) + to_chat(M, span_warning("You feel sweet.")) + holder.add_reagent(/datum/reagent/consumable/sugar, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) + if(prob(33)) + M.adjustBruteLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + M.adjustFireLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + . = TRUE + ..() diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm new file mode 100644 index 00000000000..1b251d65217 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm @@ -0,0 +1,52 @@ +/* +** Reagents that are from fauna +*/ + +/datum/reagent/medicine/soulus + name = "Soulus Dust" + description = "Ground legion cores. The dust quickly seals wounds yet slowly causes the tissue to undergo necrosis." + reagent_state = SOLID + color = "#302f20" + metabolization_rate = REAGENTS_METABOLISM * 0.8 + overdose_threshold = 50 + var/tox_dam = 0.25 + +/datum/reagent/medicine/soulus/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + if(iscarbon(M) && M.stat != DEAD) + if(method in list(INGEST, INJECT)) + M.set_timed_status_effect(reac_volume SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + if(M.getFireLoss()) + M.adjustFireLoss(-reac_volume*1.2) + if(M.getBruteLoss()) + M.adjustBruteLoss(-reac_volume*1.2) + if(prob(50)) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_good, name) + else + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_bad, name) + ..() + +/datum/reagent/medicine/soulus/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-0.1*REM, 0) + M.adjustBruteLoss(-0.1*REM, 0) + M.adjustToxLoss(tox_dam*REM, 0) + ..() + +/datum/reagent/medicine/soulus/overdose_process(mob/living/M) + var/mob/living/carbon/C = M + if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) + var/obj/item/organ/legion_skull/spare_ribs = new() + spare_ribs.Insert(M) + ..() + +/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M) + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "legion") + ..() + +/datum/reagent/medicine/soulus/pure + name = "Purified Soulus Dust" + description = "Ground legion cores." + reagent_state = SOLID + color = "#302f20" + metabolization_rate = REAGENTS_METABOLISM + overdose_threshold = 100 + tox_dam = 0 diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm new file mode 100644 index 00000000000..601333f1b26 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm @@ -0,0 +1,196 @@ +/* +** reagents that come from plants +*/ + +/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. + name = "Polypyrylium Oligomers" + description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." + reagent_state = SOLID + color = "#9423FF" + metabolization_rate = 0.15 * REAGENTS_METABOLISM + overdose_threshold = 50 + taste_description = "numbing bitterness" + /// While this reagent is in our bloodstream, we reduce all bleeding by this factor + var/passive_bleed_modifier = 0.55 + /// For tracking when we tell the person we're no longer bleeding + var/was_working + +/datum/reagent/medicine/polypyr/on_mob_metabolize(mob/living/M) + ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr) + if(!ishuman(M)) + return + + var/mob/living/carbon/human/blood_boy = M + blood_boy.physiology?.bleed_mod *= passive_bleed_modifier + return ..() + +/datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr) + //should probably generic proc this at a later point. I'm probably gonna use it a bit + if(was_working) + to_chat(M, span_warning("The medicine thickening your blood loses its effect!")) + if(!ishuman(M)) + return + + var/mob/living/carbon/human/blood_boy = M + blood_boy.physiology?.bleed_mod /= passive_bleed_modifier + + return ..() + + +/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) + M.adjustBruteLoss(-0.5, 0) + ..() + . = 1 + +/datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH || method == SMOKE || method == VAPOR) + if(M && ishuman(M) && reac_volume >= 0.5) + var/mob/living/carbon/human/H = M + H.hair_color = "92f" + H.facial_hair_color = "92f" + H.update_hair() + +/datum/reagent/medicine/polypyr/overdose_process(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) + ..() + . = 1 + + +/datum/reagent/medicine/puce_essence + name = "Pucetylline Essence" + description = "Ground essence of puce crystals." + reagent_state = SOLID + color = "#CC8899" + metabolization_rate = 2.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/puce_essence/on_mob_life(mob/living/carbon/M) + if(prob(80)) + M.adjustToxLoss(-1*REM, 0) + else + M.adjustCloneLoss(-1*REM, 0) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + M.reagents.remove_reagent(R.type, 0.25) + if(holder.has_reagent(/datum/reagent/medicine/soulus)) // No, you can't chemstack with soulus dust + holder.remove_reagent(/datum/reagent/medicine/soulus, 5) + M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to puce + ..() + +/datum/reagent/medicine/puce_essence/expose_atom(atom/A, volume) + if(!iscarbon(A)) + A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) + ..() + +/datum/reagent/medicine/puce_essence/on_mob_end_metabolize(mob/living/M) + M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) puce + +/datum/reagent/medicine/puce_essence/overdose_process(mob/living/M) + M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal puce + +/datum/reagent/medicine/chartreuse // C H A R T R E U S E + name = "Chartreuse Solution" + description = "Refined essence of puce crystals." + reagent_state = SOLID + color = "#DFFF00" + metabolization_rate = 2.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/chartreuse/on_mob_life(mob/living/carbon/M) // Yes, you can chemstack with soulus dust + if(prob(80)) + M.adjustToxLoss(-2*REM, 0) + M.adjustCloneLoss(-1*REM, 0) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + M.reagents.remove_reagent(R.type, 1) + M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to chartreuse + ..() + +/datum/reagent/medicine/chartreuse/expose_atom(atom/A, volume) + if(!iscarbon(A)) + A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) + ..() + +/datum/reagent/medicine/chartreuse/on_mob_end_metabolize(mob/living/M) + M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) chartreuse + +/datum/reagent/medicine/chartreuse/overdose_process(mob/living/M) + M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal chartreuse + M.set_drugginess(15) // Also druggy + ..() + + +/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants + name = "Earthsblood" + description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain. For some strange reason, it also induces temporary pacifism in those who imbibe it and semi-permanent pacifism in those who overdose on it." + color = "#FFAF00" + metabolization_rate = 0.4 //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations. + overdose_threshold = 25 + +/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) + if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE + M.adjustBruteLoss(-1 * REM, 0) + M.adjustFireLoss(-1 * REM, 0) + M.adjustOxyLoss(-0.5 * REM, 0) + M.adjustToxLoss(-0.5 * REM, 0) + M.adjustCloneLoss(-0.1 * REM, 0) + M.adjustStaminaLoss(-0.5 * REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! + else + M.adjustBruteLoss(-5 * REM, 0) //slow to start, but very quick healing once it gets going + M.adjustFireLoss(-5 * REM, 0) + M.adjustOxyLoss(-3 * REM, 0) + M.adjustToxLoss(-3 * REM, 0) + M.adjustCloneLoss(-1 * REM, 0) + M.adjustStaminaLoss(-3 * REM, 0) + M.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/jitter, 30 SECONDS) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) + M.druggy = min(max(0, M.druggy + 10), 15) //See above + ..() + . = 1 + +/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_PACIFISM, type) + +/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_PACIFISM, type) + ..() + +/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M) + M.hallucination = min(max(0, M.hallucination + 5), 60) + if(current_cycle > 25) + M.adjustToxLoss(4 * REM, 0) + if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee + M.adjustToxLoss(6 * REM, 0) + if(iscarbon(M)) + var/mob/living/carbon/hippie = M + hippie.gain_trauma(/datum/brain_trauma/severe/pacifism) + ..() + . = 1 + +//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(type, 1)) + mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1)) + mytray.adjustPests(-rand(1,3)) + mytray.adjustWeeds (-rand(1,3)) + if(myseed) + myseed.adjust_instability(-round(chems.get_reagent_amount(type) * 1.3)) + myseed.adjust_potency(round(chems.get_reagent_amount(type))) + myseed.adjust_yield(round(chems.get_reagent_amount(type))) + myseed.adjust_endurance(round(chems.get_reagent_amount(type) * 0.5)) + myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.5)) + +/datum/reagent/medicine/neoxanthin + name = "Neoxanthin" + description = "A naturally occuring carotenoid found in several varieties of plants. Has mild antioxidant properties." + reagent_state = SOLID + color = "#CC8899" + metabolization_rate = 0.15 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/neoxanthin/on_mob_life(mob/living/carbon/M) + if(prob(80)) + M.adjustToxLoss(-1*REM, 0) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm new file mode 100644 index 00000000000..06fe6fdd906 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm @@ -0,0 +1,36 @@ +/* +** for some reason +*/ + +/datum/reagent/medicine/system_cleaner + name = "System Cleaner" + description = "Neutralizes harmful chemical compounds inside synthetic systems." + reagent_state = LIQUID + color = "#F1C40F" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + process_flags = SYNTHETIC + +/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M) + M.adjustToxLoss(-2*REM, 0) + . = 1 + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,1) + ..() + +/datum/reagent/medicine/liquid_solder + name = "Liquid Solder" + description = "Repairs brain damage in synthetics." + color = "#727272" + taste_description = "metallic" + process_flags = SYNTHETIC + +/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) + if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) + C.cure_trauma_type(BRAIN_TRAUMA_MILD) + ..() diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm new file mode 100644 index 00000000000..09e84767c81 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm @@ -0,0 +1,842 @@ +/* For chems that primarily interface with damage +** I.E. healing chems +** organized +** >brute +** >burn +** >tox +** >oxygen +** >multi +** >misc +*/ + + + +/// BRUTE CHEMS /// + +/datum/reagent/medicine/indomide + name = "Indomide" + description = "An anti-inflammatory initially isolated from a Kalixcian cave fungus. Thins the blood, and causes bruises and cuts to slowly heal. Overdose can cause sores to open along the body." + reagent_state = LIQUID + color = "#FFFF6B" + overdose_threshold = 30 + var/passive_bleed_modifier = 1.2 + +/datum/reagent/medicine/indomide/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-1*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/indomide/on_mob_metabolize(mob/living/L) + . = ..() + if(!ishuman(L)) + return + var/mob/living/carbon/human/normal_guy = L + normal_guy.physiology?.bleed_mod *= passive_bleed_modifier + +/datum/reagent/medicine/indomide/on_mob_end_metabolize(mob/living/L) + . = ..() + if(!ishuman(L)) + return + var/mob/living/carbon/human/normal_guy = L + normal_guy.physiology?.bleed_mod /= passive_bleed_modifier + + +/datum/reagent/medicine/indomide/overdose_start(mob/living/M) + . = ..() + ADD_TRAIT(M, TRAIT_BLOODY_MESS, /datum/reagent/medicine/indomide) + +/datum/reagent/medicine/indomide/overdose_process(mob/living/M) + . = ..() + M.adjustBruteLoss(0.2*REM, 0) + + if(!iscarbon(M)) + return + + var/mob/living/carbon/victim = M + + if(prob(5)) + var/obj/item/bodypart/open_sore = pick(victim.bodyparts) + if(IS_ORGANIC_LIMB(open_sore)) + open_sore.force_wound_upwards(/datum/wound/slash/moderate) + M.emote("gasps") + +/datum/reagent/medicine/indomide/on_mob_end_metabolize(mob/living/L) + . = ..() + REMOVE_TRAIT(L, TRAIT_BLOODY_MESS, /datum/reagent/medicine/indomide) + +/datum/reagent/medicine/indomide/on_transfer(atom/A, method=INGEST, trans_volume) + if(method != INGEST || !istype(A, /obj/item/organ/stomach)) + return + + A.reagents.remove_reagent(/datum/reagent/medicine/indomide, trans_volume * 0.05) + A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) + + ..() + +/datum/reagent/medicine/metafactor + name = "Mitogen Metabolism Factor" + description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." + //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. + metabolization_rate = 0.0625 * REAGENTS_METABOLISM + reagent_state = SOLID + color = "#FFBE00" + overdose_threshold = 10 + +/datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/M) + metabolization_rate = 2 * REAGENTS_METABOLISM + +/datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/M) + if(prob(25)) + M.vomit() + ..() + + +/datum/reagent/medicine/hadrakine + name = "Hadrakine Powder" + description = "An aluminum based styptic that rapidly seals flesh wounds upon administration, and lingers in the blood stream, causing slightly reduced blood flow, and stimulating healing of further, minor injuries. Overdose causes blood clotting, shortness of breath, and potential brain damage." + reagent_state = LIQUID + color = "#FF9696" + overdose_threshold = 45 + var/passive_bleed_modifier = 0.9 + var/overdose_bleed_modifier = 0.3 + var/brute_damage_modifier = 1.5 + +/datum/reagent/medicine/hadrakine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + if(iscarbon(M) && M.stat != DEAD) + if(method in list(INGEST, VAPOR, INJECT)) + M.adjustToxLoss(0.5*reac_volume) + if(show_message) + to_chat(M, span_warning("You don't feel so good...")) + else if(M.getBruteLoss()) + M.adjustBruteLoss(-reac_volume) + var/pain_points = M.adjustStaminaLoss(reac_volume*4) + M.force_pain_noise(pain_points) + if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_danger("You feel your bruises healing! It stings like hell!")) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + else + to_chat(M, span_notice("You feel your bruises throbbing.")) + ..() + + +/datum/reagent/medicine/hadrakine/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-2*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/hadrakine/on_mob_metabolize(mob/living/L) + . = ..() + if(!ishuman(L)) + return + var/mob/living/carbon/human/normal_guy = L + normal_guy.physiology?.bleed_mod *= passive_bleed_modifier + +/datum/reagent/medicine/hadrakine/on_mob_end_metabolize(mob/living/L) + . = ..() + if(!ishuman(L)) + return + var/mob/living/carbon/human/normal_guy = L + normal_guy.physiology?.bleed_mod /= passive_bleed_modifier + if(overdosed) + normal_guy.physiology?.bleed_mod /= overdose_bleed_modifier + normal_guy.physiology?.brute_mod /= brute_damage_modifier + +/datum/reagent/medicine/hadrakine/overdose_start(mob/living/M) + . = ..() + + if(!ishuman(M)) + return + + var/mob/living/carbon/human/overdose_victim = M + overdose_victim.physiology?.bleed_mod *= overdose_bleed_modifier + overdose_victim.physiology?.brute_mod *= brute_damage_modifier + +/datum/reagent/medicine/hadrakine/overdose_process(mob/living/M) + M.adjustBruteLoss(0.5*REM, 0) + M.adjustToxLoss(0.5, 0) + if(prob(25)) + M.losebreath++ + if(prob(10)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) + ..() + . = 1 + +/datum/reagent/medicine/silfrine + name = "Silfrine" + description = "An extremely aggressive silver-based compound suited best for catalyzing rapid platlet movement, and sealing of wounds. This is an extremely painful process. Overdose causes shortness of breath, and brute damage, as the body tries to seal non-existent wounds." + reagent_state = LIQUID + color = "#725cfd" + overdose_threshold = 20 + +/datum/reagent/medicine/silfrine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + if(iscarbon(M) && M.stat != DEAD) + var/mob/living/carbon/paper_cut_victim = M + if(method in list(INGEST, INJECT, PATCH)) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_boldwarning("Your body ignites in pain as nerves are rapidly reformed, and flesh is freshly knit!")) + M.force_pain_noise(reac_volume*6) + M.adjustStaminaLoss(reac_volume*4) + for(var/owie in paper_cut_victim.all_wounds) + var/datum/wound/paper_cut = owie + paper_cut.on_silfrine(reac_volume) + ..() + +/datum/reagent/medicine/silfrine/on_mob_life(mob/living/carbon/M) + var/effectiveness_multiplier = clamp(M.getBruteLoss()/75, 0.3, 1.5) + var/brute_heal = effectiveness_multiplier * REM * -4 + M.adjustBruteLoss(brute_heal, 0) + ..() + . = 1 + +/datum/reagent/medicine/silfrine/on_mob_metabolize(mob/living/L) + . = ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine) + if(!HAS_TRAIT(L, TRAIT_ANALGESIA)) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + +/datum/reagent/medicine/silfrine/on_mob_end_metabolize(mob/living/L) + . = ..() + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine) + +/datum/reagent/medicine/silfrine/overdose_start(mob/living/M) + . = ..() + M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine_od) + M.force_pain_noise(200) + + +/datum/reagent/medicine/silfrine/overdose_process(mob/living/M) + if(prob(10)) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_danger("You feel your flesh twisting as it tries to grow around non-existent wounds!")) + else + to_chat(M, span_danger("You feel points of pressure all across your body starting to throb uncomfortably.")) + M.force_pain_noise(40) + M.adjustStaminaLoss(40*REM, 0) + M.adjustBruteLoss(5*REM, 0) + if(prob(25)) + M.losebreath++ + ..() + . = 1 + + +/// BURN REAGENTS /// + +/datum/reagent/medicine/leporazine + name = "Leporazine" + description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." + color = "#DB90C6" + +/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) + if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE)) + M.adjust_bodytemperature(-4 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE)) + else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1)) + M.adjust_bodytemperature(4 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE)) + ..() + +/datum/reagent/medicine/alvitane + name = "Alvitane" + description = "A moderate intensity burn medication derived from chemicals specializing in dermal regeneration. Ideal application is exposing it to the flesh, as it allows burns to rapidly reknit themselves. Overdose weakens the user's ability to resist burns, and causes minor toxic effects." + reagent_state = LIQUID + color = "#F7FFA5" + overdose_threshold = 30 + var/burn_damage_modifier = 1.3 + +/datum/reagent/medicine/alvitane/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-1*REM, 0) + M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal) + ..() + . = 1 + +/datum/reagent/medicine/alvitane/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + M.adjustFireLoss(-reac_volume/2) + M.force_pain_noise(reac_volume/2) + M.adjustStaminaLoss(reac_volume/2) + if(iscarbon(M) && M.stat != DEAD) + var/mob/living/carbon/burn_ward_attendee = M + for(var/owie in burn_ward_attendee.all_wounds) + var/datum/wound/burn = owie + burn.on_tane(reac_volume/4) + if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_danger("You feel your burns regenerating! Your nerves are burning!")) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + else + to_chat(M, span_notice("You feel your burns twisting.")) + ..() + +/datum/reagent/medicine/alvitane/on_mob_end_metabolize(mob/living/L) + . = ..() + if(!ishuman(L)) + return + + if(overdosed) + var/mob/living/carbon/human/normal_guy = L + normal_guy.physiology?.burn_mod /= burn_damage_modifier + +/datum/reagent/medicine/alvitane/overdose_start(mob/living/M) + . = ..() + + if(!ishuman(M)) + return + + var/mob/living/carbon/human/overdose_victim = M + overdose_victim.physiology?.burn_mod *= burn_damage_modifier + +/datum/reagent/medicine/alvitane/overdose_process(mob/living/carbon/M) + M.adjustToxLoss(0.5*REM, 0) + M.set_timed_status_effect(5 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + ..() + + +/datum/reagent/medicine/quardexane + name = "Quardexane" + description = "A third-generation burn medication originating from the Shoal. Injection allows it to rapidly re-knit burns, while vaporous application acts as an cooling agent and sanitizing substance. Overdose causes new burns to form on the user's body." + reagent_state = LIQUID + color = "#4ab1ba" + overdose_threshold = 25 + reagent_weight = 0.6 + +/datum/reagent/medicine/quardexane/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-2*REM, 0) + M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal) + ..() + . = 1 + +/datum/reagent/medicine/quardexane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume) + if(method == VAPOR || TOUCH) + M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200) + M.adjust_fire_stacks(-reac_volume / 2) + if(reac_volume >= metabolization_rate) + M.ExtinguishMob() + + if(method == INJECT) + M.adjustFireLoss(-2*reac_volume, 0) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_danger("You feel your burns regenerating! Your nerves are burning!")) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + else + to_chat(M, span_danger("Your burns start to throb, before subsiding!")) + + if(iscarbon(M) && M.stat != DEAD && (method in list(VAPOR, INJECT, TOUCH))) + var/mob/living/carbon/burn_ward_attendee = M + for(var/owie in burn_ward_attendee.all_wounds) + var/datum/wound/burn = owie + burn.on_tane(reac_volume/2) + + ..() + +/datum/reagent/medicine/quardexane/overdose_process(mob/living/carbon/M) + M.adjustFireLoss(3*REM, 0.) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50) + ..() + +/datum/reagent/medicine/ysiltane + name = "Ysiltane" + description = "A burn treatment derived from plasma. Application by injection or ingestion causes burns to rapidly repair themselves. The intensity of application causes the user's system to temporarily crash. Overdose causes a toxic crisis within the user's system, and can damage organs." + reagent_state = LIQUID + color = "#862929" + overdose_threshold = 21 + reagent_weight = 2 + +/datum/reagent/medicine/ysiltane/on_mob_life(mob/living/carbon/M) + if(current_cycle > 2 && current_cycle <= 6) + M.adjustFireLoss(-10*REM, 0) + M.adjustFireLoss(-2*REM, 0) + M.adjustStaminaLoss(1*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/ysiltane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume) + if(method in list(INJECT, INGEST)) + M.adjustFireLoss(-reac_volume*2) + M.adjustStaminaLoss(reac_volume*6) + if(!HAS_TRAIT(M, TRAIT_ANALGESIA)) + to_chat(M, span_boldwarning("Your nerves ignite in pain as burns start to rapidly regenerate!")) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + else + to_chat(M, span_warning("You feel your burns twisting.")) + + if(iscarbon(M) && M.stat != DEAD) + var/mob/living/carbon/burn_ward_attendee = M + for(var/owie in burn_ward_attendee.all_wounds) + var/datum/wound/burn = owie + burn.on_tane(reac_volume) + + ..() + +/datum/reagent/medicine/ysiltane/overdose_process(mob/living/carbon/M) + M.adjustFireLoss(3*REM, 0.) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 330) + ..() + + +/// TOXIN REAGENTS /// + + +/datum/reagent/medicine/calomel + name = "Calomel" + description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." + reagent_state = LIQUID + color = "#8CDF24" // heavy saturation to make the color blend better + metabolization_rate = 0.5 * REAGENTS_METABOLISM + taste_description = "acid" + +/datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,3) + if(M.health > 20) + M.adjustToxLoss(1*REM, 0) + . = 1 + ..() + +/datum/reagent/medicine/charcoal + name = "Charcoal" + description = "Heals toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream. Administer orally" + reagent_state = SOLID + color = "#101a13" + metabolization_rate = 0.75 * REAGENTS_METABOLISM + overdose_threshold = 20 + +/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(-1*REM, 0) + . = 1 + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,1) + ..() + +/datum/reagent/medicine/charcoal/on_transfer(atom/A, method=TOUCH, volume) + if(method == INGEST || !istype(A, /obj/item/organ/stomach)) + return + A.reagents.remove_reagent(/datum/reagent/medicine/charcoal, volume) //We really should not be injecting an insoluble granular material. + A.reagents.add_reagent(/datum/reagent/carbon, volume) // Its pores would get clogged with gunk anyway. + ..() + +//its seiver. i ran out of ideas + seiver was a good one +/datum/reagent/medicine/pancrazine + name = "Pancrazine" + description = "A second generation Tecetian research chemical developed as the byproduct of the terraforming process. Injection of the substance while cold causes the body to regenerate radiation damage, while heating it causes rapid purging of toxic effects." + color = "#c3915d" + var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads. + +/datum/reagent/medicine/pancrazine/on_mob_metabolize(mob/living/carbon/human/M) + . = ..() + radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once. + +/datum/reagent/medicine/pancrazine/on_mob_life(mob/living/carbon/human/M) + var/chemtemp = min(holder.chem_temp, 1000) + chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty + var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints + + //you're hot + var/toxcalc = min(round((chemtemp-1000)/175+5,0.1),5) //max 2.5 tox healing a tick + if(toxcalc > 0) + M.adjustToxLoss(toxcalc*-0.5) + healypoints += toxcalc + + //and you're cold + var/radcalc = round((T0C-chemtemp)/6,0.1) //max ~45 rad loss unless you've hit below 0K. if so, wow. + if(radcalc > 0) + //no cost percent healing if you are SUPER cold (on top of cost healing) + if(chemtemp < radbonustemp*0.1) //if you're super chilly, it takes off 25% of your current rads + M.radiation = round(M.radiation * 0.75) + else if(chemtemp < radbonustemp)//else if you're under the chill-zone, it takes off 10% of your current rads + M.radiation = round(M.radiation * 0.9) + M.radiation -= radcalc + healypoints += (radcalc/5) + + + //you're yes and... oh no! + healypoints = round(healypoints,0.1) + M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints/5) + ..() + return TRUE + +/datum/reagent/medicine/pancrazine/overdose_process(mob/living/M) + . = ..() + if(prob(50)) + M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(10)) + M.adjust_disgust(33) + +/datum/reagent/medicine/gjalrazine + name = "Gjalrazine" + description = "A plasma-derieved syrum that stimulates the body's natural defenses against toxins. Injection forces the body to start purging toxins, at cost of a rising sense of disgust. Overdose causes the substance to start binding to blood cells, causing blood toxicity." + reagent_state = LIQUID + color = "#8CDF24" + metabolization_rate = 0.75 * REAGENTS_METABOLISM + overdose_threshold = 12 + +/datum/reagent/medicine/gjalrazine/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(-3*REM, 0) + M.adjust_disgust(1) + . = 1 + ..() + +/datum/reagent/medicine/gjalrazine/expose_mob(mob/living/M, method, reac_volume, show_message, touch_protection) + . = ..() + if((method in list(TOUCH, PATCH, INGEST, INJECT)) && M.stat != DEAD) + if(method == INGEST) + M.adjustOrganLoss(ORGAN_SLOT_STOMACH, reac_volume) + to_chat(M, "Your stomach cramps!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + M.adjustToxLoss(-reac_volume*4) + M.adjust_disgust(50) + M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + +/datum/reagent/medicine/gjalrazine/overdose_process(mob/living/M) + . = ..() + M.set_timed_status_effect(30 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + M.adjust_disgust(30) + M.adjustToxLoss(2*REM, 0) + +/// OXYGEN REAGENTS /// + +// oxygen has good reason to be less complicated because it's major causes are suffocating and blood loss +// blood loss has treatment methods aside from these meds +// and suffocation shouldn't be a major affair + +/datum/reagent/medicine/dexalin + name = "Dexalin" + description = "Restores oxygen loss. Overdose causes it instead." + reagent_state = LIQUID + color = "#0080FF" + overdose_threshold = 30 + +/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M) + M.adjustOxyLoss(-0.5*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/dexalin/overdose_process(mob/living/M) + M.adjustOxyLoss(2*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/salbutamol + name = "Salbutamol" + description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." + reagent_state = LIQUID + color = "#00FFFF" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M) + M.adjustOxyLoss(-3*REM, 0) + if(M.losebreath >= 4) + M.losebreath -= 2 + ..() + . = 1 + +/datum/reagent/medicine/inaprovaline + name = "Inaprovaline" + description = "Stabilizes the breathing of patients. Good for those in critical condition." + reagent_state = LIQUID + color = "#A4D8D8" + +/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M) + if(M.losebreath >= 5) + M.losebreath -= 5 + ..() + +/// RADIATION REAGENTS /// + +/datum/reagent/medicine/anti_rad + name = "Emergency Radiation Purgant" //taking real names + description = "Rapidly purges radiation from the body." + reagent_state = LIQUID + color = "#E6FFF0" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L) + to_chat(L, span_warning("Your stomach starts to churn and cramp!")) + . = ..() + +/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M) + M.radiation -= M.radiation - rand(50,150) + M.adjust_disgust(4*REM) + ..() + . = 1 + +/datum/reagent/medicine/potass_iodide + name = "Potassium Iodide" + description = "Efficiently restores low radiation damage." + reagent_state = LIQUID + color = "#BAA15D" + metabolization_rate = 2 * REAGENTS_METABOLISM + +/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M) + if(M.radiation > 0) + M.radiation -= min(M.radiation, 8) + ..() + +/datum/reagent/medicine/pen_acid + name = "Pentetic Acid" + description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body." + reagent_state = LIQUID + color = "#E6FFF0" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) + M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50 + M.adjustToxLoss(-2*REM, 0) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.type,2) + ..() + . = 1 + +/// MULTI-DAMAGE REAGENTS /// + + +/datum/reagent/medicine/synthflesh + name = "Synthflesh" + description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." + reagent_state = LIQUID + color = "#FFEBEB" + +/datum/reagent/medicine/synthflesh/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) + if(iscarbon(M)) + var/mob/living/carbon/carbies = M + if (carbies.stat == DEAD) + show_message = 0 + if(method in list(PATCH, TOUCH, SMOKE)) + var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) + var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) + for(var/i in carbies.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_synthflesh(reac_volume) + carbies.adjustToxLoss((harmies+burnies)*0.66) + if(show_message) + to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) + SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh) + reac_volume >= 100)) + carbies.cure_husk("burn") + carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something + ..() + return TRUE + +/datum/reagent/medicine/cryoxadone + name = "Cryoxadone" + description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." + color = "#0000C8" + taste_description = "sludge" + +/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) + var/power = -0.00003 * (M.bodytemperature ** 2) + 3 + if(M.bodytemperature < T0C) + M.adjustOxyLoss(-3 * power, 0) + M.adjustBruteLoss(-power, 0) + M.adjustFireLoss(-power, 0) + M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs + M.adjustCloneLoss(-power, 0) + for(var/i in M.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(power) + REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration + . = 1 + metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) + ..() + +/datum/reagent/medicine/hunter_extract + name = "Hunter's Extract" + description = "An extract of floral compounds and exotic frontier bacteria. Heals the user in small doses, but is extremely toxic otherwise." + color = "#6B372E" //dark and red like lavaland + metabolization_rate = REAGENTS_METABOLISM * 0.5 + overdose_threshold = 10 + +/datum/reagent/medicine/hunter_extract/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + ADD_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) + ..() + +/datum/reagent/medicine/hunter_extract/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) + ..() + +/datum/reagent/medicine/hunter_extract/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-1*REM, 0) + M.adjustBruteLoss(-1*REM, 0) + M.adjustToxLoss(-1*REM, 0) + if(M.health <= M.crit_threshold) + M.adjustOxyLoss(-1*REM, 0) + ..() + return TRUE + +/datum/reagent/medicine/hunter_extract/overdose_process(mob/living/M) // Thanks to actioninja + if(prob(2) && iscarbon(M)) + var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/obj/item/bodypart/bp = M.get_bodypart(selected_part) + if(bp) + M.visible_message(span_warning("[M] feels a spike of pain!!"), span_danger("You feel a spike of pain!!")) + bp.receive_damage(0, 0, 200) + else //SUCH A LUST FOR REVENGE!!! + to_chat(M, span_warning("A phantom limb hurts!")) + return ..() + + +/datum/reagent/medicine/panacea + name = "Panacea" + description = "One of the developments of the frontier, Panacea is a term for a variety of mildly-anomalous substances usually found within Frontier space. Despite disparate origins, they all share a similar effect of slowly healing the body. Overdosing on them causes this effect to reverse." + reagent_state = LIQUID + color = "#DCDCDC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + var/healing = 1 + +/datum/reagent/medicine/panacea/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(-healing*REM, 0) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/panacea/overdose_process(mob/living/M) + M.adjustToxLoss(1.5*REM, 0) + M.adjustOxyLoss(1.5*REM, 0) + M.adjustBruteLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + M.adjustFireLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + ..() + . = 1 + +/datum/reagent/medicine/panacea/effluvial + name = "Effluvial Panacea" + description = "A waste product of industrial processes to synthesize Panacea, or more often, an impure form, Effluvial Panacea has the same effects as true panacea, simply reduced in effectiveness." + color = "#d8c7b7" + healing = 0.2 + +/datum/reagent/medicine/panacea/effluvial/on_mob_life(mob/living/carbon/M) + if(prob(25)) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) + ..() + . = 1 + +/datum/reagent/medicine/stimulants + name = "Indoril Stimulant" + description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage." + color = "#78008C" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 + +/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) + +/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) + ..() + +/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M) + if(M.health < 50 && M.health > 0) + M.adjustOxyLoss(-1*REM, 0) + M.adjustToxLoss(-1*REM, 0) + M.adjustBruteLoss(-1*REM, 0) + M.adjustFireLoss(-1*REM, 0) + M.AdjustAllImmobility(-60) + M.adjustStaminaLoss(-5*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/stimulants/overdose_process(mob/living/M) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM, 0) + M.adjustToxLoss(1*REM, 0) + M.losebreath++ + . = 1 + ..() + +/datum/reagent/medicine/cureall + name = "Cureall Solution" + description = "A diluted solution created from plasmatic binding of Alvitane, Indomide, and charcoal. Slowly restores all types of damage." + reagent_state = LIQUID + color = "#C8A5DC" + taste_description = "still water" + overdose_threshold = 30 + +/datum/reagent/medicine/cureall/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-0.3*REM, 0) + M.adjustFireLoss(-0.3*REM, 0) + M.adjustToxLoss(-0.3*REM, 0) + . = 1 + ..() + +/datum/reagent/medicine/cureall/overdose_process(mob/living/M) + if(prob(50)) + M.adjustBruteLoss(0.5*REM, 0) + M.adjustFireLoss(0.5*REM, 0) + M.adjustToxLoss(0.5*REM, 0) + . = 1 + ..() + +/// CRIT REAGENTS /// + +/datum/reagent/medicine/epinephrine + name = "Epinephrine" + description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage." + reagent_state = LIQUID + color = "#D2FFFA" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M) + ..() + ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type) + +/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/M) + REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type) + ..() + +/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M) + if(M.health <= M.crit_threshold) + M.adjustToxLoss(-0.5*REM, 0) + M.adjustBruteLoss(-0.5*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) + M.adjustOxyLoss(-0.5*REM, 0) + if(M.losebreath >= 4) + M.losebreath -= 2 + if(M.losebreath < 0) + M.losebreath = 0 + M.adjustStaminaLoss(-0.5*REM, 0) + . = 1 + if(prob(20)) + M.AdjustAllImmobility(-20) + ..() + +/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM, 0) + M.adjustToxLoss(1*REM, 0) + M.losebreath++ + . = 1 + ..() + +/datum/reagent/medicine/atropine + name = "Atropine" + description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients." + reagent_state = LIQUID + color = "#1D3535" //slightly more blue, like epinephrine + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 35 + +/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) + if(M.health <= M.crit_threshold) + M.adjustToxLoss(-2*REM, 0) + M.adjustBruteLoss(-2*REM, 0) + M.adjustFireLoss(-2*REM, 0) + M.adjustOxyLoss(-5*REM, 0) + . = 1 + M.losebreath = 0 + if(prob(20)) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/atropine/overdose_process(mob/living/M) + M.adjustToxLoss(0.5*REM, 0) + . = 1 + M.set_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/dizziness, max_duration = 20 SECONDS) + ..() + diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm new file mode 100644 index 00000000000..0cb149911c6 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm @@ -0,0 +1,242 @@ +/* +** really more "weird" reagents +** one could even say strange ones +*/ + +/* Admin Reagent */ + +/datum/reagent/medicine/adminordrazine + name = "Adminordrazine" + description = "It's magic. We don't have to explain it." + color = "#E0BB00" //golden for the gods + can_synth = FALSE + taste_description = "badmins" + +/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) + M.setOxyLoss(0, 0) + M.radiation = 0 + M.heal_bodypart_damage(5,5) + M.adjustToxLoss(-5, 0, TRUE) + M.hallucination = 0 + REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) + M.set_blurriness(0) + M.set_blindness(0) + M.SetKnockdown(0) + M.SetStun(0) + M.SetUnconscious(0) + M.SetParalyzed(0) + M.SetImmobilized(0) + M.silent = FALSE + M.disgust = 0 + M.drowsyness = 0 + M.stuttering = 0 + M.slurring = 0 + M.confused = 0 + M.set_sleeping(0) + M.remove_status_effect(/datum/status_effect/jitter) + M.remove_status_effect(/datum/status_effect/dizziness) + if(M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = BLOOD_VOLUME_NORMAL + + M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + for(var/organ in M.internal_organs) + var/obj/item/organ/O = organ + O.setOrganDamage(0) + for(var/thing in M.diseases) + var/datum/disease/D = thing + if(D.severity == DISEASE_SEVERITY_POSITIVE) + continue + D.cure() + ..() + . = 1 + +/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_warning("Nothing happens...")) + +/* Basically an anomalychem at this point */ + +/datum/reagent/medicine/strange_reagent + name = "Strange Reagent" + description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living." + reagent_state = LIQUID + color = "#A0E85E" + metabolization_rate = 1.25 * REAGENTS_METABOLISM + taste_description = "magnets" + harmful = TRUE + +/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(M.stat != DEAD) + return ..() + if(iscarbon(M) && method != INGEST) //simplemobs can still be splashed + return ..() + var/amount_to_revive = round((M.getBruteLoss()+M.getFireLoss())/20) + if(M.getBruteLoss()+M.getFireLoss() >= 200 || HAS_TRAIT(M, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive. + M.visible_message(span_warning("[M]'s body convulses a bit, and then falls still once more.")) + M.do_jitter_animation(10) + return + M.visible_message(span_warning("[M]'s body starts convulsing!")) + M.notify_ghost_cloning("Your body is being revived with Strange Reagent!") + M.do_jitter_animation(10) + var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80) + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79) + ..() + +/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) + var/damage_at_random = rand(0,250)/100 //0 to 2.5 + M.adjustBruteLoss(damage_at_random*REM, FALSE) + M.adjustFireLoss(damage_at_random*REM, FALSE) + ..() + . = TRUE + +/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 5)) + mytray.spawnplant() + +/* Stasis just freezes you. It's pretty misc */ + +/datum/reagent/medicine/stasis + name = "Stasis" + description = "A liquid blue chemical that causes the body to enter a chemically induced stasis, irregardless of current state." + reagent_state = LIQUID + color = "#51b5cb" //a nice blue + overdose_threshold = 0 + +/datum/reagent/medicine/stasis/expose_mob(mob/living/M, method=INJECT, reac_volume, show_message = 1) + if(method != INJECT) + return + if(iscarbon(M)) + var/stasis_duration = min(20 SECONDS * reac_volume, 300 SECONDS) + to_chat(M, span_warning("Your body starts to slow down, sensation retreating from your limbs!")) + M.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT) + addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT), stasis_duration, TIMER_UNIQUE) + +/datum/reagent/medicine/stasis/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(1) + ..() + . = 1 + +/* Rezadone is good for unhusking at this point */ + +/datum/reagent/medicine/rezadone + name = "Rezadone" + description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage." + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + overdose_threshold = 30 + taste_description = "fish" + +/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) + M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. + M.heal_bodypart_damage(1,1) + REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) + ..() + . = 1 + +/datum/reagent/medicine/rezadone/overdose_process(mob/living/M) + M.adjustToxLoss(1, 0) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + . = 1 + +/datum/reagent/medicine/rezadone/expose_mob(mob/living/M, method=TOUCH, reac_volume) + . = ..() + if(iscarbon(M)) + var/mob/living/carbon/patient = M + if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone. + patient.cure_husk("burn") + patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.")) + + +//insulin +/datum/reagent/medicine/insulin + name = "Insulin" + description = "Increases sugar depletion rates." + reagent_state = LIQUID + color = "#FFFFF0" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M) + if(M.AdjustSleeping(-20)) + . = 1 + M.reagents.remove_reagent(/datum/reagent/consumable/sugar, 3) + ..() + +/* +** changeling reagents +** there's only two so no file +*/ + +//used for changeling's adrenaline power +/datum/reagent/medicine/changelingadrenaline + name = "Changeling Adrenaline" + description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." + color = "#C1151D" + overdose_threshold = 30 + +/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob) + ..() + M.AdjustAllImmobility(-20) + M.adjustStaminaLoss(-10, 0) + M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + return TRUE + +/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + +/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) + ..() + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + L.remove_status_effect(/datum/status_effect/dizziness) + L.remove_status_effect(/datum/status_effect/jitter) + +/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob) + M.adjustToxLoss(1, 0) + ..() + return TRUE + +/datum/reagent/medicine/changelinghaste + name = "Changeling Haste" + description = "Drastically increases movement speed, but deals toxin damage." + color = "#AE151D" + metabolization_rate = 1 + +/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) + +/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) + ..() + +/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(2, 0) + ..() + return TRUE diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm new file mode 100644 index 00000000000..8a2987d7970 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm @@ -0,0 +1,175 @@ +/* reagents that primarily interface with organ damage. +** Things like oculine, incausiate +*/ + + +/datum/reagent/medicine/oculine + name = "Oculine" + description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind." + reagent_state = LIQUID + color = "#404040" //oculine is dark grey, + metabolization_rate = 0.25 * REAGENTS_METABOLISM + taste_description = "dull toxin" + +/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) + if (!eyes) + return + eyes.applyOrganDamage(-2) + if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) + if(prob(20)) + to_chat(M, span_warning("Your vision slowly returns...")) + M.cure_blind(EYE_DAMAGE) + M.cure_nearsighted(EYE_DAMAGE) + M.blur_eyes(35) + + else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE)) + to_chat(M, span_warning("The blackness in your peripheral vision fades.")) + M.cure_nearsighted(EYE_DAMAGE) + M.blur_eyes(10) + else if(M.eye_blind || M.eye_blurry) + M.set_blindness(0) + M.set_blurriness(0) + ..() + +/datum/reagent/medicine/inacusiate + name = "Inacusiate" + description = "Rapidly restores hearing to a patient, assuming the loss of hearing is not chronic." + color = "#606060" //inacusiate is light grey + +/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + if(!ears) + return + ears.adjustEarDamage(-4 * REM) + return ..() + +/datum/reagent/medicine/mannitol + name = "Mannitol" + description = "Efficiently restores brain damage." + color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey + +/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM) + ..() + +/datum/reagent/medicine/neurine + name = "Neurine" + description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." + color = "#C0C0C0" //ditto + +/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) + if(C.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin)) + C.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5) + if(prob(15)) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) + ..() + +/datum/reagent/medicine/corazone + // Heart attack code will not do damage if corazone is present + // because it's SPACE MAGIC ASPIRIN + name = "Corazone" + description = "A medication used to treat pain, fever, and inflammation, along with heart attacks. Can also be used to stabilize livers." + color = "#F49797" + self_consuming = TRUE + +/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M) + ..() + ADD_TRAIT(M, TRAIT_PAIN_RESIST, type) + ADD_TRAIT(M, TRAIT_STABLEHEART, type) + ADD_TRAIT(M, TRAIT_STABLELIVER, type) + +/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type) + REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) + REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) + +/datum/reagent/medicine/silibinin + name = "Silibinin" + description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." + reagent_state = SOLID + color = "#FFFFD0" + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/silibinin/expose_mob(mob/living/carbon/M, method=INJECT, reac_volume) + if(method != INJECT) + return + + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1) //on injection, will heal the liver. This will (hopefully) fix dead livers. + + ..() + +/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M) + M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented. + ..() + . = 1 + + + +/* +*How this medicine works: +*Penthrite if you are not in crit only stabilizes your heart. +*As soon as you pass crit threshold it's special effects kick in. Penthrite forces your heart to beat preventing you from entering +*soft and hard crit, but there is a catch. During this you will be healed and you will sustain +*heart damage that will not imapct you as long as penthrite is in your system. +*If you reach the threshold of -60 HP penthrite stops working and you get a heart attack, penthrite is flushed from your system in that very moment, +*causing you to loose your soft crit, hard crit and heart stabilization effects. +*Overdosing on penthrite also causes a heart failure. +*/ + +/datum/reagent/medicine/penthrite + name = "Penthrite" + description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. It reacts violently with other emergency medication." + color = "#F5F5F5" + overdose_threshold = 50 + + +/datum/reagent/medicine/penthrite/on_mob_add(mob/living/M) + . = ..() + to_chat(M,"Your heart begins to beat with great force!") + ADD_TRAIT(M, TRAIT_STABLEHEART, type) + ADD_TRAIT(M, TRAIT_NOHARDCRIT,type) + ADD_TRAIT(M, TRAIT_NOSOFTCRIT,type) + M.crit_threshold = M.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! + + +/datum/reagent/medicine/penthrite/on_mob_life(mob/living/carbon/human/H) + H.adjustOrganLoss(ORGAN_SLOT_STOMACH,0.25) + if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > H.crit_threshold) //we cannot save someone above our raised crit threshold. + + H.adjustToxLoss(-2 * REM, 0) + H.adjustBruteLoss(-2 * REM, 0) + H.adjustFireLoss(-2 * REM, 0) + H.adjustOxyLoss(-6 * REM, 0) + + H.losebreath = 0 + + H.adjustOrganLoss(ORGAN_SLOT_HEART,max(1,volume/10)) // your heart is barely keeping up! + + H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + + + if(prob(33)) + to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!")) + + if(H.health <= H.crit_threshold) //certain death above this threshold + REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack + to_chat(H,span_danger("You feel something rupturing inside your chest!")) + H.force_scream() + H.set_heartattack(TRUE) + volume = 0 + . = ..() + +/datum/reagent/medicine/penthrite/on_mob_end_metabolize(mob/living/M) + M.crit_threshold = M.crit_threshold - HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! + REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) + REMOVE_TRAIT(M, TRAIT_NOHARDCRIT,type) + REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT,type) + . = ..() + +/datum/reagent/medicine/penthrite/overdose_process(mob/living/carbon/human/H) + REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) + H.adjustStaminaLoss(10) + H.adjustOrganLoss(ORGAN_SLOT_HEART,10) + H.set_heartattack(TRUE) diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm new file mode 100644 index 00000000000..eb65838be30 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm @@ -0,0 +1,369 @@ +/* Tramal - low power and lasts over a long period of time. Space Ibuprofen +** Morphine - Medium intensity and less duration. Makes you sleepy. +** Dimorlin - high intensity low duration. Analgesia +** Miner's Salve - High intensity with some +*/ + +/datum/reagent/medicine/tramal + name = "Tramal" + description = "A low intensity, high duration painkiller. Causes slight drowiness in extended use." + reagent_state = LIQUID + color = "#34eeee" + metabolization_rate = 0.2 * REAGENTS_METABOLISM + overdose_threshold = 35 + addiction_threshold = 30 + +/datum/reagent/medicine/tramal/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_PAIN_RESIST, type) + +/datum/reagent/medicine/tramal/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type) + ..() + +/datum/reagent/medicine/tramal/on_mob_life(mob/living/carbon/M) + if(current_cycle >= 5) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_light, name) + switch(current_cycle) + if(60) + to_chat(M, span_warning("You feel drowsy...")) + if(61 to INFINITY) + M.drowsyness += 1 + ..() + +/datum/reagent/medicine/tramal/overdose_start(mob/living/M) + . = ..() + ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) + +/datum/reagent/medicine/tramal/overdose_process(mob/living/M) + if(prob(33)) + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/tramal/addiction_act_stage1(mob/living/M) + if(prob(33)) + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/tramal/addiction_act_stage2(mob/living/M) + if(prob(33)) + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/tramal/addiction_act_stage3(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/tramal/addiction_act_stage4(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(2*REM, 0) + . = 1 + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + + +/datum/reagent/medicine/morphine + name = "Morphine" + description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." + reagent_state = LIQUID + color = "#A9FBFB" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + addiction_threshold = 25 + +/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_PAIN_RESIST, type) + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.damage_resistance += 5 + +/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type) + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.damage_resistance -= 5 + ..() + +/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M) + if(current_cycle >= 5) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name) + switch(current_cycle) + if(29) + to_chat(M, span_warning("You start to feel tired...")) + if(30 to 59) + M.drowsyness += 1 + if(60 to INFINITY) + M.Sleeping(40) + . = 1 + ..() + +/datum/reagent/medicine/morphine/overdose_start(mob/living/M) + . = ..() + ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) + +/datum/reagent/medicine/morphine/overdose_process(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(1*REM, 0) + . = 1 + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(2*REM, 0) + . = 1 + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(3*REM, 0) + . = 1 + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/dimorlin + name = "Dimorlin" + description = "A powerful opiate-derivative analgesiac. Extremely habit forming" + reagent_state = LIQUID + color = "#71adad" + metabolization_rate = 0.4 * REAGENTS_METABOLISM + overdose_threshold = 15 + addiction_threshold = 11 + +/datum/reagent/medicine/dimorlin/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_ANALGESIA, type) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.set_screwyhud(SCREWYHUD_HEALTHY) + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.damage_resistance += 15 + +/datum/reagent/medicine/dimorlin/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_ANALGESIA, type) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.set_screwyhud(SCREWYHUD_NONE) + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + if(ishuman(L)) + var/mob/living/carbon/human/drugged = L + drugged.physiology.damage_resistance -= 15 + ..() + +/datum/reagent/medicine/dimorlin/on_mob_life(mob/living/carbon/C) + C.set_screwyhud(SCREWYHUD_HEALTHY) + if(current_cycle >= 3) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name) + ..() + +/datum/reagent/medicine/dimorlin/overdose_start(mob/living/M) + . = ..() + ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) + +/datum/reagent/medicine/dimorlin/overdose_process(mob/living/M) + if(prob(33)) + M.losebreath++ + M.adjustOxyLoss(4, 0) + if(prob(20)) + M.AdjustUnconscious(20) + if(prob(5)) + M.adjustOrganLoss(ORGAN_SLOT_EYES, 5) + ..() + +/datum/reagent/medicine/dimorlin/addiction_act_stage1(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/dimorlin/addiction_act_stage2(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(1*REM, 0) + . = 1 + M.set_timed_status_effect(3 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/dimorlin/addiction_act_stage3(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(2*REM, 0) + . = 1 + M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/dimorlin/addiction_act_stage4(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(3*REM, 0) + . = 1 + M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + ..() + +/datum/reagent/medicine/mine_salve + name = "Miner's Salve" + description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed." + reagent_state = LIQUID + color = "#6D6374" + metabolization_rate = 0.4 * REAGENTS_METABOLISM + +/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C) + C.set_screwyhud(SCREWYHUD_HEALTHY) + C.adjustBruteLoss(-0.25*REM, 0) + C.adjustFireLoss(-0.25*REM, 0) + ..() + return TRUE + +/datum/reagent/medicine/mine_salve/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + if(iscarbon(M) && M.stat != DEAD) + if(method in list(INGEST, VAPOR, INJECT)) + M.adjust_nutrition(-5) + if(show_message) + to_chat(M, span_warning("Your stomach feels empty and cramps!")) + else + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.speed_modifier = max(0.1, S.speed_modifier) + + if(show_message) + to_chat(M, span_danger("You feel your wounds fade away to nothing!") ) + ..() + +/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_ANALGESIA, type) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.set_screwyhud(SCREWYHUD_HEALTHY) + +/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M) + if(iscarbon(M)) + var/mob/living/carbon/N = M + REMOVE_TRAIT(N, TRAIT_ANALGESIA, type) + N.set_screwyhud(SCREWYHUD_NONE) + ..() + + +/datum/reagent/medicine/carfencadrizine + name = "Carfencadrizine" + description = "A highly potent synthetic painkiller held in a suspension of stimulating agents. Allows people to keep moving long beyond when they should stop." + color = "#859480" + overdose_threshold = 8 + addiction_threshold = 7 + metabolization_rate = 0.1 + +/datum/reagent/medicine/carfencadrizine/on_mob_metabolize(mob/living/L) + . = ..() + ADD_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine) + ADD_TRAIT(L, TRAIT_PINPOINT_EYES, type) + ADD_TRAIT(L, TRAIT_NOSOFTCRIT, type) + ADD_TRAIT(L, TRAIT_NOHARDCRIT, type) + +/datum/reagent/medicine/carfencadrizine/on_mob_end_metabolize(mob/living/L) + . = ..() + REMOVE_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine) + REMOVE_TRAIT(L, TRAIT_PINPOINT_EYES, type) + REMOVE_TRAIT(L, TRAIT_NOSOFTCRIT, type) + REMOVE_TRAIT(L, TRAIT_NOHARDCRIT, type) + +/datum/reagent/medicine/carfencadrizine/on_mob_life(mob/living/carbon/M) + if(current_cycle >= 3) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name) + + if(M.health <= M.crit_threshold) + if(prob(20)) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 4) + if(prob(40)) + M.playsound_local(get_turf(M), 'sound/health/slowbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + ..() + +/datum/reagent/medicine/carfencadrizine/overdose_process(mob/living/M) + if(prob(66)) + M.losebreath++ + M.adjustOxyLoss(4, 0) + if(prob(40)) + M.AdjustUnconscious(20) + if(prob(10)) + M.adjustOrganLoss(ORGAN_SLOT_EYES, 3) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 7) + ..() + +/datum/reagent/medicine/carfencadrizine/addiction_act_stage1(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) + ..() + +/datum/reagent/medicine/carfencadrizine/addiction_act_stage2(mob/living/M) + if(prob(33)) + M.drop_all_held_items() + M.adjustToxLoss(1*REM, 0) + . = 1 + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(15)) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 1) + ..() + +/datum/reagent/medicine/carfencadrizine/addiction_act_stage3(mob/living/M) + if(prob(50)) + M.drop_all_held_items() + M.adjustToxLoss(1*REM, 0) + . = 1 + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(30)) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) + ..() + +/datum/reagent/medicine/carfencadrizine/addiction_act_stage4(mob/living/M) + if(prob(60)) + M.drop_all_held_items() + M.adjustToxLoss(1*REM, 0) + . = 1 + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(40)) + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 2) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) + ..() + diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm new file mode 100644 index 00000000000..d920ecf8886 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm @@ -0,0 +1,330 @@ +//reagents relating to status effects +//i.e. jitter, drunk, dizzy + +//I consider disease a status +/datum/reagent/medicine/spaceacillin + name = "Spaceacillin" + description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." + color = "#E1F2E6" + metabolization_rate = 0.1 * REAGENTS_METABOLISM + +/datum/reagent/medicine/mutadone + name = "Mutadone" + description = "Removes jitteriness and restores genetic defects." + color = "#5096C8" + taste_description = "acid" + +/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) + M.adjust_timed_status_effect(-100 SECONDS * REM, /datum/status_effect/jitter) + if(M.has_dna()) + M.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) + if(!QDELETED(M)) //We were a monkey, now a human + ..() + +/datum/reagent/medicine/antihol + name = "Antihol" + description = "Purges alcoholic substance from the patient's body and eliminates its side effects." + color = "#00B4C8" + taste_description = "raw egg" + +/datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M) + M.remove_status_effect(/datum/status_effect/dizziness) + M.drowsyness = 0 + M.slurring = 0 + M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1) + M.adjustToxLoss(-0.2*REM, 0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.adjust_drunk_effect(-10) + ..() + . = 1 + +/datum/reagent/medicine/diphenhydramine + name = "Diphenhydramine" + description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness." + reagent_state = LIQUID + color = "#64FFE6" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) + if(prob(10)) + M.drowsyness += 1 + M.adjust_timed_status_effect(-12 SECONDS, /datum/status_effect/jitter) + M.reagents.remove_reagent(/datum/reagent/toxin/histamine,3) + ..() + + +/datum/reagent/medicine/haloperidol + name = "Haloperidol" + description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage." + reagent_state = LIQUID + color = "#27870a" + metabolization_rate = 0.4 * REAGENTS_METABOLISM + +/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) + for(var/datum/reagent/drug/R in M.reagents.reagent_list) + M.reagents.remove_reagent(R.type,5) + M.drowsyness += 2 + if(M.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS) + M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter) + if (M.hallucination >= 5) + M.hallucination -= 5 + if(prob(20)) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50) + M.adjustStaminaLoss(2.5*REM, 0) + ..() + return TRUE + +/datum/reagent/medicine/modafinil + name = "Modafinil" + description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with." + reagent_state = LIQUID + color = "#BEF7D8" // palish blue white + metabolization_rate = 0.1 * REAGENTS_METABOLISM + overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) + taste_description = "salt" // it actually does taste salty + var/overdose_progress = 0 // to track overdose progress + +/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M) + ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type) + ..() + +/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type) + ..() + +/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M) + if(!overdosed) // We do not want any effects on OD + overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun + M.AdjustAllImmobility(-5) + M.adjustStaminaLoss(-0.5*REM, 0) + M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 20 SECONDS) + metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick + . = TRUE + ..() + +/datum/reagent/medicine/modafinil/overdose_start(mob/living/M) + to_chat(M, span_userdanger("You feel awfully out of breath and jittery!")) + metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.01 per tick on overdose + +/datum/reagent/medicine/modafinil/overdose_process(mob/living/M) + overdose_progress++ + switch(overdose_progress) + if(1 to 40) + M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS) + M.stuttering = min(M.stuttering+1, 10) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + if(prob(50)) + M.losebreath++ + if(41 to 80) + M.adjustOxyLoss(0.1*REM, 0) + M.adjustStaminaLoss(0.1*REM, 0) + M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS) + M.stuttering = min(M.stuttering+1, 20) + M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) + if(prob(50)) + M.losebreath++ + if(prob(20)) + to_chat(M, span_userdanger("You have a sudden fit!")) + M.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used + if(81) + to_chat(M, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal + M.adjustOxyLoss(0.1*REM, 0) + M.adjustStaminaLoss(0.1*REM, 0) + if(82 to INFINITY) + M.Sleeping(100) + M.adjustOxyLoss(1.5*REM, 0) + M.adjustStaminaLoss(1.5*REM, 0) + ..() + return TRUE + +/datum/reagent/medicine/synaptizine + name = "Synaptizine" + description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." + color = "#FF00FF" + +/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M) + M.drowsyness = max(M.drowsyness-5, 0) + M.AdjustStun(-20) + M.AdjustKnockdown(-20) + M.AdjustUnconscious(-20) + M.AdjustImmobilized(-20) + M.AdjustParalyzed(-20) + if(M.has_reagent(/datum/reagent/toxin/mindbreaker)) + M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) + M.hallucination = max(0, M.hallucination - 10) + if(prob(30)) + M.adjustToxLoss(1, 0) + . = 1 + ..() + +/datum/reagent/medicine/synaphydramine + name = "Diphen-Synaptizine" + description = "Reduces drowsiness, hallucinations, and Histamine from body." + color = "#EC536D" // rgb: 236, 83, 109 + +/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) + M.drowsyness = max(M.drowsyness-5, 0) + if(M.has_reagent(/datum/reagent/toxin/mindbreaker)) + M.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) + if(M.has_reagent(/datum/reagent/toxin/histamine)) + M.remove_reagent(/datum/reagent/toxin/histamine, 5) + M.hallucination = max(0, M.hallucination - 10) + if(prob(30)) + M.adjustToxLoss(1, 0) + . = 1 + ..() + + +//"Mood is status" declared Erika + +/datum/reagent/medicine/lithium_carbonate + name = "Lithium Carbonate" + description = "A mood stabilizer discovered by most spacefaring civilizations. Fairly widespread as a result." + color = "#b3acaa" //grey. boring. + reagent_state = SOLID + metabolization_rate = REAGENTS_METABOLISM * 0.5 + overdose_threshold = 20 + +/datum/reagent/medicine/lithium_carbonate/on_mob_life(mob/living/carbon/M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) + if(mood.sanity <= SANITY_GREAT) + mood.setSanity(min(mood.sanity+5, SANITY_GREAT)) + ..() + . = 1 + +/datum/reagent/medicine/lithium_carbonate/overdose_process(mob/living/M) + if(prob(5)) + M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) + ..() + . = 1 + +/datum/reagent/medicine/psicodine + name = "Psicodine" + description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." + reagent_state = LIQUID + color = "#07E79E" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_FEARLESS, type) + +/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_FEARLESS, type) + ..() + +/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) + M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter) + M.adjust_timed_status_effect(-12 SECONDS * REM, /datum/status_effect/dizziness) + M.confused = max(0, M.confused-6) + M.disgust = max(0, M.disgust-6) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) + if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... + mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral + ..() + . = 1 + +/datum/reagent/medicine/psicodine/overdose_process(mob/living/M) + M.hallucination = min(max(0, M.hallucination + 5), 60) + M.adjustToxLoss(1, 0) + ..() + . = 1 + +/datum/reagent/medicine/ephedrine + name = "Ephedrine" + description = "Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing." + reagent_state = LIQUID + color = "#D2FFFA" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + addiction_threshold = 25 + +/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) + +/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) + ..() + +/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) + if(prob(20) && iscarbon(M)) + var/obj/item/I = M.get_active_held_item() + if(I && M.dropItemToGround(I)) + to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!")) + M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) + + M.AdjustAllImmobility(-20) + M.adjustStaminaLoss(-1*REM, FALSE) + ..() + return TRUE + +/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M) + if(prob(2) && iscarbon(M)) + var/datum/disease/D = new /datum/disease/heart_failure + M.ForceContractDisease(D) + to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) + M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) + + if(prob(7)) + to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) + + if(prob(33)) + M.adjustToxLoss(1*REM, 0) + M.losebreath++ + . = 1 + return TRUE + +/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M) + if(prob(3) && iscarbon(M)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.set_timed_status_effect(120 SECONDS, /datum/status_effect/jitter) + + if(prob(33)) + M.adjustToxLoss(2*REM, 0) + M.losebreath += 2 + . = 1 + ..() + +/datum/reagent/medicine/ephedrine/addiction_act_stage2(mob/living/M) + if(prob(6) && iscarbon(M)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.set_timed_status_effect(240 SECONDS, /datum/status_effect/jitter) + + if(prob(33)) + M.adjustToxLoss(3*REM, 0) + M.losebreath += 3 + . = 1 + ..() + +/datum/reagent/medicine/ephedrine/addiction_act_stage3(mob/living/M) + if(prob(12) && iscarbon(M)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter) + + if(prob(33)) + M.adjustToxLoss(4*REM, 0) + M.losebreath += 4 + . = 1 + ..() + +/datum/reagent/medicine/ephedrine/addiction_act_stage4(mob/living/M) + if(prob(24) && iscarbon(M)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter) + + if(prob(33)) + M.adjustToxLoss(5*REM, 0) + M.losebreath += 5 + . = 1 + ..() diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm new file mode 100644 index 00000000000..fa644a7a25d --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm @@ -0,0 +1,27 @@ +/* Medicines that interface with wounds first and foremost +** +*/ + +/datum/reagent/medicine/bonefixingjuice + name = "C4L-Z1UM Agent" + description = "A peculiar substance capable of instantly regenerating live tissue." + taste_description = "milk" + metabolization_rate = 0 + +/datum/reagent/medicine/bonefixingjuice/on_mob_life(mob/living/M) + var/mob/living/carbon/C = M + switch(current_cycle) + if(1 to 10) + if(C.drowsyness < 10) + C.drowsyness += 2 + if(11 to 30) + C.adjustStaminaLoss(5) + if(31 to INFINITY) + C.AdjustSleeping(40) + //formerly everything-fixing juice + for(var/datum/wound/blunt/broken_bone in C.all_wounds) + broken_bone.remove_wound() + for(var/obj/item/organ/O in C.internal_organs) + O.damage = 0 + holder.remove_reagent(/datum/reagent/medicine/bonefixingjuice, 10) + ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm deleted file mode 100644 index 4a7cda6927a..00000000000 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ /dev/null @@ -1,2562 +0,0 @@ -#define PERF_BASE_DAMAGE 0.5 - -////////////////////////////////////////////////////////////////////////////////////////// - // MEDICINE REAGENTS -////////////////////////////////////////////////////////////////////////////////////// - -// where all the reagents related to medicine go. - -/datum/reagent/medicine - name = "Medicine" - taste_description = "bitterness" - category = "Medicine" - -/datum/reagent/medicine/on_mob_life(mob/living/carbon/M) - current_cycle++ - holder.remove_reagent(type, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism - -/datum/reagent/medicine/leporazine - name = "Leporazine" - description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." - color = "#DB90C6" - -/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) - if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE)) - M.adjust_bodytemperature(-4 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE)) - else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1)) - M.adjust_bodytemperature(4 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE)) - ..() - -/datum/reagent/medicine/adminordrazine //An OP chemical for admins - name = "Adminordrazine" - description = "It's magic. We don't have to explain it." - color = "#E0BB00" //golden for the gods - can_synth = FALSE - taste_description = "badmins" - -/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) - M.setOxyLoss(0, 0) - M.radiation = 0 - M.heal_bodypart_damage(5,5) - M.adjustToxLoss(-5, 0, TRUE) - M.hallucination = 0 - REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) - M.set_blurriness(0) - M.set_blindness(0) - M.SetKnockdown(0) - M.SetStun(0) - M.SetUnconscious(0) - M.SetParalyzed(0) - M.SetImmobilized(0) - M.silent = FALSE - M.disgust = 0 - M.drowsyness = 0 - M.stuttering = 0 - M.slurring = 0 - M.confused = 0 - M.set_sleeping(0) - M.remove_status_effect(/datum/status_effect/jitter) - M.remove_status_effect(/datum/status_effect/dizziness) - if(M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume = BLOOD_VOLUME_NORMAL - - M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) - for(var/organ in M.internal_organs) - var/obj/item/organ/O = organ - O.setOrganDamage(0) - for(var/thing in M.diseases) - var/datum/disease/D = thing - if(D.severity == DISEASE_SEVERITY_POSITIVE) - continue - D.cure() - ..() - . = 1 - -/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_warning("Nothing happens...")) - -/datum/reagent/medicine/adminordrazine/quantum_heal - name = "Quantum Medicine" - description = "Rare and experimental particles, that apparently swap the user's body with one from an alternate dimension where it's completely healthy." - taste_description = "science" - -/datum/reagent/medicine/synaptizine - name = "Synaptizine" - description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." - color = "#FF00FF" - -/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M) - M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustStun(-20) - M.AdjustKnockdown(-20) - M.AdjustUnconscious(-20) - M.AdjustImmobilized(-20) - M.AdjustParalyzed(-20) - if(M.has_reagent(/datum/reagent/toxin/mindbreaker)) - M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) - M.hallucination = max(0, M.hallucination - 10) - if(prob(30)) - M.adjustToxLoss(1, 0) - . = 1 - ..() - -/datum/reagent/medicine/synaphydramine - name = "Diphen-Synaptizine" - description = "Reduces drowsiness, hallucinations, and Histamine from body." - color = "#EC536D" // rgb: 236, 83, 109 - -/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) - M.drowsyness = max(M.drowsyness-5, 0) - if(M.has_reagent(/datum/reagent/toxin/mindbreaker)) - M.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) - if(M.has_reagent(/datum/reagent/toxin/histamine)) - M.remove_reagent(/datum/reagent/toxin/histamine, 5) - M.hallucination = max(0, M.hallucination - 10) - if(prob(30)) - M.adjustToxLoss(1, 0) - . = 1 - ..() - -/datum/reagent/medicine/cryoxadone - name = "Cryoxadone" - description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." - color = "#0000C8" - taste_description = "sludge" - -/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) - var/power = -0.00003 * (M.bodytemperature ** 2) + 3 - if(M.bodytemperature < T0C) - M.adjustOxyLoss(-3 * power, 0) - M.adjustBruteLoss(-power, 0) - M.adjustFireLoss(-power, 0) - M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs - M.adjustCloneLoss(-power, 0) - for(var/i in M.all_wounds) - var/datum/wound/iter_wound = i - iter_wound.on_xadone(power) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration - . = 1 - metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) - ..() - -/datum/reagent/medicine/clonexadone - name = "Clonexadone" - description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone." - color = "#3D3DC6" - taste_description = "muscle" - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M) - if(M.bodytemperature < T0C) - M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = 1 - metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75) - ..() - -/datum/reagent/medicine/pyroxadone - name = "Pyroxadone" - description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." - color = "#f7832a" - taste_description = "spicy jelly" - -/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) - . = ..() - - var/bodytemp = M.bodytemperature - var/heatlimit = M.dna.species.bodytemp_heat_damage_limit - - if(bodytemp < heatlimit) - return . - - var/power = 0 - - if(bodytemp < 400) - power = 2 - - else if(bodytemp < 460) - power = 3 - - else - power = 5 - - if(M.on_fire) - power *= 2 - - M.adjustOxyLoss(-2 * power, 0) - M.adjustBruteLoss(-power, 0) - M.adjustFireLoss(-1.5 * power, 0) - M.adjustToxLoss(-power, 0, TRUE) - M.adjustCloneLoss(-power, 0) - for(var/i in M.all_wounds) - var/datum/wound/iter_wound = i - iter_wound.on_xadone(power) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - -/datum/reagent/medicine/rezadone - name = "Rezadone" - description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - overdose_threshold = 30 - taste_description = "fish" - -/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) - M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. - M.heal_bodypart_damage(1,1) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - ..() - . = 1 - -/datum/reagent/medicine/rezadone/overdose_process(mob/living/M) - M.adjustToxLoss(1, 0) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - . = 1 - -/datum/reagent/medicine/rezadone/expose_mob(mob/living/M, method=TOUCH, reac_volume) - . = ..() - if(iscarbon(M)) - var/mob/living/carbon/patient = M - if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone. - patient.cure_husk("burn") - patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.")) - -/datum/reagent/medicine/spaceacillin - name = "Spaceacillin" - description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." - color = "#E1F2E6" - metabolization_rate = 0.1 * REAGENTS_METABOLISM - -//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. -/datum/reagent/medicine/silver_sulfadiazine - name = "Silver Sulfadiazine" - description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - overdose_threshold = 45 - -/datum/reagent/medicine/silver_sulfadiazine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, VAPOR, INJECT)) - M.adjustToxLoss(0.5*reac_volume) - if(show_message) - to_chat(M, span_warning("You don't feel so good...")) - else if(M.getFireLoss()) - M.adjustFireLoss(-reac_volume) - M.force_scream() - if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) - to_chat(M, span_danger("You feel your burns healing! It stings like hell!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - else - to_chat(M, span_notice("You feel your burns throbbing.")) - ..() - -/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M) - M.adjustFireLoss(2.5*REM, 0) - M.adjustToxLoss(0.5, 0) - ..() - . = 1 - -/datum/reagent/medicine/oxandrolone - name = "Oxandrolone" - description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns." - reagent_state = LIQUID - color = "#1E8BFF" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 25 - -/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) - if(M.getFireLoss() > 25) - M.adjustFireLoss(-4*REM, 0) //Twice as effective as AIURI for severe burns - else - M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones - ..() - . = 1 - -/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M) - if(M.getFireLoss()) //It only makes existing burns worse - M.adjustFireLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = 1 - ..() - -/datum/reagent/medicine/styptic_powder - name = "Styptic Powder" - description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage." - reagent_state = LIQUID - color = "#FF9696" - overdose_threshold = 45 - -/datum/reagent/medicine/styptic_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, VAPOR, INJECT)) - M.adjustToxLoss(0.5*reac_volume) - if(show_message) - to_chat(M, span_warning("You don't feel so good...")) - else if(M.getBruteLoss()) - M.adjustBruteLoss(-reac_volume) - M.force_scream() - if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) - to_chat(M, span_danger("You feel your bruises healing! It stings like hell!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - else - to_chat(M, span_notice("You feel your bruises throbbing.")) - ..() - - -/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-2*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M) - M.adjustBruteLoss(2.5*REM, 0) - M.adjustToxLoss(0.5, 0) - ..() - . = 1 - -/datum/reagent/medicine/salglu_solution - name = "Saline-Glucose Solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." - reagent_state = LIQUID - color = "#DCDCDC" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 60 - taste_description = "sweetness and salt" - var/last_added = 0 - var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active - var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick - -/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) - if(last_added) - M.blood_volume -= last_added - last_added = 0 - if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. - var/amount_to_add = min(M.blood_volume, volume*5) - var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) - last_added = new_blood_level - M.blood_volume - M.blood_volume = new_blood_level + extra_regen - if(prob(33)) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) - . = TRUE - ..() - -/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) - if(prob(3)) - to_chat(M, span_warning("You feel salty.")) - holder.add_reagent(/datum/reagent/consumable/sodiumchloride, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) - else if(prob(3)) - to_chat(M, span_warning("You feel sweet.")) - holder.add_reagent(/datum/reagent/consumable/sugar, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) - if(prob(33)) - M.adjustBruteLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - M.adjustFireLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - . = TRUE - ..() - -/datum/reagent/medicine/mine_salve - name = "Miner's Salve" - description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed." - reagent_state = LIQUID - color = "#6D6374" - metabolization_rate = 0.4 * REAGENTS_METABOLISM - -/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C) - C.set_screwyhud(SCREWYHUD_HEALTHY) - C.adjustBruteLoss(-0.25*REM, 0) - C.adjustFireLoss(-0.25*REM, 0) - ..() - return TRUE - -/datum/reagent/medicine/mine_salve/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, VAPOR, INJECT)) - M.adjust_nutrition(-5) - if(show_message) - to_chat(M, span_warning("Your stomach feels empty and cramps!")) - else - var/mob/living/carbon/C = M - for(var/s in C.surgeries) - var/datum/surgery/S = s - S.speed_modifier = max(0.1, S.speed_modifier) - - if(show_message) - to_chat(M, span_danger("You feel your wounds fade away to nothing!") ) - ..() - -/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_ANALGESIA, type) - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.set_screwyhud(SCREWYHUD_HEALTHY) - -/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M) - if(iscarbon(M)) - var/mob/living/carbon/N = M - REMOVE_TRAIT(N, TRAIT_ANALGESIA, type) - N.set_screwyhud(SCREWYHUD_NONE) - ..() - -/datum/reagent/medicine/synthflesh - name = "Synthflesh" - description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." - reagent_state = LIQUID - color = "#FFEBEB" - -/datum/reagent/medicine/synthflesh/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) - if(iscarbon(M)) - var/mob/living/carbon/carbies = M - if (carbies.stat == DEAD) - show_message = 0 - if(method in list(PATCH, TOUCH, SMOKE)) - var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) - var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) - for(var/i in carbies.all_wounds) - var/datum/wound/iter_wound = i - iter_wound.on_synthflesh(reac_volume) - carbies.adjustToxLoss((harmies+burnies)*0.66) - if(show_message) - to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) - SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh) + reac_volume >= 100)) - carbies.cure_husk("burn") - carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something - ..() - return TRUE - -/datum/reagent/medicine/charcoal - name = "Charcoal" - description = "Heals toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream." - reagent_state = LIQUID - color = "#000000" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - taste_description = "ash" - process_flags = ORGANIC //WS Edit - IPCs - -/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-2*REM, 0) - . = 1 - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.type,1) - ..() - -/datum/reagent/medicine/charcoal/on_transfer(atom/A, method=TOUCH, volume) - if(method == INGEST || !iscarbon(A)) //the atom not the charcoal - return - A.reagents.remove_reagent(/datum/reagent/medicine/charcoal/, volume) //We really should not be injecting an insoluble granular material. - A.reagents.add_reagent(/datum/reagent/carbon, volume) // Its pores would get clogged with gunk anyway. - ..() - -/datum/reagent/medicine/system_cleaner - name = "System Cleaner" - description = "Neutralizes harmful chemical compounds inside synthetic systems." - reagent_state = LIQUID - color = "#F1C40F" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - process_flags = SYNTHETIC //WS Edit - IPCs - -/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M) - M.adjustToxLoss(-2*REM, 0) - . = 1 - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.type,1) - ..() - -/datum/reagent/medicine/liquid_solder - name = "Liquid Solder" - description = "Repairs brain damage in synthetics." - color = "#727272" - taste_description = "metallic" - process_flags = SYNTHETIC //WS Edit - IPCs - -/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) - C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) - if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) - C.cure_trauma_type(BRAIN_TRAUMA_MILD) - ..() - -/datum/reagent/medicine/omnizine - name = "Omnizine" - description = "Slowly heals all damage types. Overdose will cause damage in all types instead." - reagent_state = LIQUID - color = "#DCDCDC" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 30 - var/healing = 0.5 - -/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-healing*REM, 0) - M.adjustOxyLoss(-healing*REM, 0) - M.adjustBruteLoss(-healing*REM, 0) - M.adjustFireLoss(-healing*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/omnizine/overdose_process(mob/living/M) - M.adjustToxLoss(1.5*REM, 0) - M.adjustOxyLoss(1.5*REM, 0) - M.adjustBruteLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - M.adjustFireLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = 1 - -/datum/reagent/medicine/omnizine/protozine - name = "Protozine" - description = "A less environmentally friendly and somewhat weaker variant of omnizine." - color = "#d8c7b7" - healing = 0.2 - -/datum/reagent/medicine/calomel - name = "Calomel" - description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." - reagent_state = LIQUID - color = "#19C832" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - taste_description = "acid" - -/datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.type,3) - if(M.health > 20) - M.adjustToxLoss(1*REM, 0) - . = 1 - ..() - -/datum/reagent/medicine/potass_iodide - name = "Potassium Iodide" - description = "Efficiently restores low radiation damage." - reagent_state = LIQUID - color = "#BAA15D" - metabolization_rate = 2 * REAGENTS_METABOLISM - -/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M) - if(M.radiation > 0) - M.radiation -= min(M.radiation, 8) - ..() - -/datum/reagent/medicine/pen_acid - name = "Pentetic Acid" - description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body." - reagent_state = LIQUID - color = "#E6FFF0" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) - M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50 - M.adjustToxLoss(-2*REM, 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.type,2) - ..() - . = 1 - -/datum/reagent/medicine/anti_rad - name = "Emergency Radiation Purgant" //taking real names - description = "Rapidly purges radiation from the body." - reagent_state = LIQUID - color = "#E6FFF0" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L) - to_chat(L, span_warning("Your stomach starts to churn and cramp!")) - . = ..() - -/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M) - M.radiation -= M.radiation - rand(50,150) - M.adjust_disgust(4*REM) - ..() - . = 1 - -/datum/reagent/medicine/sal_acid - name = "Salicylic Acid" - description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising." - reagent_state = LIQUID - color = "#D2D2D2" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 25 - -/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) - if(M.getBruteLoss() > 25) - M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising - else - M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones - ..() - . = 1 - -/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M) - if(M.getBruteLoss()) //It only makes existing bruises worse - M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = 1 - ..() - -/datum/reagent/medicine/salbutamol - name = "Salbutamol" - description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." - reagent_state = LIQUID - color = "#00FFFF" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - -/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(-3*REM, 0) - if(M.losebreath >= 4) - M.losebreath -= 2 - ..() - . = 1 - -/datum/reagent/medicine/perfluorodecalin - name = "Perfluorodecalin" - description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." - reagent_state = LIQUID - color = "#FF6464" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long - -/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M) - var/oxycalc = 2.5*REM*current_cycle - if(!overdosed) - oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. - M.adjustOxyLoss(-oxycalc, 0) - M.adjustToxLoss(oxycalc/2.5, 0) - if(prob(current_cycle) && M.losebreath) - M.losebreath-- - ..() - return TRUE - -/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M) - metabolization_rate += 1 - return ..() - -/datum/reagent/medicine/ephedrine - name = "Ephedrine" - description = "Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing." - reagent_state = LIQUID - color = "#D2FFFA" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 30 - addiction_threshold = 25 - -/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - -/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - ..() - -/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) - if(prob(20) && iscarbon(M)) - var/obj/item/I = M.get_active_held_item() - if(I && M.dropItemToGround(I)) - to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!")) - M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - - M.AdjustAllImmobility(-20) - M.adjustStaminaLoss(-1*REM, FALSE) - ..() - return TRUE - -/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M) - if(prob(2) && iscarbon(M)) - var/datum/disease/D = new /datum/disease/heart_failure - M.ForceContractDisease(D) - to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) - M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) - - if(prob(7)) - to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) - - if(prob(33)) - M.adjustToxLoss(1*REM, 0) - M.losebreath++ - . = 1 - return TRUE - -/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M) - if(prob(3) && iscarbon(M)) - M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) - M.Unconscious(100) - M.set_timed_status_effect(120 SECONDS, /datum/status_effect/jitter) - - if(prob(33)) - M.adjustToxLoss(2*REM, 0) - M.losebreath += 2 - . = 1 - ..() - -/datum/reagent/medicine/ephedrine/addiction_act_stage2(mob/living/M) - if(prob(6) && iscarbon(M)) - M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) - M.Unconscious(100) - M.set_timed_status_effect(240 SECONDS, /datum/status_effect/jitter) - - if(prob(33)) - M.adjustToxLoss(3*REM, 0) - M.losebreath += 3 - . = 1 - ..() - -/datum/reagent/medicine/ephedrine/addiction_act_stage3(mob/living/M) - if(prob(12) && iscarbon(M)) - M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) - M.Unconscious(100) - M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter) - - if(prob(33)) - M.adjustToxLoss(4*REM, 0) - M.losebreath += 4 - . = 1 - ..() - -/datum/reagent/medicine/ephedrine/addiction_act_stage4(mob/living/M) - if(prob(24) && iscarbon(M)) - M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) - M.Unconscious(100) - M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter) - - if(prob(33)) - M.adjustToxLoss(5*REM, 0) - M.losebreath += 5 - . = 1 - ..() - -/datum/reagent/medicine/diphenhydramine - name = "Diphenhydramine" - description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness." - reagent_state = LIQUID - color = "#64FFE6" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) - if(prob(10)) - M.drowsyness += 1 - M.adjust_timed_status_effect(-12 SECONDS, /datum/status_effect/jitter) - M.reagents.remove_reagent(/datum/reagent/toxin/histamine,3) - ..() - -/datum/reagent/medicine/morphine - name = "Morphine" - description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." - reagent_state = LIQUID - color = "#A9FBFB" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 30 - addiction_threshold = 25 - -/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_PAIN_RESIST, type) - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - if(ishuman(L)) - var/mob/living/carbon/human/drugged = L - drugged.physiology.damage_resistance += 5 - -/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type) - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - if(ishuman(L)) - var/mob/living/carbon/human/drugged = L - drugged.physiology.damage_resistance -= 5 - ..() - -/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M) - if(current_cycle >= 5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name) - switch(current_cycle) - if(29) - to_chat(M, span_warning("You start to feel tired...")) - if(30 to 59) - M.drowsyness += 1 - if(60 to INFINITY) - M.Sleeping(40) - . = 1 - ..() - -/datum/reagent/medicine/morphine/overdose_start(mob/living/M) - . = ..() - ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) - -/datum/reagent/medicine/morphine/overdose_process(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(1*REM, 0) - . = 1 - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(2*REM, 0) - . = 1 - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(3*REM, 0) - . = 1 - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/tramal - name = "Tramal" - description = "A low intensity, high duration painkiller. Causes slight drowiness in extended use." - reagent_state = LIQUID - color = "#34eeee" - metabolization_rate = 0.2 * REAGENTS_METABOLISM - overdose_threshold = 35 - addiction_threshold = 30 - -/datum/reagent/medicine/tramal/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_PAIN_RESIST, type) - -/datum/reagent/medicine/tramal/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type) - ..() - -/datum/reagent/medicine/tramal/on_mob_life(mob/living/carbon/M) - if(current_cycle >= 5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_light, name) - switch(current_cycle) - if(60) - to_chat(M, span_warning("You feel drowsy...")) - if(61 to INFINITY) - M.drowsyness += 1 - ..() - -/datum/reagent/medicine/tramal/overdose_start(mob/living/M) - . = ..() - ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) - -/datum/reagent/medicine/tramal/overdose_process(mob/living/M) - if(prob(33)) - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/tramal/addiction_act_stage1(mob/living/M) - if(prob(33)) - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/tramal/addiction_act_stage2(mob/living/M) - if(prob(33)) - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/tramal/addiction_act_stage3(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/tramal/addiction_act_stage4(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(2*REM, 0) - . = 1 - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/dimorlin - name = "Dimorlin" - description = "A powerful opiate-derivative analgesiac. Extremely habit forming" - reagent_state = LIQUID - color = "#71adad" - metabolization_rate = 0.4 * REAGENTS_METABOLISM - overdose_threshold = 15 - addiction_threshold = 11 - -/datum/reagent/medicine/dimorlin/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_ANALGESIA, type) - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.set_screwyhud(SCREWYHUD_HEALTHY) - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - if(ishuman(L)) - var/mob/living/carbon/human/drugged = L - drugged.physiology.damage_resistance += 15 - -/datum/reagent/medicine/dimorlin/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_ANALGESIA, type) - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.set_screwyhud(SCREWYHUD_NONE) - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - if(ishuman(L)) - var/mob/living/carbon/human/drugged = L - drugged.physiology.damage_resistance -= 15 - ..() - -/datum/reagent/medicine/dimorlin/on_mob_life(mob/living/carbon/C) - C.set_screwyhud(SCREWYHUD_HEALTHY) - if(current_cycle >= 3) - SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name) - ..() - -/datum/reagent/medicine/dimorlin/overdose_start(mob/living/M) - . = ..() - ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type) - -/datum/reagent/medicine/dimorlin/overdose_process(mob/living/M) - if(prob(33)) - M.losebreath++ - M.adjustOxyLoss(4, 0) - if(prob(20)) - M.AdjustUnconscious(20) - if(prob(5)) - M.adjustOrganLoss(ORGAN_SLOT_EYES, 5) - ..() - -/datum/reagent/medicine/dimorlin/addiction_act_stage1(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/dimorlin/addiction_act_stage2(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(1*REM, 0) - . = 1 - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/dimorlin/addiction_act_stage3(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(2*REM, 0) - . = 1 - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/dimorlin/addiction_act_stage4(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(3*REM, 0) - . = 1 - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/oculine - name = "Oculine" - description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind." - reagent_state = LIQUID - color = "#404040" //oculine is dark grey, inacusiate is light grey - metabolization_rate = 0.25 * REAGENTS_METABOLISM - taste_description = "dull toxin" - -/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M) - var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return - eyes.applyOrganDamage(-2) - if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE)) - if(prob(20)) - to_chat(M, span_warning("Your vision slowly returns...")) - M.cure_blind(EYE_DAMAGE) - M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(35) - - else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE)) - to_chat(M, span_warning("The blackness in your peripheral vision fades.")) - M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(10) - else if(M.eye_blind || M.eye_blurry) - M.set_blindness(0) - M.set_blurriness(0) - ..() - -/datum/reagent/medicine/inacusiate - name = "Inacusiate" - description = "Instantly restores all hearing to the patient, but does not cure deafness." - color = "#606060" // ditto - -/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) - M.restoreEars() - ..() - -/datum/reagent/medicine/atropine - name = "Atropine" - description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients." - reagent_state = LIQUID - color = "#1D3535" //slightly more blue, like epinephrine - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 35 - -/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) - if(M.health <= M.crit_threshold) - M.adjustToxLoss(-2*REM, 0) - M.adjustBruteLoss(-2*REM, 0) - M.adjustFireLoss(-2*REM, 0) - M.adjustOxyLoss(-5*REM, 0) - . = 1 - M.losebreath = 0 - if(prob(20)) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/atropine/overdose_process(mob/living/M) - M.adjustToxLoss(0.5*REM, 0) - . = 1 - M.set_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/dizziness, max_duration = 20 SECONDS) - ..() - -/datum/reagent/medicine/epinephrine - name = "Epinephrine" - description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage." - reagent_state = LIQUID - color = "#D2FFFA" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 30 - -/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M) - ..() - ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type) - -/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/M) - REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type) - ..() - -/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M) - if(M.health <= M.crit_threshold) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - if(M.losebreath >= 4) - M.losebreath -= 2 - if(M.losebreath < 0) - M.losebreath = 0 - M.adjustStaminaLoss(-0.5*REM, 0) - . = 1 - if(prob(20)) - M.AdjustAllImmobility(-20) - ..() - -/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M) - if(prob(33)) - M.adjustStaminaLoss(2.5*REM, 0) - M.adjustToxLoss(1*REM, 0) - M.losebreath++ - . = 1 - ..() - -/datum/reagent/medicine/strange_reagent - name = "Strange Reagent" - description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living." - reagent_state = LIQUID - color = "#A0E85E" - metabolization_rate = 1.25 * REAGENTS_METABOLISM - taste_description = "magnets" - harmful = TRUE - -/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.stat != DEAD) - return ..() - if(M.hellbound) //they are never coming back - M.visible_message(span_warning("[M]'s body does not react...")) - return - if(iscarbon(M) && method != INGEST) //simplemobs can still be splashed - return ..() - var/amount_to_revive = round((M.getBruteLoss()+M.getFireLoss())/20) - if(M.getBruteLoss()+M.getFireLoss() >= 200 || HAS_TRAIT(M, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive. - M.visible_message(span_warning("[M]'s body convulses a bit, and then falls still once more.")) - M.do_jitter_animation(10) - return - M.visible_message(span_warning("[M]'s body starts convulsing!")) - M.notify_ghost_cloning("Your body is being revived with Strange Reagent!") - M.do_jitter_animation(10) - var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80) - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79) - ..() - -/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) - var/damage_at_random = rand(0,250)/100 //0 to 2.5 - M.adjustBruteLoss(damage_at_random*REM, FALSE) - M.adjustFireLoss(damage_at_random*REM, FALSE) - ..() - . = TRUE - -/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(type, 5)) - mytray.spawnplant() - -/datum/reagent/medicine/mannitol - name = "Mannitol" - description = "Efficiently restores brain damage." - color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey - -/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) - C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM) - ..() - -/datum/reagent/medicine/neurine - name = "Neurine" - description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." - color = "#C0C0C0" //ditto - -/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) - if(C.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin)) - C.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5) - if(prob(15)) - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - ..() - -/datum/reagent/medicine/mutadone - name = "Mutadone" - description = "Removes jitteriness and restores genetic defects." - color = "#5096C8" - taste_description = "acid" - -/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) - M.adjust_timed_status_effect(-100 SECONDS * REM, /datum/status_effect/jitter) - if(M.has_dna()) - M.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) - if(!QDELETED(M)) //We were a monkey, now a human - ..() - -/datum/reagent/medicine/antihol - name = "Antihol" - description = "Purges alcoholic substance from the patient's body and eliminates its side effects." - color = "#00B4C8" - taste_description = "raw egg" - -/datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M) - M.remove_status_effect(/datum/status_effect/dizziness) - M.drowsyness = 0 - M.slurring = 0 - M.confused = 0 - M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1) - M.adjustToxLoss(-0.2*REM, 0) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.adjust_drunk_effect(-10) - ..() - . = 1 - -/datum/reagent/medicine/stimulants - name = "Indoril" - description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage." - color = "#78008C" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 60 - -/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - -/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - ..() - -/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M) - if(M.health < 50 && M.health > 0) - M.adjustOxyLoss(-1*REM, 0) - M.adjustToxLoss(-1*REM, 0) - M.adjustBruteLoss(-1*REM, 0) - M.adjustFireLoss(-1*REM, 0) - M.AdjustAllImmobility(-60) - M.adjustStaminaLoss(-5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/stimulants/overdose_process(mob/living/M) - if(prob(33)) - M.adjustStaminaLoss(2.5*REM, 0) - M.adjustToxLoss(1*REM, 0) - M.losebreath++ - . = 1 - ..() - -/datum/reagent/medicine/insulin - name = "Insulin" - description = "Increases sugar depletion rates." - reagent_state = LIQUID - color = "#FFFFF0" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M) - if(M.AdjustSleeping(-20)) - . = 1 - M.reagents.remove_reagent(/datum/reagent/consumable/sugar, 3) - ..() - -//Trek Chems, simple to mix but weak as healing. Second tier trekchems will heal faster. -/datum/reagent/medicine/bicaridine - name = "Bicaridine" - description = "Restores bruising. Overdose causes it instead." - reagent_state = LIQUID - color = "#bf0000" - overdose_threshold = 30 - -/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-0.5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M) - M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = 1 - -/datum/reagent/medicine/bicaridinep - name = "Bicaridine Plus" - description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine." - reagent_state = LIQUID - color = "#bf0000" - overdose_threshold = 25 - -/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-2*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M) - M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = 1 - -/datum/reagent/medicine/dexalin - name = "Dexalin" - description = "Restores oxygen loss. Overdose causes it instead." - reagent_state = LIQUID - color = "#0080FF" - overdose_threshold = 30 - -/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(-0.5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/dexalin/overdose_process(mob/living/M) - M.adjustOxyLoss(2*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/dexalinp - name = "Dexalin Plus" - description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin." - reagent_state = LIQUID - color = "#0040FF" - overdose_threshold = 25 - -/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M) - M.adjustOxyLoss(-2*REM, 0) - if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 1 - if(holder.has_reagent(/datum/reagent/toxin/lexorin)) - holder.remove_reagent(/datum/reagent/toxin/lexorin, 3) - ..() - . = 1 - -/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M) - M.adjustOxyLoss(6*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/kelotane - name = "Kelotane" - description = "Heals burn damage. Overdose causes it instead." - reagent_state = LIQUID - color = "#FFa800" - overdose_threshold = 30 - -/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-0.5*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/kelotane/overdose_process(mob/living/M) - M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = 1 - -/datum/reagent/medicine/dermaline - name = "Dermaline" - description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity." - reagent_state = LIQUID - color = "#FF8000" - overdose_threshold = 25 - -/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/dermaline/overdose_process(mob/living/M) - M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = 1 - -/datum/reagent/medicine/antitoxin - name = "Dylovene" - description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage." - reagent_state = LIQUID - color = "#00a000" - overdose_threshold = 30 - taste_description = "a roll of gauze" - -/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-0.5*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,1) - ..() - . = 1 - -/datum/reagent/medicine/antitoxin/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/medicine/antitoxin/overdose_process(mob/living/M) - M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2. - ..() - . = 1 - -/datum/reagent/medicine/inaprovaline - name = "Inaprovaline" - description = "Stabilizes the breathing of patients. Good for those in critical condition." - reagent_state = LIQUID - color = "#A4D8D8" - -/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M) - if(M.losebreath >= 5) - M.losebreath -= 5 - ..() - -/datum/reagent/medicine/tricordrazine - name = "Tricordrazine" - description = "A weak dilutant that slowly heals brute, burn, and toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - taste_description = "water that has been standing still in a glass on a counter overnight" - -/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M) - if(prob(80)) - M.adjustBruteLoss(-0.25*REM, 0) - M.adjustFireLoss(-0.25*REM, 0) - M.adjustToxLoss(-0.25*REM, 0) - . = 1 - ..() -/datum/reagent/medicine/tetracordrazine //WS edit: Yes - name = "Tetracordrazine" - description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types." - reagent_state = LIQUID - color = "#C8A5DC" - taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it" - -/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M) - if(prob(80)) - M.adjustBruteLoss(-0.25*REM, 0) - M.adjustFireLoss(-0.25*REM, 0) - M.adjustToxLoss(-0.25*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - . = 1 - ..() - -/datum/reagent/medicine/regen_jelly - name = "Regenerative Jelly" - description = "Gradually regenerates all types of damage, without harming slime anatomy." - reagent_state = LIQUID - color = "#CC23FF" - taste_description = "jelly" - -/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume) - if(M && ishuman(M) && reac_volume >= 0.5) - var/mob/living/carbon/human/H = M - H.hair_color = "C2F" - H.facial_hair_color = "C2F" - H.update_hair() - -/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-1.5*REM, 0) - M.adjustFireLoss(-1.5*REM, 0) - M.adjustOxyLoss(-1.5*REM, 0) - M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs - ..() - . = 1 - -/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs - name = "Restorative Nanites" - description = "Miniature medical robots that swiftly restore bodily damage." - reagent_state = SOLID - color = "#555555" - overdose_threshold = 30 - process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs - -/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment. - M.adjustFireLoss(-5*REM, 0) - M.adjustOxyLoss(-15, 0) - M.adjustToxLoss(-5*REM, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) - M.adjustCloneLoss(-3*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots - if(prob(25)) - M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code - M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies - ..() - . = 1 - -/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants - name = "Earthsblood" - description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain. For some strange reason, it also induces temporary pacifism in those who imbibe it and semi-permanent pacifism in those who overdose on it." - color = "#FFAF00" - metabolization_rate = 0.4 //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations. - overdose_threshold = 25 - -/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) - if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE - M.adjustBruteLoss(-1 * REM, 0) - M.adjustFireLoss(-1 * REM, 0) - M.adjustOxyLoss(-0.5 * REM, 0) - M.adjustToxLoss(-0.5 * REM, 0) - M.adjustCloneLoss(-0.1 * REM, 0) - M.adjustStaminaLoss(-0.5 * REM, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! - else - M.adjustBruteLoss(-5 * REM, 0) //slow to start, but very quick healing once it gets going - M.adjustFireLoss(-5 * REM, 0) - M.adjustOxyLoss(-3 * REM, 0) - M.adjustToxLoss(-3 * REM, 0) - M.adjustCloneLoss(-1 * REM, 0) - M.adjustStaminaLoss(-3 * REM, 0) - M.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/jitter, 30 SECONDS) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) - M.druggy = min(max(0, M.druggy + 10), 15) //See above - ..() - . = 1 - -/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_PACIFISM, type) - -/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PACIFISM, type) - ..() - -/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M) - M.hallucination = min(max(0, M.hallucination + 5), 60) - if(current_cycle > 25) - M.adjustToxLoss(4 * REM, 0) - if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee - M.adjustToxLoss(6 * REM, 0) - if(iscarbon(M)) - var/mob/living/carbon/hippie = M - hippie.gain_trauma(/datum/brain_trauma/severe/pacifism) - ..() - . = 1 - -//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(type, 1)) - mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1)) - mytray.adjustPests(-rand(1,3)) - mytray.adjustWeeds (-rand(1,3)) - if(myseed) - myseed.adjust_instability(-round(chems.get_reagent_amount(type) * 1.3)) - myseed.adjust_potency(round(chems.get_reagent_amount(type))) - myseed.adjust_yield(round(chems.get_reagent_amount(type))) - myseed.adjust_endurance(round(chems.get_reagent_amount(type) * 0.5)) - myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.5)) - -/datum/reagent/medicine/haloperidol - name = "Haloperidol" - description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage." - reagent_state = LIQUID - color = "#27870a" - metabolization_rate = 0.4 * REAGENTS_METABOLISM - -/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) - for(var/datum/reagent/drug/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,5) - M.drowsyness += 2 - if(M.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS) - M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter) - if (M.hallucination >= 5) - M.hallucination -= 5 - if(prob(20)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50) - M.adjustStaminaLoss(2.5*REM, 0) - ..() - return TRUE - -/* WS edit begin - Lavaland rework -/datum/reagent/medicine/lavaland_extract - name = "Lavaland Extract" - description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise." - color = "#6B372E" //dark and red like lavaland - overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent - can_synth = FALSE - -/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M) - M.heal_bodypart_damage(5,5) - ..() - return TRUE - -/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) - M.adjustBruteLoss(3*REM, 0, FALSE, BODYTYPE_ORGANIC) - M.adjustFireLoss(3*REM, 0, FALSE, BODYTYPE_ORGANIC) - M.adjustToxLoss(3*REM, 0) - ..() - return TRUE -*/ //WS edit end - -//used for changeling's adrenaline power -/datum/reagent/medicine/changelingadrenaline - name = "Changeling Adrenaline" - description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." - color = "#C1151D" - overdose_threshold = 30 - -/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob) - ..() - M.AdjustAllImmobility(-20) - M.adjustStaminaLoss(-10, 0) - M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - return TRUE - -/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - -/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) - ..() - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - L.remove_status_effect(/datum/status_effect/dizziness) - L.remove_status_effect(/datum/status_effect/jitter) - -/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob) - M.adjustToxLoss(1, 0) - ..() - return TRUE - -/datum/reagent/medicine/changelinghaste - name = "Changeling Haste" - description = "Drastically increases movement speed, but deals toxin damage." - color = "#AE151D" - metabolization_rate = 1 - -/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) - -/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) - ..() - -/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(2, 0) - ..() - return TRUE - -/datum/reagent/medicine/corazone - // Heart attack code will not do damage if corazone is present - // because it's SPACE MAGIC ASPIRIN - name = "Corazone" - description = "A medication used to treat pain, fever, and inflammation, along with heart attacks. Can also be used to stabilize livers." - color = "#F49797" - self_consuming = TRUE - -/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M) - ..() - ADD_TRAIT(M, TRAIT_PAIN_RESIST, type) - ADD_TRAIT(M, TRAIT_STABLEHEART, type) - ADD_TRAIT(M, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type) - REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/cordiolis_hepatico - name = "Cordiolis Hepatico" - description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown." - color = "#000000" - self_consuming = TRUE - -/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M) - ..() - ADD_TRAIT(M, TRAIT_STABLELIVER, type) - ADD_TRAIT(M, TRAIT_STABLEHEART, type) - -/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M) - ..() - REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/muscle_stimulant - name = "Muscle Stimulant" - description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." - -/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L) - . = ..() - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - -/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L) - . = ..() - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - -/datum/reagent/medicine/modafinil - name = "Modafinil" - description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with." - reagent_state = LIQUID - color = "#BEF7D8" // palish blue white - metabolization_rate = 0.1 * REAGENTS_METABOLISM - overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) - taste_description = "salt" // it actually does taste salty - var/overdose_progress = 0 // to track overdose progress - -/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type) - ..() - -/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type) - ..() - -/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M) - if(!overdosed) // We do not want any effects on OD - overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun - M.AdjustAllImmobility(-5) - M.adjustStaminaLoss(-0.5*REM, 0) - M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 20 SECONDS) - metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick - . = TRUE - ..() - -/datum/reagent/medicine/modafinil/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You feel awfully out of breath and jittery!")) - metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.01 per tick on overdose - -/datum/reagent/medicine/modafinil/overdose_process(mob/living/M) - overdose_progress++ - switch(overdose_progress) - if(1 to 40) - M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS) - M.stuttering = min(M.stuttering+1, 10) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(prob(50)) - M.losebreath++ - if(41 to 80) - M.adjustOxyLoss(0.1*REM, 0) - M.adjustStaminaLoss(0.1*REM, 0) - M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS) - M.stuttering = min(M.stuttering+1, 20) - M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(prob(50)) - M.losebreath++ - if(prob(20)) - to_chat(M, span_userdanger("You have a sudden fit!")) - M.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used - if(81) - to_chat(M, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal - M.adjustOxyLoss(0.1*REM, 0) - M.adjustStaminaLoss(0.1*REM, 0) - if(82 to INFINITY) - M.Sleeping(100) - M.adjustOxyLoss(1.5*REM, 0) - M.adjustStaminaLoss(1.5*REM, 0) - ..() - return TRUE - -/datum/reagent/medicine/psicodine - name = "Psicodine" - description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." - reagent_state = LIQUID - color = "#07E79E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 30 - -/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_FEARLESS, type) - -/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, type) - ..() - -/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) - M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter) - M.adjust_timed_status_effect(-12 SECONDS * REM, /datum/status_effect/dizziness) - M.confused = max(0, M.confused-6) - M.disgust = max(0, M.disgust-6) - var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... - mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral - ..() - . = 1 - -/datum/reagent/medicine/psicodine/overdose_process(mob/living/M) - M.hallucination = min(max(0, M.hallucination + 5), 60) - M.adjustToxLoss(1, 0) - ..() - . = 1 - -/datum/reagent/medicine/metafactor - name = "Mitogen Metabolism Factor" - description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." - metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. - reagent_state = SOLID - color = "#FFBE00" - overdose_threshold = 10 - -/datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/M) - metabolization_rate = 2 * REAGENTS_METABOLISM - -/datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/M) - if(prob(25)) - M.vomit() - ..() - -/datum/reagent/medicine/silibinin - name = "Silibinin" - description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." - reagent_state = SOLID - color = "#FFFFD0" - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/silibinin/expose_mob(mob/living/carbon/M, method=INJECT, reac_volume) - if(method != INJECT) - return - - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1) //on injection, will heal the liver. This will (hopefully) fix dead livers. - - ..() - -/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented. - ..() - . = 1 - -/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. - name = "Polypyrylium Oligomers" - description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." - reagent_state = SOLID - color = "#9423FF" - metabolization_rate = 0.15 * REAGENTS_METABOLISM - overdose_threshold = 50 - taste_description = "numbing bitterness" - /// While this reagent is in our bloodstream, we reduce all bleeding by this factor - var/passive_bleed_modifier = 0.55 - /// For tracking when we tell the person we're no longer bleeding - var/was_working - -/datum/reagent/medicine/polypyr/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr) - if(!ishuman(M)) - return - - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod *= passive_bleed_modifier - return ..() - -/datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr) - //should probably generic proc this at a later point. I'm probably gonna use it a bit - if(was_working) - to_chat(M, span_warning("The medicine thickening your blood loses its effect!")) - if(!ishuman(M)) - return - - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod /= passive_bleed_modifier - - return ..() - - -/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) - M.adjustBruteLoss(-0.5, 0) - ..() - . = 1 - -/datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == SMOKE || method == VAPOR) - if(M && ishuman(M) && reac_volume >= 0.5) - var/mob/living/carbon/human/H = M - H.hair_color = "92f" - H.facial_hair_color = "92f" - H.update_hair() - -/datum/reagent/medicine/polypyr/overdose_process(mob/living/M) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) - ..() - . = 1 - -/datum/reagent/medicine/carthatoline - name = "Carthatoline" - description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage." - reagent_state = LIQUID - color = "#225722" - overdose_threshold = 25 - -/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-2*REM, 0) - if(M.getToxLoss() && prob(10)) - M.vomit(1) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,2) - ..() - . = 1 - -/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M) - M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math. - ..() - . = 1 - -/datum/reagent/medicine/bonefixingjuice - name = "C4L-Z1UM Agent" - description = "A peculiar substance capable of instantly regenerating live tissue." - taste_description = "milk" - metabolization_rate = 0 - -/datum/reagent/medicine/bonefixingjuice/on_mob_life(mob/living/M) - var/mob/living/carbon/C = M - switch(current_cycle) - if(1 to 10) - if(C.drowsyness < 10) - C.drowsyness += 2 - if(11 to 30) - C.adjustStaminaLoss(5) - if(31 to INFINITY) - C.AdjustSleeping(40) - //formerly everything-fixing juice - for(var/datum/wound/blunt/broken_bone in C.all_wounds) - broken_bone.remove_wound() - for(var/obj/item/organ/O in C.internal_organs) - O.damage = 0 - holder.remove_reagent(/datum/reagent/medicine/bonefixingjuice, 10) - ..() - -/datum/reagent/medicine/converbital - name = "Converbital" - description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns" - reagent_state = LIQUID - taste_description = "burning" - color = "#7a1f13" - metabolization_rate = REM * 1 - overdose_threshold = 25 - -/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, VAPOR, INJECT)) - M.adjustFireLoss(0.5*reac_volume) - if(show_message) - to_chat(M, span_warning("You feel a slight burning sensation...")) - else if(M.getBruteLoss()) - M.adjustBruteLoss(-reac_volume) - M.adjustFireLoss(reac_volume) - M.force_scream() - if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) - to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - else - to_chat(M, span_notice("You feel your skin shifting around unnaturally.")) - ..() - -/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(0.25*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/converbital/overdose_process(mob/living/M) - M.adjustFireLoss(2.5*REM, 0) - M.adjustToxLoss(0.5, 0) - ..() - . = 1 - -/datum/reagent/medicine/convuri - name = "Convuri" - description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing" - reagent_state = SOLID - taste_description = "white-hot pain" - color = "#b85505" - metabolization_rate = REM * 1 - overdose_threshold = 25 - -/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, VAPOR, INJECT)) - M.adjustBruteLoss(0.5*reac_volume) - if(show_message) - to_chat(M, span_warning("You feel a slight tearing sensation...")) - else if(M.getBruteLoss()) - M.adjustFireLoss(-reac_volume) - M.adjustBruteLoss(reac_volume) - M.force_scream() - if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA)) - to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - else - to_chat(M, span_notice("You feel your skin shifting around unnaturally.")) - ..() - -/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(0.25*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/convuri/overdose_process(mob/living/M) - M.adjustBruteLoss(2.5*REM, 0) - M.adjustToxLoss(0.5, 0) - ..() - . = 1 - -/datum/reagent/medicine/trophazole - name = "Trophazole" - description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides" - reagent_state = LIQUID - color = "#FFFF6B" - overdose_threshold = 20 - -/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment - ..() - . = 1 - -/datum/reagent/medicine/trophazole/overdose_process(mob/living/M) - M.adjustBruteLoss(3*REM, 0) - ..() - . = 1 - -/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume) - if(method != INGEST || !iscarbon(A)) - return - - A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05) - A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) - - ..() - - -/datum/reagent/medicine/rhigoxane - name = "Rhigoxane" - description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires." - reagent_state = LIQUID - color = "#F7FFA5" - overdose_threshold = 25 - reagent_weight = 0.6 - -/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-2*REM, 0.) - M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal) - ..() - . = 1 - -/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume) - if(method != VAPOR) - return - - M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200) - M.adjust_fire_stacks(-reac_volume / 2) - if(reac_volume >= metabolization_rate) - M.ExtinguishMob() - - ..() - -/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M) - M.adjustFireLoss(3*REM, 0.) - M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - ..() - - -/datum/reagent/medicine/thializid - name = "Thializid" - description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid." - reagent_state = LIQUID - color = "#8CDF24" // heavy saturation to make the color blend better - metabolization_rate = 0.75 * REAGENTS_METABOLISM - overdose_threshold = 6 - var/conversion_amount - -/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume) - if(method != INJECT || !iscarbon(A)) - return - var/mob/living/carbon/C = A - if(trans_volume >= 0.6) //prevents cheesing with ultralow doses. - C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel. - var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER] - if((L.organ_flags & ORGAN_FAILING) || !L) - return - conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize. - C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount) - C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount) - ..() - -/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8) - M.adjustToxLoss(-1*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,1) - - ..() - . = 1 - -/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) - M.adjust_disgust(3) - M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM) - ..() - . = 1 - -/datum/reagent/medicine/oxalizid - name = "Oxalizid" - description = "The active metabolite of thializid. Causes muscle weakness on overdose" - reagent_state = LIQUID - color = "#DFD54E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 25 - var/datum/brain_trauma/mild/muscle_weakness/U - -/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1) - M.adjustToxLoss(-1*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type,1) - ..() - . = 1 - -/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M) - U = new() - M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE) - ..() - -/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M) - if(U) - QDEL_NULL(U) - return ..() - -/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) - M.adjust_disgust(3) - ..() - . = 1 - -/datum/reagent/medicine/soulus - name = "Soulus Dust" - description = "Ground legion cores. The dust quickly seals wounds yet slowly causes the tissue to undergo necrosis." - reagent_state = SOLID - color = "#302f20" - metabolization_rate = REAGENTS_METABOLISM * 0.8 - overdose_threshold = 50 - var/tox_dam = 0.25 - -/datum/reagent/medicine/soulus/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(iscarbon(M) && M.stat != DEAD) - if(method in list(INGEST, INJECT)) - M.set_timed_status_effect(reac_volume SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - if(M.getFireLoss()) - M.adjustFireLoss(-reac_volume*1.2) - if(M.getBruteLoss()) - M.adjustBruteLoss(-reac_volume*1.2) - if(prob(50)) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_good, name) - else - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_bad, name) - ..() - -/datum/reagent/medicine/soulus/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-0.1*REM, 0) - M.adjustBruteLoss(-0.1*REM, 0) - M.adjustToxLoss(tox_dam*REM, 0) - ..() - -/datum/reagent/medicine/soulus/overdose_process(mob/living/M) - var/mob/living/carbon/C = M - if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) - var/obj/item/organ/legion_skull/spare_ribs = new() - spare_ribs.Insert(M) - ..() - -/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "legion") - ..() - -/datum/reagent/medicine/soulus/pure - name = "Purified Soulus Dust" - description = "Ground legion cores." - reagent_state = SOLID - color = "#302f20" - metabolization_rate = REAGENTS_METABOLISM - overdose_threshold = 100 - tox_dam = 0 - -/datum/reagent/medicine/puce_essence // P U C E - name = "Pucetylline Essence" - description = "Ground essence of puce crystals." - reagent_state = SOLID - color = "#CC8899" - metabolization_rate = 2.5 * REAGENTS_METABOLISM - overdose_threshold = 30 - -/datum/reagent/medicine/puce_essence/on_mob_life(mob/living/carbon/M) - if(prob(80)) - M.adjustToxLoss(-1*REM, 0) - else - M.adjustCloneLoss(-1*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type, 0.25) - if(holder.has_reagent(/datum/reagent/medicine/soulus)) // No, you can't chemstack with soulus dust - holder.remove_reagent(/datum/reagent/medicine/soulus, 5) - M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to puce - ..() - -/datum/reagent/medicine/puce_essence/expose_atom(atom/A, volume) - if(!iscarbon(A)) - A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) - ..() - -/datum/reagent/medicine/puce_essence/on_mob_end_metabolize(mob/living/M) - M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) puce - -/datum/reagent/medicine/puce_essence/overdose_process(mob/living/M) - M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal puce - -/datum/reagent/medicine/chartreuse // C H A R T R E U S E - name = "Chartreuse Solution" - description = "Refined essence of puce crystals." - reagent_state = SOLID - color = "#DFFF00" - metabolization_rate = 2.5 * REAGENTS_METABOLISM - overdose_threshold = 30 - -/datum/reagent/medicine/chartreuse/on_mob_life(mob/living/carbon/M) // Yes, you can chemstack with soulus dust - if(prob(80)) - M.adjustToxLoss(-2*REM, 0) - M.adjustCloneLoss(-1*REM, 0) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type, 1) - M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to chartreuse - ..() - -/datum/reagent/medicine/chartreuse/expose_atom(atom/A, volume) - if(!iscarbon(A)) - A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) - ..() - -/datum/reagent/medicine/chartreuse/on_mob_end_metabolize(mob/living/M) - M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) chartreuse - -/datum/reagent/medicine/chartreuse/overdose_process(mob/living/M) - M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal chartreuse - M.set_drugginess(15) // Also druggy - ..() - -/datum/reagent/medicine/lavaland_extract - name = "Lavaland Extract" - description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise." - color = "#6B372E" //dark and red like lavaland - metabolization_rate = REAGENTS_METABOLISM * 0.5 - overdose_threshold = 10 - -/datum/reagent/medicine/lavaland_extract/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - ADD_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) - ..() - -/datum/reagent/medicine/lavaland_extract/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC) - ..() - -/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(-1*REM, 0) - M.adjustBruteLoss(-1*REM, 0) - M.adjustToxLoss(-1*REM, 0) - if(M.health <= M.crit_threshold) - M.adjustOxyLoss(-1*REM, 0) - ..() - return TRUE - -/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // Thanks to actioninja - if(prob(2) && iscarbon(M)) - var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/obj/item/bodypart/bp = M.get_bodypart(selected_part) - if(bp) - M.visible_message(span_warning("[M] feels a spike of pain!!"), span_danger("You feel a spike of pain!!")) - bp.receive_damage(0, 0, 200) - else //SUCH A LUST FOR REVENGE!!! - to_chat(M, span_warning("A phantom limb hurts!")) - return ..() - -/datum/reagent/medicine/skeletons_boon - name = "Skeleton’s Boon" - description = "A robust solution of minerals that greatly strengthens the bones." - color = "#dbdfa2" - metabolization_rate = REAGENTS_METABOLISM * 0.125 - overdose_threshold = 50 - var/plasma_armor = 33 - var/skele_armor = 20 - var/added_armor = 0 - -/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) - if(isplasmaman(M)) - var/mob/living/carbon/human/H = M - H.physiology.armor.melee += plasma_armor - H.physiology.armor.bullet += plasma_armor - added_armor = plasma_armor - if(isskeleton(M)) - var/mob/living/carbon/human/H = M - H.physiology.armor.melee += skele_armor - H.physiology.armor.bullet += skele_armor - added_armor = skele_armor - ..() - -/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) - REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.physiology.armor.melee -= added_armor - H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist - ..() - -/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M) - ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC) - REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) - ..() - -/datum/reagent/medicine/lithium_carbonate - name = "Lithium Carbonate" - description = "A mood stabilizer discovered by most spacefaring civilizations. Fairly widespread as a result." - color = "#b3acaa" //grey. boring. - reagent_state = SOLID - metabolization_rate = REAGENTS_METABOLISM * 0.5 - overdose_threshold = 20 - -/datum/reagent/medicine/lithium_carbonate/on_mob_life(mob/living/carbon/M) - var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - if(mood.sanity <= SANITY_GREAT) - mood.setSanity(min(mood.sanity+5, SANITY_GREAT)) - ..() - . = 1 - -/datum/reagent/medicine/lithium_carbonate/overdose_process(mob/living/M) - if(prob(5)) - M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM) - ..() - . = 1 - -/datum/reagent/medicine/melatonin - name = "Human Sleep Hormone" - description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to." - color = "#e1b1e1" //very light pink ourple - overdose_threshold = 0 - var/regenerating - var/rachnid_limb - -/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L) - . = ..() - if(iscarbon(L)) - var/mob/living/carbon/imbiber = L - if(isspiderperson(imbiber)) - //we check limbs, if one is missing, we break from the for loop after setting it to heal - for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!imbiber.get_bodypart(limb)) - rachnid_limb = limb - break - -/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L) - . = ..() - if(isspiderperson(L) && regenerating) - var/mob/living/carbon/spider - spider.regenerate_limb(rachnid_limb, TRUE, FALSE) - return - - -/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M) - . = ..() - if(isvox(M)) - M.adjustToxLoss(1) - if(islizard(M)) - if(prob(10)) - M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) - if(isspiderperson(M) && rachnid_limb) - if(prob(7)) - to_chat(M, "Your body aches near [rachnid_limb]") - if(current_cycle > 20 && !regenerating) - regenerating = TRUE - - else - if(M.IsSleeping()) - if(M.getBruteLoss() && M.getFireLoss()) - if(prob(50)) - M.adjustBruteLoss(-0.5) - else - M.adjustFireLoss(-0.5) - else if(M.getBruteLoss()) - M.adjustBruteLoss(-0.2) - else if(M.getFireLoss()) - M.adjustFireLoss(-0.2) - -/datum/reagent/medicine/stasis - name = "Stasis" - description = "A liquid blue chemical that causes the body to enter a chemically induced stasis, irregardless of current state." - reagent_state = LIQUID - color = "#51b5cb" //a nice blue - overdose_threshold = 0 - -/datum/reagent/medicine/stasis/expose_mob(mob/living/M, method=INJECT, reac_volume, show_message = 1) - if(method != INJECT) - return - if(iscarbon(M)) - var/stasis_duration = min(20 SECONDS * reac_volume, 300 SECONDS) - to_chat(M, span_warning("Your body starts to slow down, sensation retreating from your limbs!")) - M.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT) - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT), stasis_duration, TIMER_UNIQUE) - -/datum/reagent/medicine/stasis/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(1) - ..() - . = 1 - -/datum/reagent/medicine/carfencadrizine - name = "Carfencadrizine" - description = "A highly potent synthetic painkiller held in a suspension of stimulating agents. Allows people to keep moving long beyond when they should stop." - color = "#859480" - overdose_threshold = 8 - addiction_threshold = 7 - metabolization_rate = 0.1 - -/datum/reagent/medicine/carfencadrizine/on_mob_metabolize(mob/living/L) - . = ..() - ADD_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine) - ADD_TRAIT(L, TRAIT_PINPOINT_EYES, type) - ADD_TRAIT(L, TRAIT_NOSOFTCRIT, type) - ADD_TRAIT(L, TRAIT_NOHARDCRIT, type) - -/datum/reagent/medicine/carfencadrizine/on_mob_end_metabolize(mob/living/L) - . = ..() - REMOVE_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine) - REMOVE_TRAIT(L, TRAIT_PINPOINT_EYES, type) - REMOVE_TRAIT(L, TRAIT_NOSOFTCRIT, type) - REMOVE_TRAIT(L, TRAIT_NOHARDCRIT, type) - -/datum/reagent/medicine/carfencadrizine/on_mob_life(mob/living/carbon/M) - if(current_cycle >= 3) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name) - - if(M.health <= M.crit_threshold) - if(prob(20)) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 4) - if(prob(40)) - M.playsound_local(get_turf(M), 'sound/health/slowbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) - ..() - -/datum/reagent/medicine/carfencadrizine/overdose_process(mob/living/M) - if(prob(66)) - M.losebreath++ - M.adjustOxyLoss(4, 0) - if(prob(40)) - M.AdjustUnconscious(20) - if(prob(10)) - M.adjustOrganLoss(ORGAN_SLOT_EYES, 3) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 7) - ..() - -/datum/reagent/medicine/carfencadrizine/addiction_act_stage1(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) - ..() - -/datum/reagent/medicine/carfencadrizine/addiction_act_stage2(mob/living/M) - if(prob(33)) - M.drop_all_held_items() - M.adjustToxLoss(1*REM, 0) - . = 1 - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - if(prob(15)) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 1) - ..() - -/datum/reagent/medicine/carfencadrizine/addiction_act_stage3(mob/living/M) - if(prob(50)) - M.drop_all_held_items() - M.adjustToxLoss(1*REM, 0) - . = 1 - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - if(prob(30)) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) - ..() - -/datum/reagent/medicine/carfencadrizine/addiction_act_stage4(mob/living/M) - if(prob(60)) - M.drop_all_held_items() - M.adjustToxLoss(1*REM, 0) - . = 1 - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE) - if(prob(40)) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 2) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 2) - ..() - -// helps bleeding wounds clot faster -/datum/reagent/medicine/chitosan - name = "chitosan" - description = "Vastly improves the blood's natural ability to coagulate and stop bleeding by hightening platelet production and effectiveness. Overdosing will cause extreme blood clotting, resulting in potential brain damage." - reagent_state = LIQUID - color = "#bb2424" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 20 - /// The bloodiest wound that the patient has will have its blood_flow reduced by this much each tick - var/clot_rate = 0.3 - /// While this reagent is in our bloodstream, we reduce all bleeding by this factor - var/passive_bleed_modifier = 0.7 - /// For tracking when we tell the person we're no longer bleeding - var/was_working - -/datum/reagent/medicine/chitosan/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan) - - if(!ishuman(M)) - return - - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod *= passive_bleed_modifier - return ..() - -/datum/reagent/medicine/chitosan/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan) - - if(was_working) - to_chat(M, span_warning("The medicine thickening your blood loses its effect!")) - if(!ishuman(M)) - return - - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod /= passive_bleed_modifier - - return ..() - -/datum/reagent/medicine/chitosan/on_mob_life(mob/living/carbon/M) - . = ..() - if(!M.blood_volume || !M.all_wounds) - return - - var/datum/wound/bloodiest_wound - - for(var/i in M.all_wounds) - var/datum/wound/iter_wound = i - if(iter_wound.blood_flow) - if(iter_wound.blood_flow > bloodiest_wound?.blood_flow) - bloodiest_wound = iter_wound - - if(bloodiest_wound) - if(!was_working) - to_chat(M, span_green("You can feel your flowing blood start thickening!")) - was_working = TRUE - bloodiest_wound.blood_flow = max(0, bloodiest_wound.blood_flow - clot_rate) - else if(was_working) - was_working = FALSE - -/datum/reagent/medicine/chitosan/overdose_process(mob/living/carbon/M) - . = ..() - if(!M.blood_volume) - return - - if(prob(15)) - M.losebreath += rand(2,4) - M.adjustOxyLoss(rand(1,3)) - if(prob(30)) - to_chat(M, span_danger("You can feel your blood clotting up in your veins!")) - else if(prob(10)) - to_chat(M, span_userdanger("You feel like your blood has stopped moving!")) - M.adjustOxyLoss(rand(3,4)) - - if(prob(50)) - var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) - our_lungs.applyOrganDamage(1) - else if(prob(25)) - var/obj/item/organ/lungs/our_brain = M.getorganslot(ORGAN_SLOT_BRAIN) - our_brain.applyOrganDamage(1) - else - var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) - our_heart.applyOrganDamage(1) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 722e37194fd..13990f81670 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -292,51 +292,9 @@ M.adjustFireLoss(2, 0) // burns ..() -/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" - description = "Something that shouldn't exist on this plane of existence." - taste_description = "suffering" - -/datum/reagent/fuel/unholywater/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if((method == TOUCH || method == SMOKE) || method == VAPOR) - M.reagents.add_reagent(type,reac_volume/4) - return - return ..() - -/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M) - // Will deal about 90 damage when 50 units are thrown - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) - M.adjustToxLoss(2, 0) - M.adjustFireLoss(2, 0) - M.adjustOxyLoss(2, 0) - M.adjustBruteLoss(2, 0) - holder.remove_reagent(type, 1) - return TRUE - -/datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god - name = "Hell Water" - description = "YOUR FLESH! IT BURNS!" - taste_description = "burning" - accelerant_quality = 20 - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M) - M.fire_stacks = min(5,M.fire_stacks + 3) - M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire - M.adjustToxLoss(1, 0) - M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard? - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 150) - holder.remove_reagent(type, 1) - -/datum/reagent/medicine/omnizine/godblood - name = "Godblood" - description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." - overdose_threshold = 150 - -///Used for clownery /datum/reagent/lube - name = "Space Lube" - description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + name = "Industrial Lubricant" + description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them." color = "#009CA8" // rgb: 0, 156, 168 taste_description = "cherry" // by popular demand var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs. @@ -347,12 +305,6 @@ if(reac_volume >= 1) T.MakeSlippery(lube_kind, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) -///Stronger kind of lube. Applies TURF_WET_SUPERLUBE. -/datum/reagent/lube/superlube - name = "Super Duper Lube" - description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]." - lube_kind = TURF_WET_SUPERLUBE - /datum/reagent/spraytan name = "Spray Tan" description = "A substance applied to the skin to darken the skin." @@ -437,33 +389,6 @@ H.visible_message("[H] suddenly transforms!") randomize_human(H) -/datum/reagent/aslimetoxin - name = "Advanced Mutation Toxin" - description = "An advanced corruptive toxin produced by slimes." - color = "#13BC5E" // rgb: 19, 188, 94 - taste_description = "slime" - -/datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume) - if(method != TOUCH && method != SMOKE) - L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) - -/datum/reagent/gluttonytoxin - name = "Gluttony's Blessing" - description = "An advanced corruptive toxin produced by something terrible." - color = "#5EFF3B" //RGB: 94, 255, 59 - can_synth = FALSE - taste_description = "decay" - -/datum/reagent/gluttonytoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume) - L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) - -/datum/reagent/serotrotium - name = "Serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - color = "#202040" // rgb: 20, 20, 40 - metabolization_rate = 0.25 * REAGENTS_METABOLISM - taste_description = "bitterness" - /datum/reagent/oxygen name = "Oxygen" description = "A colorless, odorless gas. Grows on trees but is still pretty valuable." @@ -1491,13 +1416,8 @@ myseed.adjust_weed_chance(round(chems.get_reagent_amount(type) * 0.3)) myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.075)) - - - // GOON OTHERS - - /datum/reagent/fuel/oil name = "Oil" description = "Burns in a small smoky fire, can be used to get Ash." @@ -2319,13 +2239,13 @@ /datum/reagent/crystal_reagent name = "Crystal Reagent" - description = "A strange crystal substance. Heals faster than omnizine." + description = "A strange crystalline substance with an impressive healing factor." reagent_state = LIQUID color = "#1B9681" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 20 - taste_description = "rocks" - var/healing = 0.8 + taste_description = "sharp rocks" + var/healing = 2 /datum/reagent/crystal_reagent/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-healing*REM, 0) @@ -2395,12 +2315,11 @@ ) /datum/reagent/three_eye/on_mob_metabolize(mob/living/L) . = ..() - //addtimer(CALLBACK(L, TYPE_PROC_REF(/mob, add_client_colour), /datum/client_colour/thirdeye), 1.5 SECONDS) L.add_client_colour(/datum/client_colour/thirdeye) if(L.client?.holder) //You are worthy. worthy = TRUE - L.visible_message(span_danger("Grips their head and dances around, collapsing to the floor!"), \ - span_danger("Visions of a realm BYOND your own flash across your eyes, before it all goes black...")) + L.visible_message(span_danger("[L] grips their head and dances around, collapsing to the floor!"), \ + span_danger("Visions of a realm BYOND your own flash across your eyes, before it all goes black...")) addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, set_sleeping), 40 SECONDS), 10 SECONDS) addtimer(CALLBACK(L.reagents, TYPE_PROC_REF(/datum/reagents, remove_reagent), src.type, src.volume,), 10 SECONDS) return @@ -2420,7 +2339,7 @@ H.seizure() H.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(2, 4)) if(prob(7)) - to_chat(M, span_warning("[pick(dose_messages)]")) + to_chat(M, span_warning("[pick(dose_messages)]")) /datum/reagent/three_eye/overdose_start(mob/living/M) on_mob_metabolize(M) //set worthy diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index bf425d23534..c4d68f26a38 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -512,25 +512,6 @@ else ..() -/datum/reagent/toxin/fentanyl - name = "Fentanyl" - description = "Fentanyl will inhibit brain function and cause toxin damage before eventually knocking out its victim." - reagent_state = LIQUID - color = "#64916E" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - toxpwr = 0 - -/datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM, 150) - if(M.toxloss <= 60) - M.adjustToxLoss(1*REM, 0) - if(current_cycle >= 4) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle >= 18) - M.Sleeping(40) - ..() - return TRUE - /datum/reagent/toxin/cyanide name = "Cyanide" description = "An infamous poison known for its use in assassination. Causes small amounts of toxin damage with a small chance of oxygen damage or a stun." diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm deleted file mode 100644 index c68438fa73c..00000000000 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ /dev/null @@ -1,86 +0,0 @@ - - -/*****BRUTE*****/ - -/datum/chemical_reaction/helbital - results = list(/datum/reagent/medicine/c2/helbital = 3) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) - mix_message = "The mixture turns into a thick, yellow powder." - -/datum/chemical_reaction/libital - results = list(/datum/reagent/medicine/c2/libital = 3) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1) - - -/*WS Begin - Fixes medicines - -/datum/chemical_reaction/probital - results = list(/datum/reagent/medicine/c2/probital = 4) - required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) - -WS End */ - -/*****BURN*****/ - -/*WS Begin - No CobbyChems - -/datum/chemical_reaction/lenturi - results = list(/datum/reagent/medicine/c2/lenturi = 5) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) - -*/ - -/datum/chemical_reaction/aiuri - results = list(/datum/reagent/medicine/c2/aiuri = 4) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) - -/*WS Begin - Fixes medicines - -/datum/chemical_reaction/hercuri - results = list(/datum/reagent/medicine/c2/hercuri = 5) - required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) - required_temp = 47 - is_cold_recipe = TRUE - -WS End */ - -/*****OXY*****/ - -/*WS Begin - No CobbyChems - -/datum/chemical_reaction/convermol - results = list(/datum/reagent/medicine/c2/convermol = 3) - required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) - required_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." - -*/ - -/datum/chemical_reaction/tirimol - results = list(/datum/reagent/medicine/c2/tirimol = 5) - required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) - required_catalysts = list(/datum/reagent/toxin/acid = 1) - -/*****TOX*****/ - -/datum/chemical_reaction/seiver - results = list(/datum/reagent/medicine/c2/seiver = 3) - required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1) - -/*WS Begin - No CobbyChems - -/datum/chemical_reaction/multiver - results = list(/datum/reagent/medicine/c2/multiver = 2) - required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1) - mix_message = "The mixture yields a fine black powder." - required_temp = 380 - -/datum/chemical_reaction/syriniver - results = list(/datum/reagent/medicine/c2/syriniver = 5) - required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) - -*/ - -/datum/chemical_reaction/penthrite - results = list(/datum/reagent/medicine/c2/penthrite = 3) - required_reagents = list(/datum/reagent/pentaerythritol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/wittel = 1) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index ecfc31e5e76..36aa9d73477 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -59,3 +59,4 @@ required_catalysts = list(/datum/reagent/toxin/plasma = 5) mix_message = "The mixture concentrates into itself, taking on a deep coloration!" required_temp = 150 + is_cold_recipe = TRUE diff --git a/code/modules/reagents/chemistry/recipes/medical_consumables.dm b/code/modules/reagents/chemistry/recipes/medical_consumables.dm new file mode 100644 index 00000000000..259a5efe409 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/medical_consumables.dm @@ -0,0 +1,11 @@ +/datum/chemical_reaction/medmesh + required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) + mob_react = FALSE + +/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/medical/mesh/advanced(location) + +/datum/chemical_reaction/medmesh/ash + required_reagents = list(/datum/reagent/ash_fibers = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index d973ec45275..221c20ee2d4 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,105 +1,58 @@ +// brute chems -/datum/chemical_reaction/bicaridine - results = list(/datum/reagent/medicine/bicaridine = 3) - required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) - -/datum/chemical_reaction/bicaridinep - results = list(/datum/reagent/medicine/bicaridinep = 3) - required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sodiumchloride = 1) - -/datum/chemical_reaction/kelotane - results = list(/datum/reagent/medicine/kelotane = 2) - required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1) - -/datum/chemical_reaction/dermaline - results = list(/datum/reagent/medicine/dermaline = 3) - required_reagents = list(/datum/reagent/medicine/kelotane = 1, /datum/reagent/acetone = 1, /datum/reagent/phosphorus = 1) - -/datum/chemical_reaction/antitoxin - results = list(/datum/reagent/medicine/antitoxin = 3) - required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1) - -/datum/chemical_reaction/dexalin - results = list(/datum/reagent/medicine/dexalin = 5) - required_reagents = list(/datum/reagent/oxygen = 5) - required_catalysts = list(/datum/reagent/toxin/plasma = 1) - -/datum/chemical_reaction/dexalinp - results = list(/datum/reagent/medicine/dexalinp = 3) - required_reagents = list(/datum/reagent/medicine/dexalin = 1, /datum/reagent/carbon = 1, /datum/reagent/iron = 1) - -/datum/chemical_reaction/tricordrazine - results = list(/datum/reagent/medicine/tricordrazine = 3) - required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/medicine/kelotane = 1, /datum/reagent/medicine/antitoxin = 1) - -/datum/chemical_reaction/tetracordrazine - results = list(/datum/reagent/medicine/tetracordrazine = 4) - required_reagents = list(/datum/reagent/medicine/tricordrazine = 3, /datum/reagent/medicine/dexalin = 1) -/datum/chemical_reaction/synthflesh - results = list(/datum/reagent/medicine/synthflesh = 3) - required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/styptic_powder = 1) +/datum/chemical_reaction/indomide + results = list(/datum/reagent/medicine/indomide = 4) + required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) -/datum/chemical_reaction/styptic_powder - results = list(/datum/reagent/medicine/styptic_powder = 4) - required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) +/datum/chemical_reaction/hadrakine + results = list(/datum/reagent/medicine/hadrakine = 4) + required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) mix_message = "The solution yields an astringent powder." -/datum/chemical_reaction/corazone - results = list(/datum/reagent/medicine/corazone = 3) - required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) - -/datum/chemical_reaction/carthatoline - results = list(/datum/reagent/medicine/carthatoline = 3) - required_reagents = list(/datum/reagent/medicine/antitoxin = 1, /datum/reagent/carbon = 2) - required_catalysts = list(/datum/reagent/toxin/plasma = 1) - -/*/datum/chemical_reaction/hepanephrodaxon //WS edit: temporary removal of an overloaded chem - results = list(/datum/reagent/medicine/hepanephrodaxon = 5) - required_reagents = list(/datum/reagent/medicine/carthatoline = 2, /datum/reagent/carbon = 2, /datum/reagent/lithium = 1) - required_catalysts = list(/datum/reagent/toxin/plasma = 5)*/ - -/datum/chemical_reaction/system_cleaner - results = list(/datum/reagent/medicine/system_cleaner = 4) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) - -/datum/chemical_reaction/liquid_solder - results = list(/datum/reagent/medicine/liquid_solder = 3) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1) - required_temp = 370 - mix_message = "The mixture becomes a metallic slurry." +/datum/chemical_reaction/silfrine + results = list(/datum/reagent/medicine/silfrine = 5) + required_reagents = list(/datum/reagent/silver = 3, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/toxin/acid = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 2) + required_temp = 450 + mix_message = "The solution rapidly bubbles, before yielding a dark blue compound" -/datum/chemical_reaction/perfluorodecalin - results = list(/datum/reagent/medicine/perfluorodecalin = 3) - required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) - required_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." +// burn chems /datum/chemical_reaction/leporazine results = list(/datum/reagent/medicine/leporazine = 2) required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) -/datum/chemical_reaction/rezadone - results = list(/datum/reagent/medicine/rezadone = 3) - required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) +/datum/chemical_reaction/alvitane + results = list(/datum/reagent/medicine/alvitane = 4) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1, /datum/reagent/silver = 2) + required_catalysts = list(/datum/reagent/cryptobiolin = 5) + required_temp = 220 + is_cold_recipe = TRUE + mix_message = "The solution quietly incorporates as the temperatures drop." -/datum/chemical_reaction/spaceacillin - results = list(/datum/reagent/medicine/spaceacillin = 2) - required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) +/datum/chemical_reaction/quardexane + results = list(/datum/reagent/medicine/quardexane = 5) + required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) -/datum/chemical_reaction/oculine - results = list(/datum/reagent/medicine/oculine = 3) - required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) - mix_message = "The mixture bubbles noticeably and becomes a dark grey color!" +/datum/chemical_reaction/ysiltane + results = list(/datum/reagent/medicine/ysiltane = 5) + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/hydrogen = 1, /datum/reagent/chlorine = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 10) + mix_message = "The solution quickly fizzes, a small cloud of smoke coming out!" -/datum/chemical_reaction/inacusiate - results = list(/datum/reagent/medicine/inacusiate = 2) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/charcoal = 1) - mix_message = "The mixture sputters loudly and becomes a light grey color!" +/datum/chemical_reaction/ysiltane/on_reaction(datum/reagents/holder, created_volume) + var/datum/effect_system/smoke_spread/bad/smoke = new (get_turf(holder.my_atom)) + smoke.set_up(1, src) + smoke.start() + qdel(smoke) -/datum/chemical_reaction/synaptizine - results = list(/datum/reagent/medicine/synaptizine = 3) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) +// toxin chems + +/datum/chemical_reaction/calomel + results = list(/datum/reagent/medicine/calomel = 2) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) + required_temp = 374 /datum/chemical_reaction/charcoal results = list(/datum/reagent/medicine/charcoal = 2) @@ -107,34 +60,29 @@ mix_message = "The mixture yields a fine black powder." required_temp = 380 -/datum/chemical_reaction/silver_sulfadiazine - results = list(/datum/reagent/medicine/silver_sulfadiazine = 5) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) - -/datum/chemical_reaction/salglu_solution - results = list(/datum/reagent/medicine/salglu_solution = 3) - required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) - -/datum/chemical_reaction/mine_salve - results = list(/datum/reagent/medicine/mine_salve = 3) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) +/datum/chemical_reaction/pancrazine + results = list(/datum/reagent/medicine/pancrazine = 3) + required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1) + required_catalysts = list(/datum/reagent/ammonia = 5) -/datum/chemical_reaction/mine_salve2 - results = list(/datum/reagent/medicine/mine_salve = 15) - required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these +/datum/chemical_reaction/gjalrazine + results = list(/datum/reagent/medicine/gjalrazine = 10) + required_reagents = list(/datum/reagent/medicine/pancrazine = 3, /datum/reagent/carbon = 4, /datum/reagent/diethylamine = 3) + required_catalysts = list(/datum/reagent/toxin/plasma = 1) -/*WS Begin - No Cobbychmes +// oxygen chems -/datum/chemical_reaction/instabitaluri - results = list(/datum/reagent/medicine/c2/instabitaluri = 3) - required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1) +/datum/chemical_reaction/dexalin + results = list(/datum/reagent/medicine/dexalin = 5) + required_reagents = list(/datum/reagent/oxygen = 5) + required_catalysts = list(/datum/reagent/toxin/plasma = 1) -WS End */ +/datum/chemical_reaction/salbutamol + results = list(/datum/reagent/medicine/salbutamol = 5) + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) + required_catalysts = list(/datum/reagent/toxin/acid) -/datum/chemical_reaction/calomel - results = list(/datum/reagent/medicine/calomel = 2) - required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) - required_temp = 374 +///radiation chems /datum/chemical_reaction/potass_iodide results = list(/datum/reagent/medicine/potass_iodide = 2) @@ -144,48 +92,63 @@ WS End */ results = list(/datum/reagent/medicine/pen_acid = 6) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1) -/datum/chemical_reaction/sal_acid - results = list(/datum/reagent/medicine/sal_acid = 5) - required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) -/datum/chemical_reaction/oxandrolone - results = list(/datum/reagent/medicine/oxandrolone = 6) - required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) +///Multi-damage chems -/datum/chemical_reaction/salbutamol - results = list(/datum/reagent/medicine/salbutamol = 5) - required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) +/datum/chemical_reaction/synthflesh + results = list(/datum/reagent/medicine/synthflesh = 3) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/hadrakine = 1) -/datum/chemical_reaction/ephedrine - results = list(/datum/reagent/medicine/ephedrine = 4) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) - mix_message = "The solution fizzes and gives off toxic fumes." +/datum/chemical_reaction/cryoxadone + results = list(/datum/reagent/medicine/cryoxadone = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) -/datum/chemical_reaction/diphenhydramine - results = list(/datum/reagent/medicine/diphenhydramine = 4) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) - mix_message = "The mixture dries into a pale blue powder." +/datum/chemical_reaction/cureall + results = list(/datum/reagent/medicine/cureall = 3) + required_reagents = list(/datum/reagent/medicine/alvitane = 1, /datum/reagent/medicine/indomide = 1, /datum/reagent/medicine/charcoal = 1) -/datum/chemical_reaction/oculine - results = list(/datum/reagent/medicine/oculine = 3) - required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) - mix_message = "The mixture sputters loudly and becomes a pale pink color." +/datum/chemical_reaction/cureall_alternative + results = list(/datum/reagent/medicine/cureall = 5) + required_reagents = list(/datum/reagent/medicine/panacea/effluvial = 5, /datum/reagent/toxin/plasma = 1) + mix_message = "The plasma begins tinting the compound as it incorporates into the mix" -/datum/chemical_reaction/atropine - results = list(/datum/reagent/medicine/atropine = 5) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) +/datum/chemical_reaction/panacea + results = list(/datum/reagent/medicine/panacea = 5) + required_reagents = list(/datum/reagent/medicine/panacea/effluvial = 3, /datum/reagent/stable_plasma = 1, /datum/reagent/medicine/cryoxadone = 1) + required_temp = 78 + is_cold_recipe = TRUE -/datum/chemical_reaction/epinephrine - results = list(/datum/reagent/medicine/epinephrine = 6) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) +/datum/chemical_reaction/hunter_extract + results = list(/datum/reagent/medicine/hunter_extract = 5) + required_reagents = list(/datum/reagent/consumable/vitfro = 1, /datum/reagent/medicine/puce_essence = 2, /datum/reagent/toxin/plasma = 2) + +///Blood chems + +/datum/chemical_reaction/chitosan + results = list(/datum/reagent/medicine/chitosan = 10) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/consumable/sugar = 2, /datum/reagent/cryptobiolin = 1) + required_temp = 380 + +/datum/chemical_reaction/chitosan_failure + results = list(/datum/reagent/carbon = 1) + required_reagents = list(/datum/reagent/medicine/chitosan = 1) + required_temp = 405 + +/datum/chemical_reaction/salglu_solution + results = list(/datum/reagent/medicine/salglu_solution = 3) + required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) + +///Organ chems -/datum/chemical_reaction/strange_reagent - results = list(/datum/reagent/medicine/strange_reagent = 3) - required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/oculine + results = list(/datum/reagent/medicine/oculine = 3) + required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) + mix_message = "The mixture bubbles noticeably and becomes a dark grey color!" -/datum/chemical_reaction/strange_reagent/alt - results = list(/datum/reagent/medicine/strange_reagent = 2) - required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/inacusiate + results = list(/datum/reagent/medicine/inacusiate = 2) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/charcoal = 1) + mix_message = "The mixture sputters loudly and becomes a light grey color!" /datum/chemical_reaction/mannitol results = list(/datum/reagent/medicine/mannitol = 3) @@ -196,49 +159,30 @@ WS End */ results = list(/datum/reagent/medicine/neurine = 3) required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) -/datum/chemical_reaction/mutadone - results = list(/datum/reagent/medicine/mutadone = 3) - required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) - -/datum/chemical_reaction/antihol - results = list(/datum/reagent/medicine/antihol = 3) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/copper = 1) - -/datum/chemical_reaction/cryoxadone - results = list(/datum/reagent/medicine/cryoxadone = 3) - required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) - -/datum/chemical_reaction/pyroxadone - results = list(/datum/reagent/medicine/pyroxadone = 2) - required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) - -/datum/chemical_reaction/clonexadone - results = list(/datum/reagent/medicine/clonexadone = 2) - required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) - required_catalysts = list(/datum/reagent/toxin/plasma = 5) - -/datum/chemical_reaction/haloperidol - results = list(/datum/reagent/medicine/haloperidol = 5) - required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) +/datum/chemical_reaction/corazone + results = list(/datum/reagent/medicine/corazone = 3) + required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) -/datum/chemical_reaction/regen_jelly - results = list(/datum/reagent/medicine/regen_jelly = 1) - required_reagents = list(/datum/reagent/medicine/tetracordrazine = 1, /datum/reagent/toxin/slimejelly = 1) +///pain chems -/datum/chemical_reaction/regen_jelly2 - results = list(/datum/reagent/medicine/regen_jelly = 2) - required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1) +/datum/chemical_reaction/tramal + results = list(/datum/reagent/medicine/tramal = 2) // these make me kinda wish i knew irl chem so i could have better recipes. + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1) + required_catalysts = list(/datum/reagent/ammonia = 2) + required_temp = 340 /datum/chemical_reaction/morphine results = list(/datum/reagent/medicine/morphine = 2) required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) required_temp = 480 -/datum/chemical_reaction/tramal - results = list(/datum/reagent/medicine/tramal = 2) // these make me kinda wish i knew irl chem so i could have better recipes. - required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1) - required_catalysts = list(/datum/reagent/ammonia = 2) - required_temp = 340 + +/datum/chemical_reaction/carfen + results = list(/datum/reagent/medicine/carfencadrizine = 4) + required_reagents = list(/datum/reagent/medicine/dimorlin = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/sugar = 2) + required_catalysts = list(/datum/reagent/toxin/plasma = 2) + required_temp = 127 + is_cold_recipe = TRUE /datum/chemical_reaction/dimorlin results = list(/datum/reagent/medicine/dimorlin = 2, /datum/reagent/hydrogen = 2) @@ -246,6 +190,28 @@ WS End */ required_temp = 730 mix_message = "The mixture rapidly incorporates, leaving a layer of liquid hydrogen atop!" +/// status chems + +/datum/chemical_reaction/spaceacillin + results = list(/datum/reagent/medicine/spaceacillin = 2) + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) + +/datum/chemical_reaction/synaptizine + results = list(/datum/reagent/medicine/synaptizine = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) + +/datum/chemical_reaction/mutadone + results = list(/datum/reagent/medicine/mutadone = 3) + required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) + +/datum/chemical_reaction/antihol + results = list(/datum/reagent/medicine/antihol = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/copper = 1) + +/datum/chemical_reaction/haloperidol + results = list(/datum/reagent/medicine/haloperidol = 5) + required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) + /datum/chemical_reaction/modafinil results = list(/datum/reagent/medicine/modafinil = 5) required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1) @@ -255,54 +221,68 @@ WS End */ results = list(/datum/reagent/medicine/psicodine = 5) required_reagents = list(/datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) -/datum/chemical_reaction/medmesh - required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) - mob_react = FALSE +/datum/chemical_reaction/diphenhydramine + results = list(/datum/reagent/medicine/diphenhydramine = 4) + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) + mix_message = "The mixture dries into a pale blue powder." + +/datum/chemical_reaction/lithium_carbonate + results = list(/datum/reagent/medicine/lithium_carbonate = 3) + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/carbon = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/medical/mesh/advanced(location) +/datum/chemical_reaction/synaptizine + results = list(/datum/reagent/medicine/synaptizine = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/converbital - results = list(/datum/reagent/medicine/converbital = 3) - required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/acetone = 1, /datum/reagent/medicine/kelotane = 1) - mix_message = "The mixture spits and steams as it settles into a reddish-black paste" +/// crit chems -/datum/chemical_reaction/convuri - results = list(/datum/reagent/medicine/convuri = 3) - required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ash =1, /datum/reagent/medicine/bicaridine = 1) - mix_message = "the mixture rapidly dries into an orange powder" +/datum/chemical_reaction/atropine + results = list(/datum/reagent/medicine/atropine = 5) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) -/datum/chemical_reaction/trophazole - results = list(/datum/reagent/medicine/trophazole = 4) - required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) +/datum/chemical_reaction/epinephrine + results = list(/datum/reagent/medicine/epinephrine = 6) + required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) -/datum/chemical_reaction/rhigoxane - results = list(/datum/reagent/medicine/rhigoxane/ = 5) - required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) +///things im not going to organize right now (This means they should be in another file) -/datum/chemical_reaction/thializid - results = list(/datum/reagent/medicine/thializid = 5) - required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) +/datum/chemical_reaction/rezadone + results = list(/datum/reagent/medicine/rezadone = 3) + required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) -/datum/chemical_reaction/medsuture/ash - required_reagents = list(/datum/reagent/ash_fibers = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) +/datum/chemical_reaction/stasis + results = list(/datum/reagent/medicine/stasis = 5) + required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/copper = 1, /datum/reagent/medicine/salglu_solution = 3) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) + required_temp = 207 + is_cold_recipe = TRUE -/datum/chemical_reaction/medmesh/ash - required_reagents = list(/datum/reagent/ash_fibers = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) +/datum/chemical_reaction/system_cleaner + results = list(/datum/reagent/medicine/system_cleaner = 4) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1) -/datum/chemical_reaction/lavaland_extract - results = list(/datum/reagent/medicine/lavaland_extract = 5) - required_reagents = list(/datum/reagent/consumable/vitfro = 1, /datum/reagent/medicine/puce_essence = 2, /datum/reagent/toxin/plasma = 2) +/datum/chemical_reaction/liquid_solder + results = list(/datum/reagent/medicine/liquid_solder = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1) + required_temp = 370 + mix_message = "The mixture becomes a metallic slurry." /datum/chemical_reaction/bonefixingjuice results = list(/datum/reagent/medicine/bonefixingjuice = 3) required_reagents = list(/datum/reagent/consumable/entpoly = 1, /datum/reagent/calcium = 1, /datum/reagent/toxin/plasma = 1) -/datum/chemical_reaction/skele_boon - results = list(/datum/reagent/medicine/skeletons_boon = 5) - required_reagents = list(/datum/reagent/medicine/lavaland_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5) +/datum/chemical_reaction/mine_salve + results = list(/datum/reagent/medicine/mine_salve = 3) + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) + +/datum/chemical_reaction/mine_salve2 + results = list(/datum/reagent/medicine/mine_salve = 15) + required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these + +/datum/chemical_reaction/ephedrine + results = list(/datum/reagent/medicine/ephedrine = 4) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) + mix_message = "The solution fizzes and gives off toxic fumes." /datum/chemical_reaction/pure_soulus_dust_hollow results = list(/datum/reagent/medicine/soulus/pure = 20,) @@ -315,29 +295,3 @@ WS End */ /datum/chemical_reaction/chartreuse results = list(/datum/reagent/medicine/chartreuse = 10) required_reagents = list(/datum/reagent/medicine/puce_essence = 5, /datum/reagent/consumable/tinlux = 5, /datum/reagent/consumable/entpoly = 1) - -/datum/chemical_reaction/lithium_carbonate - results = list(/datum/reagent/medicine/lithium_carbonate = 3) - required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/carbon = 1, /datum/reagent/water = 1) - -/datum/chemical_reaction/chitosan - results = list(/datum/reagent/medicine/chitosan = 10) - required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/consumable/sugar = 2, /datum/reagent/cryptobiolin = 1) - required_temp = 380 - -/datum/chemical_reaction/chitosan_failure - results = list(/datum/reagent/carbon = 1) - required_reagents = list(/datum/reagent/medicine/chitosan = 1) - required_temp = 405 - -/datum/chemical_reaction/stasis - results = list(/datum/reagent/medicine/stasis = 5) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/copper = 1, /datum/reagent/medicine/salglu_solution = 3) - required_catalysts = list(/datum/reagent/toxin/plasma = 5) - required_temp = 207 - -/datum/chemical_reaction/carfen - results = list(/datum/reagent/medicine/carfencadrizine = 4) - required_reagents = list(/datum/reagent/medicine/dimorlin = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/sugar = 2) - required_catalysts = list(/datum/reagent/toxin/plasma = 2) - required_temp = 127 diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 3450e1f4634..897c833214f 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -7,14 +7,6 @@ results = list(/datum/reagent/lube = 4) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) -/datum/chemical_reaction/spraytan - results = list(/datum/reagent/spraytan = 2) - required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1) - -/datum/chemical_reaction/spraytan2 - results = list(/datum/reagent/spraytan = 2) - required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1) - /datum/chemical_reaction/impedrezene results = list(/datum/reagent/impedrezene = 2) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) @@ -398,7 +390,7 @@ /datum/chemical_reaction/carpet/purple results = list(/datum/reagent/carpet/purple = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/medicine/regen_jelly = 1) + required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/colorful_reagent/powder/purple = 1) //slimes only party /datum/chemical_reaction/carpet/red @@ -468,7 +460,7 @@ //butterflium /datum/chemical_reaction/butterflium - required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) + required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/panacea = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) /datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 94acf9d39cc..7a8f0069406 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -54,7 +54,7 @@ strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/rdx - results = list(/datum/reagent/rdx= 2) + results = list(/datum/reagent/rdx = 2) required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1) required_temp = 404 strengthdiv = 6 //rdx deserves better than being just about equal to nitrous @@ -133,11 +133,11 @@ /datum/chemical_reaction/reagent_explosion/penthrite_explosion_epinephrine - required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) + required_reagents = list(/datum/reagent/medicine/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) strengthdiv = 5 /datum/chemical_reaction/reagent_explosion/penthrite_explosion_atropine - required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/atropine = 1) + required_reagents = list(/datum/reagent/medicine/penthrite = 1, /datum/reagent/medicine/atropine = 1) strengthdiv = 5 modifier = 5 @@ -511,4 +511,4 @@ results = list(/datum/reagent/firefighting_foam = 3) required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1) required_temp = 200 - is_cold_recipe = 1 + is_cold_recipe = TRUE diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 0d6b1b8a66f..d564913266d 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -4,11 +4,6 @@ required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1) required_temp = 420 -/datum/chemical_reaction/fentanyl - results = list(/datum/reagent/toxin/fentanyl = 1) - required_reagents = list(/datum/reagent/drug/space_drugs = 1) - required_temp = 674 - /datum/chemical_reaction/cyanide results = list(/datum/reagent/toxin/cyanide = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1) @@ -81,7 +76,7 @@ /datum/chemical_reaction/rotatium results = list(/datum/reagent/toxin/rotatium = 3) - required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1) + required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/drug/methamphetamine = 1) mix_message = span_danger("After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight.") /datum/chemical_reaction/anacea diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 73f24c4aa33..fa8ca15b631 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -26,7 +26,7 @@ Borg Hypospray var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/antitoxin, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/morphine) + var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/alvitane, /datum/reagent/medicine/indomide, /datum/reagent/medicine/pancrazine, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/morphine) var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. //Used as list for input() in shakers. @@ -154,7 +154,7 @@ Borg Hypospray icon_state = "borghypo_s" charge_cost = 20 recharge_time = 2 - reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine) + reagent_ids = list(/datum/reagent/medicine/panacea, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine) bypass_protection = 1 accepts_reagent_upgrades = FALSE @@ -249,7 +249,7 @@ Borg Shaker /obj/item/reagent_containers/borghypo/peace/hacked desc = "Everything's peaceful in death!" icon_state = "borghypo_s" - reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl) + reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/epi diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index a0847a5b26f..68c605cbc9f 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -69,11 +69,6 @@ desc = "A small bottle of Mannitol. Useful for healing brain damage." list_reagents = list(/datum/reagent/medicine/mannitol = 30) -/obj/item/reagent_containers/glass/bottle/charcoal - name = "charcoal bottle" - desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream." - list_reagents = list(/datum/reagent/medicine/charcoal = 30) - /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." @@ -131,7 +126,7 @@ /obj/item/reagent_containers/glass/bottle/traitor/Initialize() . = ..() - extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide) + extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/cyanide) reagents.add_reagent(extra_reagent, 3) /obj/item/reagent_containers/glass/bottle/polonium @@ -149,11 +144,6 @@ desc = "A small bottle. Contains Venom." list_reagents = list(/datum/reagent/toxin/venom = 30) -/obj/item/reagent_containers/glass/bottle/fentanyl - name = "fentanyl bottle" - desc = "A small bottle. Contains Fentanyl." - list_reagents = list(/datum/reagent/toxin/fentanyl = 30) - /obj/item/reagent_containers/glass/bottle/formaldehyde name = "formaldehyde bottle" desc = "A small bottle. Contains formaldehyde, a chemical that prevents organs from decaying." @@ -407,23 +397,22 @@ volume = 50 list_reagents = list(/datum/reagent/medicine/epinephrine = 50) -/obj/item/reagent_containers/glass/bottle/bicaridine - name = "bicaridine bottle" - desc = "A small bottle. Contains bicaridine, used to treat minor bruising." +/obj/item/reagent_containers/glass/bottle/indomide + name = "indomide bottle" + desc = "A small bottle. Contains indomide, used to treat minor bruising." volume = 50 - list_reagents = list(/datum/reagent/medicine/bicaridine = 50) + list_reagents = list(/datum/reagent/medicine/indomide = 50) -/obj/item/reagent_containers/glass/bottle/kelotane - name = "kelotane bottle" - desc = "A small bottle. Contains kelotane, used for minor burns and skin damage." +/obj/item/reagent_containers/glass/bottle/alvitane + name = "alvitane bottle" + desc = "A small bottle. Contains alvitane, used for minor burns and skin damage. Best used as injection!" volume = 50 - list_reagents = list(/datum/reagent/medicine/kelotane = 50) + list_reagents = list(/datum/reagent/medicine/alvitane = 50) -/obj/item/reagent_containers/glass/bottle/antitoxin - name = "dylovene bottle" - desc = "A small bottle. Contains dylovene, used to treat minor poisoning." - volume = 50 - list_reagents = list(/datum/reagent/medicine/antitoxin = 50) +/obj/item/reagent_containers/glass/bottle/charcoal + name = "charcoal bottle" + desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream." + list_reagents = list(/datum/reagent/medicine/charcoal = 30) /obj/item/reagent_containers/glass/bottle/dexalin name = "dexalin bottle" @@ -431,16 +420,22 @@ volume = 50 list_reagents = list(/datum/reagent/medicine/dexalin = 50) +/obj/item/reagent_containers/glass/bottle/gjalrazine + name = "gjalrazine bottle" + desc = "A small bottle. Contains gjalrazine, used to treat major toxic damage." + volume = 50 + list_reagents = list(/datum/reagent/medicine/gjalrazine = 50) + /obj/item/reagent_containers/glass/bottle/epinephrine/sleeper cap_on = FALSE -/obj/item/reagent_containers/glass/bottle/bicaridine/sleeper +/obj/item/reagent_containers/glass/bottle/indomide/sleeper cap_on = FALSE -/obj/item/reagent_containers/glass/bottle/kelotane/sleeper +/obj/item/reagent_containers/glass/bottle/alvitane/sleeper cap_on = FALSE -/obj/item/reagent_containers/glass/bottle/antitoxin/sleeper +/obj/item/reagent_containers/glass/bottle/charcoal/sleeper cap_on = FALSE /obj/item/reagent_containers/glass/bottle/dexalin/sleeper diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index f661f39670e..17d40765ed3 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -197,13 +197,13 @@ /obj/item/reagent_containers/glass/beaker/slime list_reagents = list(/datum/reagent/toxin/slimejelly = 50) -/obj/item/reagent_containers/glass/beaker/large/styptic - name = "styptic reserve tank" - list_reagents = list(/datum/reagent/medicine/styptic_powder = 50) +/obj/item/reagent_containers/glass/beaker/large/hadrakine + name = "hadrakine reserve tank" + list_reagents = list(/datum/reagent/medicine/hadrakine = 50) -/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine - name = "silver sulfadiazine reserve tank" - list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 50) +/obj/item/reagent_containers/glass/beaker/large/quardexane + name = "quardexane reserve tank" + list_reagents = list(/datum/reagent/medicine/quardexane = 50) /obj/item/reagent_containers/glass/beaker/large/charcoal name = "charcoal reserve tank" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 8818fb83045..f299a595e5f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -75,7 +75,7 @@ /obj/item/reagent_containers/hypospray/CMO - list_reagents = list(/datum/reagent/medicine/omnizine = 30) + list_reagents = list(/datum/reagent/medicine/panacea = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //combat @@ -88,20 +88,7 @@ icon_state = "combat_hypo" volume = 90 ignore_flags = 1 // So they can heal their comrades. - list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) - -/obj/item/reagent_containers/hypospray/combat/nanites - name = "experimental combat stimulant injector" - desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical nanites and a stimulant for rapid healing and a combat boost." - item_state = "nanite_hypo" - icon_state = "nanite_hypo" - base_icon_state = "nanite_hypo" - volume = 100 - list_reagents = list(/datum/reagent/medicine/adminordrazine/quantum_heal = 80, /datum/reagent/medicine/synaptizine = 20) - -/obj/item/reagent_containers/hypospray/combat/nanites/update_icon_state() - icon_state = "[base_icon_state][(reagents.total_volume > 0) ? null : 0]" - return ..() + list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/panacea = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) //MediPens @@ -153,28 +140,13 @@ amount_per_transfer_from_this = 20 list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/consumable/coffee = 10) -/obj/item/reagent_containers/hypospray/medipen/stimpack/traitor - desc = "A modified stimulants autoinjector for use in combat situations. Has a mild healing effect." - list_reagents = list(/datum/reagent/medicine/stimulants = 10, /datum/reagent/medicine/omnizine = 10) - -//watered down traitor stim /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis name = "crisis stimpack" icon_state = "stimpen" item_state = "stimpen" base_icon_state = "stimpen" desc = "A modified stimulant autoinjector, containing a cocktail of potent nerve excitants and long-release healing chemicals. Designed for use in emergency situations where medical help may be hours or days away." - list_reagents = list(/datum/reagent/medicine/stimulants = 5, /datum/reagent/medicine/ephedrine = 5, /datum/reagent/medicine/omnizine = 15) - -/obj/item/reagent_containers/hypospray/medipen/stimulants - name = "stimulant medipen" - desc = "Contains a very large amount of an incredibly powerful stimulant, vastly increasing your movement speed and reducing stuns by a very large amount for around five minutes. Do not take if pregnant." - icon_state = "syndipen" - item_state = "tbpen" - base_icon_state = "syndipen" - volume = 50 - amount_per_transfer_from_this = 50 - list_reagents = list(/datum/reagent/medicine/stimulants = 50) + list_reagents = list(/datum/reagent/medicine/stimulants = 5, /datum/reagent/medicine/ephedrine = 5, /datum/reagent/medicine/panacea = 15) /obj/item/reagent_containers/hypospray/medipen/morphine name = "morphine medipen" @@ -188,13 +160,29 @@ list_reagents = list(/datum/reagent/medicine/tramal = 10) custom_price = 25 -/obj/item/reagent_containers/hypospray/medipen/oxandrolone - name = "oxandrolone medipen" - desc = "A autoinjector containing oxandrolone, used to treat severe burns." +/obj/item/reagent_containers/hypospray/medipen/silfrine + name = "silfrine medipen" + desc = "A autoinjector containing silfrine, used to near-instantly reknit hewn flesh." + icon_state = "salpen" + item_state = "salpen" + base_icon_state = "salpen" + list_reagents = list(/datum/reagent/medicine/silfrine = 10) + +/obj/item/reagent_containers/hypospray/medipen/ysiltane + name = "ysiltane medipen" + desc = "A autoinjector containing ysiltane, used to rapidly clear up widespread surface-level burning." icon_state = "oxapen" item_state = "oxapen" base_icon_state = "oxapen" - list_reagents = list(/datum/reagent/medicine/oxandrolone = 10) + list_reagents = list(/datum/reagent/medicine/ysiltane = 10) + +/obj/item/reagent_containers/hypospray/medipen/gjalrazine + name = "gjalrazine medipen" + desc = "A autoinjector containing Gjalrazine, used to purge the body of toxic after effects." + icon_state = "penacid" + item_state = "penacid" + base_icon_state = "penacid" + list_reagents = list(/datum/reagent/medicine/gjalrazine = 10) /obj/item/reagent_containers/hypospray/medipen/penacid name = "pentetic acid medipen" @@ -204,14 +192,6 @@ base_icon_state = "penacid" list_reagents = list(/datum/reagent/medicine/pen_acid = 10) -/obj/item/reagent_containers/hypospray/medipen/salacid - name = "salicylic acid medipen" - desc = "A autoinjector containing salicylic acid, used to treat severe brute damage." - icon_state = "salacid" - item_state = "salacid" - base_icon_state = "salacid" - list_reagents = list(/datum/reagent/medicine/sal_acid = 10) - /obj/item/reagent_containers/hypospray/medipen/salbutamol name = "salbutamol medipen" desc = "A autoinjector containing salbutamol, used to heal oxygen damage quickly." @@ -305,10 +285,10 @@ amount_per_transfer_from_this = 10 custom_price = 25 -/obj/item/reagent_containers/hypospray/medipen/tricord - name = "tricordrazine injector" - desc = "An injector filled with tricordrazine, a mildly effective healing agent." - list_reagents = list(/datum/reagent/medicine/tricordrazine = 15) +/obj/item/reagent_containers/hypospray/medipen/cureall + name = "cureall injector" + desc = "An injector filled with cureall, a mildly effective healing agent." + list_reagents = list(/datum/reagent/medicine/cureall = 15) volume = 15 amount_per_transfer_from_this = 15 icon_state = "morphen" @@ -345,7 +325,7 @@ /obj/item/reagent_containers/hypospray/medipen/combat_drug name = "combat cocktail" desc = "An injector filled with a potent combat drug mixture. Straight from the Shoal." - list_reagents = list(/datum/reagent/drug/combat_drug = 6, /datum/reagent/medicine/bicaridinep = 6, /datum/reagent/medicine/dermaline = 6) + list_reagents = list(/datum/reagent/drug/combat_drug = 6, /datum/reagent/medicine/silfrine = 6, /datum/reagent/medicine/ysiltane = 6) volume = 18 amount_per_transfer_from_this = 18 icon_state = "syndipen" @@ -371,6 +351,16 @@ base_icon_state = "syndipen" item_state = "syndipen" +/obj/item/reagent_containers/hypospray/medipen/netzach + name = "\improper Nesah injector" + desc = "A combat injector filled with a tightly curated mixture of regenerative compounds. \"The Fearlessness To Go Forward\" is etched in small text opposite the activator." + list_reagents = list(/datum/reagent/medicine/silfrine = 10, /datum/reagent/medicine/ysiltane = 10, /datum/reagent/drug/aranesp = 10, /datum/reagent/medicine/morphine = 10) + volume = 40 + amount_per_transfer_from_this = 40 + icon_state = "penacid" + base_icon_state = "penacid" + item_state = "penacid" + /obj/item/reagent_containers/hypospray/medipen/placebatol name = "prescription medipen" desc = "An injector filled with some prescribed substance." @@ -412,19 +402,19 @@ var/penetrates = TRUE /obj/item/hypospray/mkii/brute - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide /obj/item/hypospray/mkii/toxin - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine /obj/item/hypospray/mkii/oxygen start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin /obj/item/hypospray/mkii/burn - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane -/obj/item/hypospray/mkii/tricord - start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord +/obj/item/hypospray/mkii/cureall + start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall /obj/item/hypospray/mkii/mkiii name = "hypospray mk.III" @@ -691,7 +681,7 @@ custom_price = 500 volume = 35 amount_per_transfer_from_this = 36 - list_reagents = list(/datum/reagent/medicine/epinephrine = 5.5, /datum/reagent/medicine/lavaland_extract = 3, /datum/reagent/drug/methamphetamine = 2, /datum/reagent/medicine/morphine = 0.5, /datum/reagent/medicine/leporazine = 6, /datum/reagent/medicine/salglu_solution = 8, /datum/reagent/medicine/oxandrolone = 5, /datum/reagent/medicine/sal_acid = 5) + list_reagents = list(/datum/reagent/medicine/epinephrine = 5.5, /datum/reagent/medicine/hunter_extract = 3, /datum/reagent/drug/methamphetamine = 2, /datum/reagent/medicine/morphine = 0.5, /datum/reagent/medicine/leporazine = 6, /datum/reagent/medicine/salglu_solution = 8, /datum/reagent/medicine/ysiltane = 5, /datum/reagent/medicine/silfrine = 5) #undef HYPO_SPRAY #undef HYPO_INJECT diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index f776eae8260..64d3fc1fd2e 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -121,30 +121,30 @@ unique_reskin = null -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine - name = "red hypovial (bicaridine)" +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide + name = "red hypovial (indomide)" icon_state = "hypovial-b" - comes_with = list(/datum/reagent/medicine/bicaridine = 60) + comes_with = list(/datum/reagent/medicine/indomide = 60) -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin - name = "green hypovial (Dylovene)" +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine + name = "green hypovial (pancrazine)" icon_state = "hypovial-a" - comes_with = list(/datum/reagent/medicine/antitoxin = 60) + comes_with = list(/datum/reagent/medicine/pancrazine = 60) -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane - name = "orange hypovial (kelotane)" +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane + name = "orange hypovial (alvitane)" icon_state = "hypovial-k" - comes_with = list(/datum/reagent/medicine/kelotane = 60) + comes_with = list(/datum/reagent/medicine/alvitane = 60) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin name = "blue hypovial (dexalin)" icon_state = "hypovial-d" comes_with = list(/datum/reagent/medicine/dexalin = 60) -/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord - name = "hypovial (tricordrazine)" +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall + name = "hypovial (cureall)" icon_state = "hypovial" - comes_with = list(/datum/reagent/medicine/tricordrazine = 60) + comes_with = list(/datum/reagent/medicine/cureall = 60) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/morphine name = "hypovial (morphine)" @@ -176,7 +176,7 @@ name = "hypovial (shoal juice)" icon_state = "hypovial-b" amount_per_transfer_from_this = 10 - comes_with = list(/datum/reagent/drug/combat_drug = 20, /datum/reagent/medicine/bicaridinep = 10, /datum/reagent/medicine/dermaline = 10, /datum/reagent/medicine/synaptizine = 20) + comes_with = list(/datum/reagent/drug/combat_drug = 20, /datum/reagent/medicine/silfrine = 20, /datum/reagent/medicine/ysiltane = 20) /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/stasis name = "hypovial (stasis)" @@ -187,37 +187,37 @@ /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO name = "deluxe hypovial" icon_state = "hypoviallarge-cmos" - comes_with = list(/datum/reagent/medicine/omnizine = 40, /datum/reagent/medicine/leporazine = 40, /datum/reagent/medicine/atropine = 40) + comes_with = list(/datum/reagent/medicine/panacea = 40, /datum/reagent/medicine/leporazine = 40, /datum/reagent/medicine/atropine = 40) -/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine - name = "large red hypovial (bicaridine plus)" +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/silfrine + name = "large red hypovial (silfrine)" icon_state = "hypoviallarge-b" - comes_with = list(/datum/reagent/medicine/bicaridinep = 120) + comes_with = list(/datum/reagent/medicine/silfrine = 120) -/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin - name = "large green hypovial (carthatoline)" +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/gjalrazine + name = "large green hypovial (gjalrazine)" icon_state = "hypoviallarge-a" - comes_with = list(/datum/reagent/medicine/carthatoline = 120) + comes_with = list(/datum/reagent/medicine/gjalrazine = 120) -/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane - name = "large orange hypovial (dermaline)" +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/ysiltane + name = "large orange hypovial (ysiltane)" icon_state = "hypoviallarge-k" - comes_with = list(/datum/reagent/medicine/dermaline = 120) + comes_with = list(/datum/reagent/medicine/ysiltane = 120) -/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin - name = "large blue hypovial (dexalin plus)" +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salbutamol + name = "large blue hypovial (salbutamol)" icon_state = "hypoviallarge-d" - comes_with = list(/datum/reagent/medicine/dexalinp = 120) + comes_with = list(/datum/reagent/medicine/salbutamol = 120) /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/charcoal name = "large black hypovial (charcoal)" icon_state = "hypoviallarge-t" comes_with = list(/datum/reagent/medicine/charcoal = 120) -/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/tricord - name = "large hypovial (tricord)" +/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/cureall + name = "large hypovial (cureall)" icon_state = "hypoviallarge" - comes_with = list(/datum/reagent/medicine/tricordrazine = 120) + comes_with = list(/datum/reagent/medicine/cureall = 120) /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salglu name = "large green hypovial (salglu)" @@ -232,4 +232,4 @@ /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat name = "combat hypovial" icon_state = "hypoviallarge-t" - comes_with = list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/medicine/omnizine = 19, /datum/reagent/medicine/leporazine = 19, /datum/reagent/medicine/atropine = 19) //Epinephrine's main effect here is to kill suff damage, so we don't need much given atropine + comes_with = list(/datum/reagent/drug/combat_drug = 40, /datum/reagent/medicine/silfrine = 20, /datum/reagent/medicine/ysiltane = 20, /datum/reagent/medicine/synaptizine = 40) diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index 06f7840749c..59ba90a1a60 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -74,17 +74,17 @@ reagents.trans_to(M, amount_per_transfer_from_this, transfered_by = user, method = apply_type) return -/obj/item/reagent_containers/medigel/styptic - name = "medical gel (styptic powder)" - desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains styptic powder, for treating cuts and bruises." +/obj/item/reagent_containers/medigel/hadrakine + name = "medical gel (hadrakine powder)" + desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains hadrakine powder, for treating cuts and bruises." icon_state = "brutegel" - list_reagents = list(/datum/reagent/medicine/styptic_powder = 60) + list_reagents = list(/datum/reagent/medicine/hadrakine = 60) -/obj/item/reagent_containers/medigel/silver_sulf - name = "medical gel (silver sulfadiazine)" - desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains silver sulfadiazine, useful for treating burns." +/obj/item/reagent_containers/medigel/quardexane + name = "medical gel (quardexane)" + desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains quardexane, useful for treating burns." icon_state = "burngel" - list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 60) + list_reagents = list(/datum/reagent/medicine/quardexane = 60) /obj/item/reagent_containers/medigel/synthflesh name = "medical gel (synthflesh)" diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index af8baf074c1..89b075e0c42 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -27,16 +27,16 @@ return 0 return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance. -/obj/item/reagent_containers/pill/patch/styptic - name = "brute patch" +/obj/item/reagent_containers/pill/patch/indomide + name = "indomide patch" desc = "Helps with brute injuries." - list_reagents = list(/datum/reagent/medicine/styptic_powder = 20) + list_reagents = list(/datum/reagent/medicine/indomide = 20) icon_state = "bandaid_brute" -/obj/item/reagent_containers/pill/patch/silver_sulf - name = "burn patch" +/obj/item/reagent_containers/pill/patch/alvitane + name = "alvitane patch" desc = "Helps with burn injuries." - list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 20) + list_reagents = list(/datum/reagent/medicine/alvitane = 20) icon_state = "bandaid_burn" /obj/item/reagent_containers/pill/patch/synthflesh diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 068aeffcffa..0a47719ab5c 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -146,18 +146,18 @@ list_reagents = list(/datum/reagent/medicine/mutadone = 50) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/salicylic - name = "salicylic acid pill" - desc = "Used to dull pain." +/obj/item/reagent_containers/pill/silfrine + name = "silfrine pill" + desc = "Used to stimulate brute healing." icon_state = "pill9" - list_reagents = list(/datum/reagent/medicine/sal_acid = 24) + list_reagents = list(/datum/reagent/medicine/silfrine = 15) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/oxandrolone - name = "oxandrolone pill" +/obj/item/reagent_containers/pill/ysiltane + name = "ysiltane pill" desc = "Used to stimulate burn healing." icon_state = "pill11" - list_reagents = list(/datum/reagent/medicine/oxandrolone = 24) + list_reagents = list(/datum/reagent/medicine/ysiltane = 15) rename_with_volume = TRUE /obj/item/reagent_containers/pill/insulin @@ -195,13 +195,6 @@ icon_state = "pill22" rename_with_volume = TRUE -/obj/item/reagent_containers/pill/hsh - name = "HSH pill" - desc = "A pill of Human Sleep Hormone." - list_reagents = list(/datum/reagent/medicine/melatonin = 10) - icon_state = "pill22" - rename_with_volume = TRUE - ///////////////////////////////////////// Psychologist inventory pills /obj/item/reagent_containers/pill/happinesspsych name = "mood stabilizer pill" @@ -286,17 +279,6 @@ icon_state = "pill18" list_reagents = list(/datum/reagent/drug/finobranc = 5) -/*WS Begin - No Cobbychem - -/obj/item/reagent_containers/pill/c2/probital - name = "Probital pill" - desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'. Causes fatigue and diluted with granibitaluri." - icon_state = "pill12" - list_reagents = list(/datum/reagent/medicine/c2/probital = 5, /datum/reagent/medicine/granibitaluri = 10) - rename_with_volume = TRUE - -WS End */ - /obj/item/reagent_containers/pill/iron name = "iron pill" desc = "Used to reduce bloodloss slowly." @@ -304,11 +286,11 @@ WS End */ list_reagents = list(/datum/reagent/iron = 30) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/trophazole - name = "Trophazole pill" +/obj/item/reagent_containers/pill/indomide + name = "indomide pill" desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'." icon_state = "pill12" - list_reagents = list(/datum/reagent/medicine/trophazole = 15) + list_reagents = list(/datum/reagent/medicine/indomide = 15) rename_with_volume = TRUE /obj/item/reagent_containers/pill/stardrop @@ -323,11 +305,11 @@ WS End */ icon_state = "pill11" list_reagents = list(/datum/reagent/drug/stardrop/starlight = 10) -/obj/item/reagent_containers/spray/rhigoxane - name = "medical spray (rhigoxane)" - desc = "A medical spray bottle.This one contains rhigoxane, it is used to treat burns and cool down temperature if applied with spray." +/obj/item/reagent_containers/spray/quardexane + name = "medical spray (quardexane)" + desc = "A medical spray bottle.This one contains quardexane, it is used to treat burns and cool down temperature if applied with spray." icon_state = "sprayer" - list_reagents = list(/datum/reagent/medicine/rhigoxane = 100) + list_reagents = list(/datum/reagent/medicine/quardexane = 100) /obj/item/reagent_containers/pill/placebatol name = "prescription pill" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d4d0e3d4254..a94250c9c32 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -189,11 +189,6 @@ desc = "Contains charcoal." list_reagents = list(/datum/reagent/medicine/charcoal = 15) -/obj/item/reagent_containers/syringe/perfluorodecalin - name = "syringe (perfluorodecalin)" - desc = "Contains perfluorodecalin." - list_reagents = list(/datum/reagent/medicine/perfluorodecalin = 15) - /obj/item/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." @@ -233,13 +228,6 @@ volume = 1 list_reagents = list(/datum/reagent/mulligan = 1) -/obj/item/reagent_containers/syringe/gluttony - name = "Gluttony's Blessing" - desc = "A syringe recovered from a dread place. It probably isn't wise to use." - amount_per_transfer_from_this = 1 - volume = 1 - list_reagents = list(/datum/reagent/gluttonytoxin = 1) - /obj/item/reagent_containers/syringe/bluespace name = "bluespace syringe" desc = "An advanced syringe that can hold 60 units of chemicals." @@ -256,20 +244,20 @@ volume = 10 proj_piercing = 1 -/obj/item/reagent_containers/syringe/spider_extract - name = "spider extract syringe" - desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." - list_reagents = list(/datum/reagent/spider_extract = 1) +/obj/item/reagent_containers/syringe/dexalin + name = "syringe (dexalin)" + desc = "Contains dexalin." + list_reagents = list(/datum/reagent/medicine/dexalin = 15) -/obj/item/reagent_containers/syringe/oxandrolone - name = "syringe (oxandrolone)" - desc = "Contains oxandrolone, used to treat severe burns." - list_reagents = list(/datum/reagent/medicine/oxandrolone = 15) +/obj/item/reagent_containers/syringe/ysiltane + name = "syringe (ysiltane)" + desc = "Contains ysiltane, used to treat severe burns." + list_reagents = list(/datum/reagent/medicine/ysiltane = 15) -/obj/item/reagent_containers/syringe/salacid - name = "syringe (salicylic acid)" +/obj/item/reagent_containers/syringe/silfrine + name = "syringe (silfrine)" desc = "Contains salicylic acid, used to treat severe brute damage." - list_reagents = list(/datum/reagent/medicine/sal_acid = 15) + list_reagents = list(/datum/reagent/medicine/silfrine = 15) /obj/item/reagent_containers/syringe/penacid name = "syringe (pentetic acid)" @@ -292,16 +280,13 @@ /obj/item/reagent_containers/syringe/contraband/mammoth list_reagents = list(/datum/reagent/drug/mammoth = 15) -/obj/item/reagent_containers/syringe/contraband/fentanyl - list_reagents = list(/datum/reagent/toxin/fentanyl = 15) - /obj/item/reagent_containers/syringe/contraband/morphine list_reagents = list(/datum/reagent/medicine/morphine = 15) -/obj/item/reagent_containers/syringe/thializid - name = "syringe (thializid)" - desc = "Contains thializid, used to treat toxins and purge chemicals. The tag on the syringe states 'Inject one time per minute'." - list_reagents = list(/datum/reagent/medicine/thializid = 15) +/obj/item/reagent_containers/syringe/pancrazine + name = "syringe (pancrazine)" + desc = "Contains pancrazine, used to treat toxins and purge chemicals. The tag on the syringe states 'Heat before injection'." + list_reagents = list(/datum/reagent/medicine/pancrazine = 15) /obj/item/reagent_containers/syringe/charcoal name = "syringe (charcoal)" diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 8f19fd40d96..9f7d6093ce3 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -1,81 +1,5 @@ //These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...) -/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate. - name = "greed's slot machine" - desc = "High stakes, high rewards." - icon = 'icons/obj/economy.dmi' - icon_state = "slots1" - anchored = TRUE - density = TRUE - var/win_prob = 5 - -/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user) - if(!istype(user)) - return - if(obj_flags & IN_USE) - return - if(isipc(user)) - user.visible_message(span_warning(" As [user] tries to pull \the [src]'s lever, the machine seems to hesitate a bit."), span_warning("You feel as if you are trying to put at stake something you don't even have...\ You suddenly feel your mind... Suboptimal?")) - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) - else - user.adjustCloneLoss(20) - obj_flags |= IN_USE - - if(user.stat) - to_chat(user, span_userdanger("No... just one more try...")) - user.gib() - else - user.visible_message(span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), "You feel a draining as you pull the lever, but you \ - know it'll be worth it.") - icon_state = "slots2" - playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) - addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50) - -/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) - icon_state = "slots1" - obj_flags &= ~IN_USE - if(prob(win_prob)) - playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) - new/obj/structure/cursed_money(get_turf(src)) - if(user) - to_chat(user, span_boldwarning("You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.")) - qdel(src) - else - if(user) - to_chat(user, span_boldwarning("Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?")) - - -/obj/structure/cursed_money - name = "bag of money" - desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" - icon = 'icons/obj/storage.dmi' - icon_state = "moneybag" - anchored = FALSE - density = TRUE - -/obj/structure/cursed_money/Initialize() - . = ..() - addtimer(CALLBACK(src, PROC_REF(collapse)), 600) - -/obj/structure/cursed_money/proc/collapse() - visible_message("[src] falls in on itself, \ - canvas rotting away and contents vanishing.") - qdel(src) - -/obj/structure/cursed_money/attack_hand(mob/living/user) - . = ..() - if(.) - return - user.visible_message("[user] opens the bag and \ - and removes a die. The bag then vanishes.", - "[span_boldwarning("You open the bag...!")]\n\ - And see a bag full of dice. Confused, \ - you take one... and the bag vanishes.") - var/turf/T = get_turf(user) - var/obj/item/dice/d20/fate/one_use/critical_fail = new(T) - user.put_in_hands(critical_fail) - qdel(src) - /obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. name = "pride's mirror" desc = "Pride cometh before the..." diff --git a/code/modules/ruins/rockplanet_ruin_code.dm b/code/modules/ruins/rockplanet_ruin_code.dm index 970265ab50e..79a2e125357 100644 --- a/code/modules/ruins/rockplanet_ruin_code.dm +++ b/code/modules/ruins/rockplanet_ruin_code.dm @@ -116,4 +116,4 @@ /obj/item/paper/crumpled/muddy/fluff/distillery name = "distillery instructions" desc = "A crumpled note soaked in alcohol." - default_raw_text = "

Moonshine Instructions


Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.


1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom.
2. Grind a cob of corn into bits, and add the mash to the still.
3. Pour an equal amount of sugar into the still, and stir.
4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now.
5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.

PS: If you've got some leftover sugar, mix it into bicaridine. Equal parts sugar, carbon, and oxygen makes a potent salve for your wounds." + default_raw_text = "

Moonshine Instructions


Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.


1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom.
2. Grind a cob of corn into bits, and add the mash to the still.
3. Pour an equal amount of sugar into the still, and stir.
4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now.
5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.

." diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index b310fc48139..477a00dc5fb 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -559,7 +559,7 @@ if(updating_health) owner.updatehealth() if(owner.dna?.species && (REVIVESBYHEALING in owner.dna.species.species_traits)) - if(owner.health > 0 && !owner.hellbound) + if(owner.health > 0) owner.revive(FALSE) owner.cure_husk() // If it has REVIVESBYHEALING, it probably can't be cloned. No husk cure. cremation_progress = min(0, cremation_progress - ((brute_dam + burn_dam)*(100/max_damage))) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 40b24a82e4b..1c9d9669b8f 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -18,7 +18,7 @@ return FALSE if(target.stat != DEAD) return FALSE - if(target.hellbound || HAS_TRAIT(target, TRAIT_HUSK)) + if(HAS_TRAIT(target, TRAIT_HUSK)) return FALSE if(!is_valid_target(target)) //PENTEST CHANGE START return FALSE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 913490368fb..5c8900d8120 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1350,14 +1350,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/healthanalyzer/rad_laser cost = 3 -/datum/uplink_item/device_tools/stimpack - name = "Stimpack" - desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \ - 5 minutes after injection." - item = /obj/item/reagent_containers/hypospray/medipen/stimulants - cost = 5 - surplus = 90 - /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \ @@ -1600,16 +1592,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Roboticist") cost = 5 -/datum/uplink_item/role_restricted/spider_injector - name = "Australicus Slime Mutator" - desc = "Crikey mate, it's been a wild travel from the Australicus sector but we've managed to get \ - some special spider extract from the giant spiders down there. Use this injector on a gold slime core \ - to create a few of the same type of spiders we found on the planets over there. They're a bit tame until you \ - also give them a bit of sentience though." - item = /obj/item/reagent_containers/syringe/spider_extract - cost = 10 - restricted_roles = list("Research Director", "Scientist", "Roboticist") - /datum/uplink_item/role_restricted/concealed_weapon_bay name = "Concealed Weapon Bay" desc = "A modification for civilian exosuits that allows them to equip one piece of equipment designed for combat exosuits. \ @@ -1635,15 +1617,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 14 item = /obj/vehicle/ridden/lawnmower/emagged -/datum/uplink_item/role_restricted/explosive_hot_potato - name = "Exploding Hot Potato" - desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \ - The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." - item = /obj/item/hot_potato/syndicate - cost = 4 - surplus = 0 - restricted_roles = list("Cook", "Botanist") - /datum/uplink_item/role_restricted/ez_clean_bundle name = "EZ Clean Grenade Bundle" desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \ @@ -1743,7 +1716,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" - desc = "Strong flavor, dense smoke, infused with omnizine." + desc = "Strong flavor, dense smoke, infused with panacea." item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 illegal_tech = FALSE diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 26fe1f2c589..6f6986bda55 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -11,18 +11,17 @@ /obj/item/reagent_containers/syringe = 5, /obj/item/reagent_containers/dropper = 2, /obj/item/healthanalyzer = 2, - /obj/item/reagent_containers/pill/patch/styptic = 5, - /obj/item/reagent_containers/pill/patch/silver_sulf = 5, + /obj/item/reagent_containers/pill/patch/indomide = 5, + /obj/item/reagent_containers/pill/patch/alvitane = 5, /obj/item/reagent_containers/hypospray/medipen = 3, - /obj/item/reagent_containers/syringe/perfluorodecalin = 2, /obj/item/reagent_containers/syringe/antiviral = 1, /obj/item/reagent_containers/glass/bottle/charcoal = 3, /obj/item/reagent_containers/glass/bottle/epinephrine = 3, /obj/item/reagent_containers/glass/bottle/morphine = 1, /obj/item/reagent_containers/glass/bottle/potass_iodide = 1, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/medigel/styptic = 1, - /obj/item/reagent_containers/medigel/silver_sulf = 1, + /obj/item/reagent_containers/medigel/hadrakine = 1, + /obj/item/reagent_containers/medigel/quardexane = 1, /obj/item/reagent_containers/medigel/synthflesh = 1, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/sensor_device = 1, diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 61a413a9630..351388b1e6e 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -25,7 +25,7 @@ /obj/item/reagent_containers/hypospray/medipen/psicodine = 6, /obj/item/reagent_containers/hypospray/medipen/synap = 6, /obj/item/reagent_containers/hypospray/medipen/mannitol = 10, - /obj/item/reagent_containers/hypospray/medipen/tricord = 6, + /obj/item/reagent_containers/hypospray/medipen/cureall = 6, /obj/item/reagent_containers/hypospray/medipen/tramal = 6, /obj/item/reagent_containers/hypospray/medipen/antihol = 10, /obj/item/reagent_containers/hypospray/medipen/anti_rad = 10, @@ -34,8 +34,8 @@ /obj/item/reagent_containers/syringe/antiviral = 4 ) premium = list( - /obj/item/reagent_containers/medigel/styptic = 3, - /obj/item/reagent_containers/medigel/silver_sulf = 3, + /obj/item/reagent_containers/medigel/hadrakine = 3, + /obj/item/reagent_containers/medigel/quardexane = 3, /obj/item/storage/pill_bottle/stardrop = 5, ) diff --git a/icons/mob/clothing/underwear/underwear_torso.dmi b/icons/mob/clothing/underwear/underwear_torso.dmi index 534f381afac..9e903801311 100644 Binary files a/icons/mob/clothing/underwear/underwear_torso.dmi and b/icons/mob/clothing/underwear/underwear_torso.dmi differ diff --git a/code/datums/diseases/decloning.dm b/modular_pentest/master_files/code/datums/diseases/decloning.dm similarity index 100% rename from code/datums/diseases/decloning.dm rename to modular_pentest/master_files/code/datums/diseases/decloning.dm diff --git a/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm b/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm new file mode 100644 index 00000000000..37ebddfaf65 --- /dev/null +++ b/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm @@ -0,0 +1,6 @@ +/obj/item/clothing/mask/cigarette/xeno + desc = "A Xeno Filtered brand cigarette." + list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15) + +/obj/item/lighter/slime + grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5) diff --git a/modular_pentest/master_files/code/game/objects/items/food/donk.dm b/modular_pentest/master_files/code/game/objects/items/food/donk.dm index 18262ef594e..10e79813985 100644 --- a/modular_pentest/master_files/code/game/objects/items/food/donk.dm +++ b/modular_pentest/master_files/code/game/objects/items/food/donk.dm @@ -32,7 +32,7 @@ icon_state = "donkpocketbanana" food_reagents = list( /datum/reagent/consumable/nutriment = 4, - /datum/reagent/medicine/omnizine = 2, + /datum/reagent/medicine/panacea/effluvial = 2, /datum/reagent/consumable/banana = 4, /datum/reagent/consumable/laughter = 6 ) diff --git a/modular_pentest/master_files/code/game/objects/items/food/misc.dm b/modular_pentest/master_files/code/game/objects/items/food/misc.dm index 1c6a2fab386..7e89dfe8443 100644 --- a/modular_pentest/master_files/code/game/objects/items/food/misc.dm +++ b/modular_pentest/master_files/code/game/objects/items/food/misc.dm @@ -24,8 +24,8 @@ name = "stuffed legion" desc = "Composed of a whole skull sourced from a parasitic Legion stuffed with prepared goliath meat, served alongside ketchup and hotsauce." icon_state = "stuffed_legion" - bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/medicine/tricordrazine = 5) - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/medicine/tricordrazine = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/medicine/cureall = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/medicine/cureall = 10) tastes = list("tough meat" = 2, "calcium" = 1, "bitter chemical aftertaste" = 1, "hot peppers" = 1) foodtypes = MEAT filling_color = "#3B342B" diff --git a/modular_pentest/master_files/code/game/objects/items/food/pizza.dm b/modular_pentest/master_files/code/game/objects/items/food/pizza.dm index f897957b17a..5fa98f1c8c4 100644 --- a/modular_pentest/master_files/code/game/objects/items/food/pizza.dm +++ b/modular_pentest/master_files/code/game/objects/items/food/pizza.dm @@ -4,7 +4,7 @@ icon = 'modular_pentest/master_files/icons/obj/food/pizza.dmi' icon_state = "arnoldpizza" slice_type = /obj/item/food/pizzaslice/arnold - bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/panacea = 30) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2) /obj/item/food/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm @@ -65,8 +65,8 @@ name = "hot pizza rolls" desc = "A plate of scalding hot pizza rolls. Try not to burn your tongue with their meaty, cheesy goodness." icon_state = "pizzarolls" // secc icon. we are blessed - bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) // Because they're teeny Donk pockets - food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1) + bonus_reagents = list(/datum/reagent/medicine/panacea = 1) // Because they're teeny Donk pockets + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/panacea = 1) microwaved_type = null tastes = list("meat" = 2, "dough" = 2, "cheese" = 2, "unbearable heat" = 1) foodtypes = GRAIN diff --git a/modular_pentest/master_files/code/game/objects/items/food/sweets.dm b/modular_pentest/master_files/code/game/objects/items/food/sweets.dm index 57a0e0eb62b..d4470c1a669 100644 --- a/modular_pentest/master_files/code/game/objects/items/food/sweets.dm +++ b/modular_pentest/master_files/code/game/objects/items/food/sweets.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/lollipop.dmi' icon_state = "lollipop_stick" item_state = "lollipop_stick" - food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //Honk + food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/panacea = 2) //Honk var/mutable_appearance/head var/headcolor = rgb(0, 0, 0) succ_dur = 15 * 60 diff --git a/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm b/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm new file mode 100644 index 00000000000..e5e8a0168f7 --- /dev/null +++ b/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm @@ -0,0 +1,6 @@ +/obj/item/storage/fancy/cigarettes/cigpack_xeno + name = "\improper Xeno Filtered packet" + desc = "Loaded with 100% pure slime. And also nicotine." + icon_state = "slime" + base_icon_state = "slime" + spawn_type = /obj/item/clothing/mask/cigarette/xeno diff --git a/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm new file mode 100644 index 00000000000..bcacbda92bc --- /dev/null +++ b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -0,0 +1,56 @@ +/obj/structure/table/optable/abductor + name = "alien operating table" + desc = "Used for alien medical procedures. The surface is covered in tiny spines." + frame = /obj/structure/table_frame/abductor + buildstack = /obj/item/stack/sheet/mineral/silver + framestack = /obj/item/stack/sheet/mineral/abductor + buildstackamount = 1 + framestackamount = 1 + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + can_buckle = 1 + /// Amount to inject per second + var/inject_am = 0.5 + + var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) + +/obj/structure/table/optable/abductor/Initialize() + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + if(iscarbon(AM)) + START_PROCESSING(SSobj, src) + to_chat(AM, span_danger("You feel a series of tiny pricks!")) + +/obj/structure/table/optable/abductor/process(seconds_per_tick) + . = PROCESS_KILL + for(var/mob/living/carbon/C in get_turf(src)) + . = TRUE + for(var/chemical in injected_reagents) + if(C.reagents.get_reagent_amount(chemical) < inject_am * seconds_per_tick) + C.reagents.add_reagent(chemical, inject_am * seconds_per_tick) + +/obj/structure/table/optable/abductor/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/datum/reagent/medicine/cordiolis_hepatico + name = "Cordiolis Hepatico" + description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown." + color = "#000000" + self_consuming = TRUE + +/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M) + ..() + ADD_TRAIT(M, TRAIT_STABLELIVER, type) + ADD_TRAIT(M, TRAIT_STABLEHEART, type) + +/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M) + ..() + REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) + REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) diff --git a/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm b/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm new file mode 100644 index 00000000000..99abb22872b --- /dev/null +++ b/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm @@ -0,0 +1,196 @@ +/obj/item/dice/d20/fate + name = "\improper Die of Fate" + desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky." + icon_state = "d20" + sides = 20 + microwave_riggable = FALSE + var/reusable = TRUE + var/used = FALSE + +/obj/item/dice/d20/fate/one_use + reusable = FALSE + +/obj/item/dice/d20/fate/cursed + name = "cursed Die of Fate" + desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea." + color = "#00BB00" + + rigged = DICE_TOTALLY_RIGGED + rigged_value = 1 + +/obj/item/dice/d20/fate/cursed/one_use + reusable = FALSE + +/obj/item/dice/d20/fate/stealth + name = "d20" + desc = "A die with twenty sides. The preferred die to throw at the GM." + +/obj/item/dice/d20/fate/stealth/one_use + reusable = FALSE + +/obj/item/dice/d20/fate/stealth/cursed + rigged = DICE_TOTALLY_RIGGED + rigged_value = 1 + +/obj/item/dice/d20/fate/stealth/cursed/one_use + reusable = FALSE + +/obj/item/dice/d20/fate/diceroll(mob/user) + . = ..() + if(!used) + if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) + to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans!")) + return + + if(!reusable) + used = TRUE + + var/turf/T = get_turf(src) + T.visible_message(span_userdanger("[src] flares briefly.")) + + addtimer(CALLBACK(src, PROC_REF(effect), user, .), 1 SECONDS) + +/obj/item/dice/d20/fate/equipped(mob/user, slot) + . = ..() + if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards)) + to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.")) + user.dropItemToGround(src) + + +/obj/item/dice/d20/fate/proc/effect(mob/living/carbon/human/user,roll) + var/turf/T = get_turf(src) + switch(roll) + if(1) + //Dust + T.visible_message(span_userdanger("[user] turns to dust!")) + user.hellbound = TRUE + user.dust() + if(2) + //Death + T.visible_message(span_userdanger("[user] suddenly dies!")) + user.death() + if(3) + //Swarm of creatures + T.visible_message(span_userdanger("A swarm of creatures surround [user]!")) + for(var/direction in GLOB.alldirs) + new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction)) + if(4) + //Destroy Equipment + T.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!")) + for(var/obj/item/I in user) + if(istype(I, /obj/item/implant)) + continue + qdel(I) + if(5) + //Monkeying + T.visible_message(span_userdanger("[user] transforms into a monkey!")) + user.monkeyize() + if(6) + //Cut speed + T.visible_message(span_userdanger("[user] starts moving slower!")) + user.add_movespeed_modifier(/datum/movespeed_modifier/die_of_fate) + if(7) + //Throw + T.visible_message(span_userdanger("Unseen forces throw [user]!")) + user.Stun(60) + user.adjustBruteLoss(50) + var/throw_dir = pick(GLOB.cardinals) + var/atom/throw_target = get_edge_target_turf(user, throw_dir) + user.throw_at(throw_target, 200, 4) + if(8) + //Fueltank Explosion + T.visible_message(span_userdanger("An explosion bursts into existence around [user]!")) + explosion(get_turf(user),-1,0,2, flame_range = 2) + if(9) + //Cold + var/datum/disease/D = new /datum/disease/cold() + T.visible_message(span_userdanger("[user] looks a little under the weather!")) + user.ForceContractDisease(D, FALSE, TRUE) + if(10) + //Nothing + T.visible_message(span_userdanger("Nothing seems to happen.")) + if(11) + //Cookie + T.visible_message(span_userdanger("A cookie appears out of thin air!")) + var/obj/item/food/cookie/C = new(drop_location()) + do_smoke(0, drop_location()) + C.name = "Cookie of Fate" + if(12) + //Healing + T.visible_message(span_userdanger("[user] looks very healthy!")) + user.revive(full_heal = TRUE, admin_revive = TRUE) + if(13) + //Mad Dosh + T.visible_message(span_userdanger("Mad dosh shoots out of [src]!")) + var/turf/Start = get_turf(src) + for(var/direction in GLOB.alldirs) + var/turf/dirturf = get_step(Start,direction) + if(rand(0,1)) + new /obj/item/spacecash/bundle/c1000(dirturf) + else + var/obj/item/storage/bag/money/M = new(dirturf) + for(var/i in 1 to rand(5,50)) + new /obj/item/coin/gold(M) + if(14) + //Free Gun + T.visible_message(span_userdanger("An impressive gun appears!")) + do_smoke(0, drop_location()) + new /obj/item/gun/ballistic/revolver/mateba(drop_location()) + if(15) + //Random One-use spellbook + T.visible_message(span_userdanger("A magical looking book drops to the floor!")) + do_smoke(0, drop_location()) + new /obj/item/book/granter/spell/random(drop_location()) + if(16) + //Servant & Servant Summon + T.visible_message(span_userdanger("A Dice Servant appears in a cloud of smoke!")) + var/mob/living/carbon/human/H = new(drop_location()) + do_smoke(0, drop_location()) + + H.equipOutfit(/datum/outfit/butler) + var/datum/mind/servant_mind = new /datum/mind() + var/datum/antagonist/magic_servant/A = new + servant_mind.add_antag_datum(A) + A.setup_master(user) + servant_mind.transfer_to(H) + + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") + H.key = C.key + + var/obj/effect/proc_holder/spell/targeted/summonmob/S = new + S.target_mob = H + user.mind.AddSpell(S) + + if(17) + //Tator Kit + T.visible_message(span_userdanger("A suspicious box appears!")) + new /obj/item/storage/box/syndicate/bundle_A(drop_location()) + do_smoke(0, drop_location()) + if(18) + //Captain ID + T.visible_message(span_userdanger("A golden identification card appears!")) + new /obj/item/card/id/captains_spare(drop_location()) + do_smoke(0, drop_location()) + if(19) + //Instrinct Resistance + T.visible_message(span_userdanger("[user] looks very robust!")) + user.physiology.brute_mod *= 0.5 + user.physiology.burn_mod *= 0.5 + + if(20) + //Free wizard! //NOT ANY MORE FUCKING CHRIST + T.visible_message(span_userdanger("Magic arches out of [src] and into ground under [user]!")) + new /obj/item/clothing/suit/wizrobe(drop_location()) + new /obj/item/clothing/head/wizard(drop_location()) + new /obj/item/clothing/gloves/combat/wizard(drop_location()) + new /obj/item/staff(drop_location()) + new /obj/structure/mirror/magic(drop_location()) + +/datum/outfit/butler + name = "Butler" + uniform = /obj/item/clothing/under/suit/black_really + shoes = /obj/item/clothing/shoes/laceup + gloves = /obj/item/clothing/gloves/color/white diff --git a/modular_pentest/modules/catalog/README.md b/modular_pentest/modules/catalog/README.md new file mode 100644 index 00000000000..7dc566d4df2 --- /dev/null +++ b/modular_pentest/modules/catalog/README.md @@ -0,0 +1,134 @@ +# NanoPedia System + +NanoTrasen's comprehensive in-game reference system for Pentest. Provides players with a wiki-like interface accessible through PDAs, laptops, and modular computers. + +## Overview + +NanoPedia (NanoTrasen Wikipedia) is designed to help players learn about game mechanics when external wiki access is unavailable. It features categorized information with an intuitive search and filter system. + +## Current Features + +### Chemistry Reference +- **Organized Categories:** + - Medical: Medicines and medical chemicals + - Chemistry: Industrial chemicals, toxins, and reagents + - Drinks: Alcoholic and non-alcoholic beverages + - Misc: Biogenerator reagents (plant nutrients, botany chemicals) and special crafting + - Hidden: Basic elements and admin-only reagents (not shown) +- **Chemical Information:** + - Name and description + - Complete recipes showing required reagents and amounts + - Catalyst requirements + - Result amounts + - Temperature requirements (hot or cold reactions) +- **Color-coded dividers** between entries by category (blue=medical, green=chemistry, orange=drinks, teal=misc) +- **Search functionality** to quickly find specific chemicals +- **Category filtering** to narrow down results +- **Alphabetical sorting** for easy navigation + +### Fabricator Designs Reference +- **Organized by Fabricator Type:** + - Autolathe + - Protolathe + - Circuit Imprinter + - Mech Fabricator (Exosuit Fab) +- **Design Information:** + - Name and description + - What fabricators can produce it + - Material requirements + - Department access restrictions + - Research node requirements +- **Search functionality** across all designs +- **Category filtering** to view designs for specific fabricators +- **Alphabetical sorting** for easy navigation +- **Visibility control** - designs can be hidden via `catalog_visible = FALSE` + +### Mecha Reference +- Basic mecha construction information +- Required parts and assembly steps +- Material breakdowns + +## Files + +- `catalog.dm` - Backend program file that collects and formats data +- `reagent_categories.dm` - Catalog category assignments for reagents +- `design_visibility.dm` - Adds catalog_visible variable to designs +- `designs_extraction.dm` - Extracts and filters design data from research system +- `mecha_extraction.dm` - Extracts mecha construction data +- `tgui/packages/tgui/interfaces/NtosCatalog.js` - Frontend TGUI interface + +## Usage + +1. Download and install the "NanoPedia" program (4GQ) from NTNet +2. Launch the program on any compatible device +3. Select a view (Chemistry, Medical, Drinks, Exosuits, or Designs) +4. Use category filters to narrow down results +5. Use the search bar to find specific items +6. View detailed information and recipes + +## Catalog Configuration + +### Reagent Categories + +Reagents can be assigned one of the following catalog categories: +- `medical` - Medical chemicals and medicines +- `chemistry` - Industrial/general chemistry reagents +- `drinks` - Beverages (alcoholic and non-alcoholic) +- `misc` - Biogenerator products (plant nutrients, botany chemicals) and special crafting methods +- `hidden` - Not shown in catalog (basic elements, admin reagents, etc.) + +To categorize a new reagent, set its `catalog_category` variable in `reagent_categories.dm`. + +### Design Visibility + +Designs can be hidden from the catalog by setting `catalog_visible = FALSE`. By default, all designs are visible (`catalog_visible = TRUE`). + +**To hide a design:** +1. Create or edit a design definition in your modular code +2. Set `catalog_visible = FALSE` + +Example: +```dm +/datum/design/admin_only_item + catalog_visible = FALSE +``` + +This is useful for: +- Admin-only items +- Debug/testing designs +- Items players cannot normally access +- Special event-only fabrications + +Designs are also automatically filtered out if they: +- Have `id = DESIGN_ID_IGNORE` +- Have no `build_path` set +- Don't belong to the 4 main fabricator types (Autolathe, Protolathe, Imprinter, Mechfab) + +## Future Expansion + +The framework is designed to be extensible. Future catalogs could include: +- Equipment specifications +- Job guides and SOPs +- Ship information +- Research node details +- Cooking recipes + +To add a new catalog view: +1. Add a new view button in the TGUI interface +2. Create a corresponding data collection proc in the backend +3. Add a new display component in the JS file + +## Technical Notes + +- Program size: 4GQ (small for fast testing) +- Works on all device types via `usage_flags = PROGRAM_ALL` +- Available for download via NTNet +- Does not require network connectivity to run (`requires_ntnet = FALSE`) +- Pulls data directly from game globals: + - `GLOB.chemical_reagents_list` and `GLOB.chemical_reactions_list` for chemistry + - `SSresearch.techweb_designs` for fabricator designs + - Hard-coded construction datums for mechas +- Added `catalog_category` variable to base `/datum/reagent` for categorization system +- Added `catalog_visible` variable to base `/datum/design` for visibility control +- All catalog views feature alphabetical sorting by name +- Fixed header and navigation buttons remain visible while scrolling content diff --git a/modular_pentest/modules/catalog/catalog.dm b/modular_pentest/modules/catalog/catalog.dm new file mode 100644 index 00000000000..a5a08312acf --- /dev/null +++ b/modular_pentest/modules/catalog/catalog.dm @@ -0,0 +1,187 @@ +// NanoPedia - NanoTrasen's comprehensive reference system +// An in-game wiki providing information on chemicals, equipment, and procedures + +/datum/computer_file/program/catalog + filename = "nanopedia" + filedesc = "NanoPedia" + program_icon_state = "generic" + extended_desc = "NanoTrasen's comprehensive reference database. Access information on chemistry, equipment specifications, and standard procedures. Your portable wiki for when you can't remember that one recipe." + requires_ntnet = FALSE + size = 4 + tgui_id = "NtosCatalog" + program_icon = "book" + usage_flags = PROGRAM_ALL + available_on_ntnet = TRUE + + /// Current catalog view (chemistry, medical, drinks, designs, etc.) + var/current_view = "chemistry" + /// Search query + var/search_query = "" + /// Current category filter (for designs view: autolathe, protolathe, imprinter, mechfab) + var/current_category = "all" + +/datum/computer_file/program/catalog/ui_data(mob/user) + var/list/data = get_header_data() + + data["current_view"] = current_view + data["search_query"] = search_query + data["current_category"] = current_category + + // Chemistry catalog data (for chemistry, medical, drinks, and misc views) + if(current_view in list("chemistry", "medical", "drinks", "misc")) + data["chemicals"] = get_chemistry_data() + + // Mecha catalog data + if(current_view == "mechs") + data["mechas"] = get_mecha_data() + + // Designs catalog data + if(current_view == "designs") + data["designs"] = get_designs_data() + + return data + +/datum/computer_file/program/catalog/ui_act(action, params) + . = ..() + if(.) + return + + switch(action) + if("change_view") + current_view = params["view"] + current_category = "all" // Reset category when changing views + return TRUE + if("change_category") + current_category = params["category"] + return TRUE + if("search") + search_query = params["query"] + return TRUE + if("clear_search") + search_query = "" + return TRUE + +/// Gets all chemistry data including reagents and their recipes +/datum/computer_file/program/catalog/proc/get_chemistry_data() + var/list/chemicals = list() + + // Iterate through all reagents + for(var/reagent_type in GLOB.chemical_reagents_list) + var/datum/reagent/reagent = GLOB.chemical_reagents_list[reagent_type] + + // Skip if view filter doesn't match the reagent category + if(reagent.catalog_category != current_view) + continue + + // Skip hidden reagents + if(reagent.catalog_category == "hidden") + continue + + // Medical category filtering by medical_type + if(current_view == "medical") + if(current_category == "all") + // "All" excludes omni-healers to show only specific healers + if(reagent.medical_type == "omni") + continue + else if(current_category != "all") + // Filter by specific medical type + if(reagent.medical_type != current_category) + continue + + // Skip if searching and name doesn't match + if(search_query && !findtext(lowertext(reagent.name), lowertext(search_query))) + continue + + var/list/reagent_data = list() + reagent_data["name"] = reagent.name + reagent_data["description"] = reagent.description + reagent_data["category"] = reagent.catalog_category + reagent_data["medical_type"] = reagent.medical_type // Include medical_type for frontend + + // For misc reagents, check for biogenerator cost + if(current_view == "misc") + for(var/design_id in SSresearch.techweb_designs) + var/datum/design/design = SSresearch.techweb_designs[design_id] + if(design.build_type & BIOGENERATOR && design.make_reagents && (reagent_type in design.make_reagents)) + // Extract biomass cost + if(design.materials && design.materials.len) + for(var/mat in design.materials) + reagent_data["biogenerator_cost"] = design.materials[mat] + break + break + + // Find recipes that create this reagent + var/list/recipes = list() + for(var/reaction_id in GLOB.chemical_reactions_list) + var/list/reactions = GLOB.chemical_reactions_list[reaction_id] + for(var/datum/chemical_reaction/reaction in reactions) + // Check if this reaction produces our reagent + if(reagent_type in reaction.results) + var/list/recipe_data = list() + + // Required reagents + var/list/required = list() + for(var/req_type in reaction.required_reagents) + var/req_amount = reaction.required_reagents[req_type] + var/datum/reagent/req_reagent = GLOB.chemical_reagents_list[req_type] + if(req_reagent) + required += list(list( + "name" = req_reagent.name, + "amount" = req_amount + )) + recipe_data["required"] = required + + // Catalysts + var/list/catalysts = list() + if(reaction.required_catalysts) + for(var/cat_type in reaction.required_catalysts) + var/cat_amount = reaction.required_catalysts[cat_type] + var/datum/reagent/cat_reagent = GLOB.chemical_reagents_list[cat_type] + if(cat_reagent) + catalysts += list(list( + "name" = cat_reagent.name, + "amount" = cat_amount + )) + recipe_data["catalysts"] = catalysts + + // Result amount + recipe_data["produces"] = reaction.results[reagent_type] + + // Temperature requirements + if(reaction.required_temp) + recipe_data["temperature"] = reaction.required_temp + recipe_data["is_cold"] = reaction.is_cold_recipe + + recipes += list(recipe_data) + + reagent_data["recipes"] = recipes + chemicals += list(reagent_data) + + // Sort alphabetically by name + chemicals = sort_catalog_items(chemicals) + + return chemicals + +/// Sorts a list of catalog items alphabetically by their "name" key +/datum/computer_file/program/catalog/proc/sort_catalog_items(list/items) + if(!items || items.len <= 1) + return items + + // Extract names with their data + var/list/name_to_data = list() + for(var/list/item in items) + var/item_name = item["name"] + if(!name_to_data[item_name]) + name_to_data[item_name] = list() + name_to_data[item_name] += list(item) + + // Sort names alphabetically + var/list/sorted_names = sortList(list() + name_to_data) + + // Rebuild list in sorted order + var/list/sorted_items = list() + for(var/name in sorted_names) + for(var/list/item in name_to_data[name]) + sorted_items += list(item) + + return sorted_items diff --git a/modular_pentest/modules/catalog/design_visibility.dm b/modular_pentest/modules/catalog/design_visibility.dm new file mode 100644 index 00000000000..35a3cf81e4e --- /dev/null +++ b/modular_pentest/modules/catalog/design_visibility.dm @@ -0,0 +1,9 @@ +// NanoPedia - Design visibility control +// Adds catalog_visible variable to designs for manual filtering in NanoPedia + +/datum/design + /// Set to FALSE to hide this design from the NanoPedia catalog + var/catalog_visible = TRUE + +/datum/design/limb_disk + catalog_visible = FALSE // Limb disks are generally not useful for players to see in the catalog diff --git a/modular_pentest/modules/catalog/designs_extraction.dm b/modular_pentest/modules/catalog/designs_extraction.dm new file mode 100644 index 00000000000..d0eb4e1fde6 --- /dev/null +++ b/modular_pentest/modules/catalog/designs_extraction.dm @@ -0,0 +1,137 @@ +// NanoPedia - Designs/blueprints database extraction +// Automatically extracts design data from fabricator designs + +/// Gets all design data from research system +/datum/computer_file/program/catalog/proc/get_designs_data() + var/list/designs = list() + + // Build reverse map of design_id -> techweb nodes that unlock it + var/list/design_to_nodes = list() + for(var/node_id in SSresearch.techweb_nodes) + var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] + if(node.design_ids) + for(var/design_id in node.design_ids) + if(!design_to_nodes[design_id]) + design_to_nodes[design_id] = list() + var/list/node_info = list() + node_info["id"] = node.id + node_info["name"] = node.display_name + design_to_nodes[design_id] += list(node_info) + + // Iterate through all designs + for(var/design_id in SSresearch.techweb_designs) + var/datum/design/design = SSresearch.techweb_designs[design_id] + + // Skip ignored designs + if(design.id == DESIGN_ID_IGNORE) + continue + + // Skip designs marked as hidden from catalog + if(!design.catalog_visible) + continue + + // Skip if no valid build type + if(!design.build_type) + continue + + // Skip if no build_path (admin-only or special designs) + if(!design.build_path) + continue + + // Skip if searching and name doesn't match + if(search_query && !findtext(lowertext(design.name), lowertext(search_query))) + continue + + // Get fabricator categories (for frontend filtering) + var/list/categories = get_fabricator_categories(design.build_type) + + // Skip if this design doesn't belong to any of the 4 main fabricators + if(!length(categories)) + continue + + // Skip if category filter is active and this design doesn't match + if(current_category != "all" && !(current_category in categories)) + continue + + var/list/design_data = list() + design_data["name"] = design.name + design_data["description"] = design.desc + design_data["id"] = design.id + + // Set categories for frontend filtering (lowercase for consistency) + design_data["categories"] = categories + + // Get materials + var/list/materials = list() + if(design.materials) + for(var/material in design.materials) + var/datum/material/mat = material + var/list/mat_data = list() + mat_data["name"] = initial(mat.name) + mat_data["amount"] = design.materials[material] + materials += list(mat_data) + design_data["materials"] = materials + + // Get department restrictions + design_data["departments"] = get_department_names(design.departmental_flags) + + // Get research requirements (which nodes unlock this) + var/list/research_nodes = list() + if(design_to_nodes[design.id]) + research_nodes = design_to_nodes[design.id] + design_data["research_nodes"] = research_nodes + + designs += list(design_data) + + // Sort alphabetically by name + designs = sort_catalog_items(designs) + + return designs + +/// Converts build_type flags to list of fabricator categories (lowercase for frontend) +/// Only includes the 4 main fabricators (Autolathe, Protolathe, Imprinter, Mechfab) +/datum/computer_file/program/catalog/proc/get_fabricator_categories(build_type) + var/list/categories = list() + + if(build_type & AUTOLATHE) + categories += "autolathe" + if(build_type & PROTOLATHE) + categories += "protolathe" + if(build_type & IMPRINTER) + categories += "imprinter" + if(build_type & MECHFAB) + categories += "mechfab" + + // Note: We intentionally exclude LIMBGROWER, BIOGENERATOR, SMELTER, and NANITE_COMPILER + // as those are special fabricators not part of the main 4 categories + + return categories + +/// Converts departmental_flags to list of department names +/datum/computer_file/program/catalog/proc/get_department_names(dept_flags) + var/list/departments = list() + + // ALL means available to all departments + if(dept_flags == ALL) + return list("All Departments") + + if(dept_flags & DEPARTMENTAL_FLAG_SECURITY) + departments += "Security" + if(dept_flags & DEPARTMENTAL_FLAG_MEDICAL) + departments += "Medical" + if(dept_flags & DEPARTMENTAL_FLAG_CARGO) + departments += "Cargo" + if(dept_flags & DEPARTMENTAL_FLAG_SCIENCE) + departments += "Science" + if(dept_flags & DEPARTMENTAL_FLAG_ENGINEERING) + departments += "Engineering" + if(dept_flags & DEPARTMENTAL_FLAG_SERVICE) + departments += "Service" + if(dept_flags & DEPARTMENTAL_FLAG_BASIC) + departments += "Basic" + + // If no specific flags, it's typically available to all + if(!length(departments)) + departments += "All Departments" + + return departments diff --git a/modular_pentest/modules/catalog/mecha_extraction.dm b/modular_pentest/modules/catalog/mecha_extraction.dm new file mode 100644 index 00000000000..975ddb8b1c3 --- /dev/null +++ b/modular_pentest/modules/catalog/mecha_extraction.dm @@ -0,0 +1,191 @@ +// NanoPedia - Mecha construction data extraction +// Automatically extracts mecha build instructions from construction datums and mechfab designs + +/// Gets all mecha construction data by parsing construction datums and fabricator designs +/datum/computer_file/program/catalog/proc/get_mecha_data() + var/list/mechas = list() + + // Define mecha types we want to catalog + var/list/mecha_constructions = list( + /datum/component/construction/mecha/ripley = list("name" = "APLU Ripley MK-I", "category" = "working"), + /datum/component/construction/mecha/firefighter = list("name" = "APLU Firefighter", "category" = "working"), + /datum/component/construction/mecha/gygax = list("name" = "Gygax 501p Security Exosuit", "category" = "combat"), + /datum/component/construction/mecha/durand = list("name" = "Durand Combat Exosuit", "category" = "combat"), + /datum/component/construction/mecha/odysseus = list("name" = "Odysseus 200 Series", "category" = "medical"), + /datum/component/construction/mecha/phazon = list("name" = "Phazon Exosuit", "category" = "advanced"), + /datum/component/construction/mecha/honker = list("name" = "H.O.N.K Mech", "category" = "clown") + ) + + for(var/construction_type in mecha_constructions) + var/list/mecha_info = mecha_constructions[construction_type] + + // Skip if searching and name doesn't match + if(search_query && !findtext(lowertext(mecha_info["name"]), lowertext(search_query))) + continue + + var/list/mecha_data = list() + mecha_data["name"] = mecha_info["name"] + mecha_data["category"] = mecha_info["category"] + mecha_data["type"] = construction_type + + // Extract construction steps + mecha_data["parts"] = get_required_parts(construction_type) + mecha_data["assembly_steps"] = get_assembly_steps(construction_type) + mecha_data["materials"] = get_materials_breakdown(construction_type) + + mechas += list(mecha_data) + + return mechas + +/// Gets the list of parts that need to be fabricated +/datum/computer_file/program/catalog/proc/get_required_parts(construction_type) + var/list/parts = list() + + // Map construction types to their chassis types + var/list/chassis_map = list( + /datum/component/construction/mecha/ripley = /datum/component/construction/unordered/mecha_chassis/ripley, + /datum/component/construction/mecha/firefighter = /datum/component/construction/unordered/mecha_chassis/firefighter, + /datum/component/construction/mecha/gygax = /datum/component/construction/unordered/mecha_chassis/gygax, + /datum/component/construction/mecha/durand = /datum/component/construction/unordered/mecha_chassis/durand, + /datum/component/construction/mecha/odysseus = /datum/component/construction/unordered/mecha_chassis/odysseus, + /datum/component/construction/mecha/phazon = /datum/component/construction/unordered/mecha_chassis/phazon, + /datum/component/construction/mecha/honker = /datum/component/construction/unordered/mecha_chassis/honker + ) + + var/chassis_type = chassis_map[construction_type] + if(!chassis_type) + return parts + + // Get chassis parts from the unordered construction datum + var/datum/component/construction/unordered/mecha_chassis/chassis = new chassis_type() + + // Add chassis itself + var/list/chassis_data = list() + chassis_data["name"] = "Chassis" + chassis_data["type"] = "chassis" + parts += list(chassis_data) + + // Add required limb parts + if(chassis.steps) + for(var/part_type in chassis.steps) + var/obj/item/mecha_parts/part/part = part_type + var/list/part_data = list() + part_data["name"] = initial(part.name) + part_data["type"] = "part" + parts += list(part_data) + + qdel(chassis) + return parts + +/// Parses assembly steps from the construction datum +/datum/computer_file/program/catalog/proc/get_assembly_steps(construction_type) + var/list/steps = list() + + // Create temporary instance to read step data + var/datum/component/construction/mecha/construction = new construction_type() + + var/list/all_steps = construction.get_steps() + var/step_num = 1 + + for(var/list/step_data in all_steps) + var/list/step = list() + step["number"] = step_num++ + + // Determine what tool or item is needed + if(step_data["key"]) + var/key = step_data["key"] + + // Check if it's a tool define + if(key == TOOL_WRENCH) + step["tool"] = "Wrench" + step["action"] = "Use wrench" + else if(key == TOOL_SCREWDRIVER) + step["tool"] = "Screwdriver" + step["action"] = "Use screwdriver" + else if(key == TOOL_WELDER) + step["tool"] = "Welding Tool" + step["action"] = "Weld" + else if(key == TOOL_WIRECUTTER) + step["tool"] = "Wirecutter" + step["action"] = "Cut wires" + else if(key == TOOL_CROWBAR) + step["tool"] = "Crowbar" + step["action"] = "Pry" + else if(ispath(key)) + // It's an item type + var/obj/item/item = key + step["item"] = initial(item.name) + + // Special case for bikehorns (H.O.N.K mech) + if(ispath(key, /obj/item/bikehorn)) + step["tool"] = "Bike Horn" + step["action"] = "Honk Chassis with Bike Horn" + else if(step_data["amount"]) + step["amount"] = step_data["amount"] + step["action"] = "Add [step_data["amount"]]x [initial(item.name)]" + else + step["action"] = "Add [initial(item.name)]" + + steps += list(step) + + qdel(construction) + return steps + +/// Calculates total materials needed for all parts +/datum/computer_file/program/catalog/proc/get_materials_breakdown(construction_type) + var/list/materials = list() + + // Map construction types to their design categories + // Some mechs have multiple category names (base game vs modular overrides) + var/list/category_map = list( + /datum/component/construction/mecha/ripley = list("Ripley"), + /datum/component/construction/mecha/firefighter = list("Firefighter"), + /datum/component/construction/mecha/gygax = list("500 Series", "Gygax 500 Series"), + /datum/component/construction/mecha/durand = list("Durand"), + /datum/component/construction/mecha/odysseus = list("200 Series", "Odysseus 200 Series"), + /datum/component/construction/mecha/phazon = list("Phazon"), + /datum/component/construction/mecha/honker = list("H.O.N.K") + ) + + var/list/categories = category_map[construction_type] + if(!categories) + return materials + + // Aggregate materials from all designs in this category + var/list/material_totals = list() + + for(var/design_id in SSresearch.techweb_designs) + var/datum/design/design = SSresearch.techweb_designs[design_id] + + // Check if this design is for our mecha + if(design.build_type != MECHFAB) + continue + + // Check if any of our category names match + var/category_match = FALSE + for(var/category in categories) + if(category in design.category) + category_match = TRUE + break + + if(!category_match) + continue + + // Add materials from this design + for(var/material in design.materials) + var/datum/material/mat = material + var/mat_name = initial(mat.name) + + if(!material_totals[mat_name]) + material_totals[mat_name] = 0 + + material_totals[mat_name] += design.materials[material] + + // Convert to list format + for(var/mat_name in material_totals) + var/list/mat_data = list() + mat_data["name"] = mat_name + mat_data["amount"] = material_totals[mat_name] + materials += list(mat_data) + + return materials diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm new file mode 100644 index 00000000000..23accb320cc --- /dev/null +++ b/modular_pentest/modules/catalog/reagent_categories.dm @@ -0,0 +1,161 @@ +// NanoPedia - Reagent catalog categorization +// Sets catalog categories for reagents to organize them in the NanoPedia interface +// Categories: "medical", "chemistry", "drinks", "misc", "hidden" + +/datum/reagent + /// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "misc", "hidden" + var/catalog_category = "hidden" // Default to hidden, manually set visible categories below + +// Medical reagents - things a medical chemist would make +/datum/reagent/medicine/catalog_category = "medical" + +// Drinks - alcoholic and non-alcoholic beverages +/datum/reagent/consumable/ethanol/catalog_category = "drinks" +/datum/reagent/consumable/coffee/catalog_category = "drinks" +/datum/reagent/consumable/tea/catalog_category = "drinks" +/datum/reagent/consumable/hot_coco/catalog_category = "drinks" +/datum/reagent/consumable/sodawater/catalog_category = "drinks" +/datum/reagent/consumable/space_cola/catalog_category = "drinks" +/datum/reagent/consumable/nuka_cola/catalog_category = "drinks" +/datum/reagent/consumable/doctor_delight/catalog_category = "drinks" +/datum/reagent/consumable/red_queen/catalog_category = "drinks" +/datum/reagent/consumable/triple_citrus/catalog_category = "drinks" +/datum/reagent/consumable/grape_soda/catalog_category = "drinks" +/datum/reagent/consumable/milk/catalog_category = "drinks" +/datum/reagent/consumable/soymilk/catalog_category = "drinks" +/datum/reagent/consumable/cafe_latte/catalog_category = "drinks" + +// Drugs - recreational/illegal substances +/datum/reagent/drug/catalog_category = "chemistry" + +// Toxins +/datum/reagent/toxin/catalog_category = "chemistry" + +// Basic chemistry reagents that aren't medicines or drinks +/datum/reagent/fuel/catalog_category = "chemistry" +/datum/reagent/lube/catalog_category = "chemistry" +/datum/reagent/space_cleaner/catalog_category = "chemistry" +/datum/reagent/acetone/catalog_category = "chemistry" +/datum/reagent/ammonia/catalog_category = "chemistry" +/datum/reagent/diethylamine/catalog_category = "chemistry" +/datum/reagent/oil/catalog_category = "chemistry" +/datum/reagent/phenol/catalog_category = "chemistry" +/datum/reagent/ash/catalog_category = "chemistry" +/datum/reagent/saltpetre/catalog_category = "chemistry" +/datum/reagent/lye/catalog_category = "chemistry" + +// Misc - Biogenerator reagents and special crafting methods +// Plant nutrients (biogenerator only) +/datum/reagent/plantnutriment/catalog_category = "misc" +/datum/reagent/plantnutriment/eznutriment/catalog_category = "misc" +/datum/reagent/plantnutriment/left4zednutriment/catalog_category = "misc" +/datum/reagent/plantnutriment/robustharvestnutriment/catalog_category = "misc" +/datum/reagent/plantnutriment/endurogrow/catalog_category = "misc" +/datum/reagent/plantnutriment/liquidearthquake/catalog_category = "misc" + +// Botany-specific toxins (biogenerator only) +/datum/reagent/toxin/plantbgone/weedkiller/catalog_category = "misc" +/datum/reagent/toxin/pestkiller/catalog_category = "misc" + +// Special reagents +/datum/reagent/genesis/catalog_category = "misc" + +// Hide basic elements and materials unless they have specific uses +/datum/reagent/hydrogen/catalog_category = "hidden" +/datum/reagent/oxygen/catalog_category = "hidden" +/datum/reagent/nitrogen/catalog_category = "hidden" +/datum/reagent/carbon/catalog_category = "hidden" +/datum/reagent/chlorine/catalog_category = "hidden" +/datum/reagent/fluorine/catalog_category = "hidden" +/datum/reagent/phosphorus/catalog_category = "hidden" +/datum/reagent/lithium/catalog_category = "hidden" +/datum/reagent/sodium/catalog_category = "hidden" +/datum/reagent/potassium/catalog_category = "hidden" +/datum/reagent/mercury/catalog_category = "hidden" +/datum/reagent/sulfur/catalog_category = "hidden" +/datum/reagent/silicon/catalog_category = "hidden" +/datum/reagent/aluminium/catalog_category = "hidden" +/datum/reagent/copper/catalog_category = "hidden" +/datum/reagent/iron/catalog_category = "hidden" +/datum/reagent/silver/catalog_category = "hidden" +/datum/reagent/gold/catalog_category = "hidden" +/datum/reagent/uranium/catalog_category = "hidden" +/datum/reagent/bromine/catalog_category = "hidden" +/datum/reagent/iodine/catalog_category = "hidden" + +// Hide water and basic consumables that aren't interesting +/datum/reagent/water/catalog_category = "hidden" +/datum/reagent/consumable/nutriment/catalog_category = "hidden" +/datum/reagent/consumable/nutriment/vitamin/catalog_category = "hidden" +/datum/reagent/consumable/sugar/catalog_category = "hidden" +/datum/reagent/consumable/blackpepper/catalog_category = "hidden" + +// Blood and biological fluids +/datum/reagent/blood/catalog_category = "hidden" + +// Changeling reagents +/datum/reagent/medicine/changelingadrenaline/catalog_category = "hidden" +/datum/reagent/medicine/changelinghaste/catalog_category = "hidden" + +// Special/admin only reagents +/datum/reagent/medicine/adminordrazine/catalog_category = "hidden" +/datum/reagent/magillitis/catalog_category = "hidden" + +// === Medical Type Subcategories === + +/datum/reagent + /// PENTEST ADDITION - Medical subcategory: "brute", "burn", "toxin", "oxygen", "misc", "omni" (omni/multi healers filtered from "all") + /// Because of how I pulled things from the GLOB, we have to define this at the reagent level even though only a small subsets will ever use it. + var/medical_type = "misc" + +// Omni Healers - heal multiple damage types (excluded from "all" filter) +/datum/reagent/medicine/synthflesh/medical_type = "omni" +/datum/reagent/medicine/cryoxadone/medical_type = "omni" +/datum/reagent/medicine/hunter_extract/medical_type = "omni" +/datum/reagent/medicine/panacea/medical_type = "omni" +/datum/reagent/medicine/stimulants/medical_type = "omni" +/datum/reagent/medicine/cureall/medical_type = "omni" +/datum/reagent/medicine/epinephrine/medical_type = "omni" +/datum/reagent/medicine/atropine/medical_type = "omni" +/datum/reagent/medicine/regen_jelly/medical_type = "omni" +/datum/reagent/medicine/pyroxadone/medical_type = "omni" +/datum/reagent/medicine/syndicate_nanites/medical_type = "omni" + +// Brute Medicine - heals physical damage +/datum/reagent/medicine/indomide/medical_type = "brute" +/datum/reagent/medicine/metafactor/medical_type = "brute" +/datum/reagent/medicine/hadrakine/medical_type = "brute" +/datum/reagent/medicine/silfrine/medical_type = "brute" +/datum/reagent/medicine/bicaridine/medical_type = "brute" +/datum/reagent/medicine/helbital/medical_type = "brute" + +// Burn Medicine - heals fire damage +/datum/reagent/medicine/leporazine/medical_type = "burn" +/datum/reagent/medicine/alvitane/medical_type = "burn" +/datum/reagent/medicine/quardexane/medical_type = "burn" +/datum/reagent/medicine/ysiltane/medical_type = "burn" +/datum/reagent/medicine/kelotane/medical_type = "burn" +/datum/reagent/medicine/aiuri/medical_type = "burn" + +// Toxin Medicine - heals toxin damage +/datum/reagent/medicine/calomel/medical_type = "toxin" +/datum/reagent/medicine/charcoal/medical_type = "toxin" +/datum/reagent/medicine/pancrazine/medical_type = "toxin" +/datum/reagent/medicine/gjalrazine/medical_type = "toxin" +/datum/reagent/medicine/dylovene/medical_type = "toxin" +/datum/reagent/medicine/multiver/medical_type = "toxin" + +// Oxygen Medicine - heals oxygen deprivation +/datum/reagent/medicine/dexalin/medical_type = "oxygen" +/datum/reagent/medicine/salbutamol/medical_type = "oxygen" +/datum/reagent/medicine/inaprovaline/medical_type = "oxygen" +/datum/reagent/medicine/convermol/medical_type = "oxygen" +/datum/reagent/medicine/tirimol/medical_type = "oxygen" + +// Misc - cloning, bone healing, sleep, antihol, etc. +/datum/reagent/medicine/clonexadone/medical_type = "misc" +/datum/reagent/medicine/quardexane/medical_type = "misc" +/datum/reagent/medicine/melatonin/medical_type = "misc" +/datum/reagent/medicine/skeletons_boon/medical_type = "misc" +/datum/reagent/medicine/antihol/medical_type = "misc" +/datum/reagent/medicine/indomide/medical_type = "misc" diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm new file mode 100644 index 00000000000..38b6781b9b9 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for blood +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm new file mode 100644 index 00000000000..c641079fdb7 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents with fauna related sources +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm new file mode 100644 index 00000000000..a8e311a441d --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents from flora related sources +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm new file mode 100644 index 00000000000..5f8f4492acc --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for IPCs +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm new file mode 100644 index 00000000000..6618815f443 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm @@ -0,0 +1,552 @@ +/* + Pentest Chem + + - Modularization Changes + - Pentest Orginals + - Clone Healing + - Omni Healing + - Misc Medicines + - Brute Medicine + - Burn Medicine + - Toxin Medicine + - Oxygen Medicine + +*/ + +/* + Modularization +*/ + +// Omnizine was reflevored into Panacea. +// Protozine was reflavored into Effluvial Panacea. + +/datum/reagent/medicine/panacea + name = "Omnizine Panacea" + description = "A rare bioactive compound first discovered within certain extraterrestrial plant species. Omnizine Panacea rapidly stimulates cellular regeneration, allowing it to slowly repair nearly all forms of bodily damage. Excessive doses can destabilize this process, causing the regenerative effect to reverse." + +/datum/reagent/medicine/panacea/effluvial + name = "Effluvial Panacea" + description = "A degraded or impure form of Omnizine Panacea produced through biomass decay or industrial food processing. While it retains some regenerative properties, contaminants and breakdown products greatly reduce its effectiveness." + +// Tricordazine was reflavored into cure all. + +/datum/reagent/medicine/cureall + name = "Tricordrazine" + description = "A potent stimulant commonly used in resuscitation. Slowly restores all types of damage." + +// Dylovene was reflavored into Pancrazine. This corrects their mistake in desc. + +/datum/supply_pack/medical/vials/dylo_vial + desc = "Contains a spare Pancrazine vial, for usage in a Hypospray." + +// Makes Quadrdexane lore accurate. + +/datum/reagent/medicine/quardexane + description = "A third-generation burn medication. Injection allows it to rapidly re-knit burns, while vaporous application acts as an cooling agent and sanitizing substance. Overdose causes new burns to form on the user's body." + +/* + Clone Healing + + Clonexadone is a chemical that heals clone damage, but nothing else. It requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone. + Clonexadone is made from cryoxadone and sodium, with plasma as a catalyst. + +*/ + +/datum/reagent/medicine/clonexadone + name = "Clonexadone" + description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone." + color = "#3D3DC6" + taste_description = "muscle" + metabolization_rate = 1.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M) + if(M.bodytemperature < T0C) + M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0) + REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) + . = 1 + metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75) + ..() + +/datum/chemical_reaction/clonexadone + results = list(/datum/reagent/medicine/clonexadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/* + Omni Healing +*/ + +// Regenerative Jelly is a chemical that heals all types of damage, but only if the user is alive. + +/datum/reagent/medicine/regen_jelly + name = "Regenerative Jelly" + description = "Gradually regenerates all types of damage, without harming slime anatomy." + reagent_state = LIQUID + color = "#CC23FF" + taste_description = "jelly" + +/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume) + if(M && ishuman(M) && reac_volume >= 0.5) + var/mob/living/carbon/human/H = M + H.hair_color = "C2F" + H.facial_hair_color = "C2F" + H.update_hair() + +/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-1.5*REM, 0) + M.adjustFireLoss(-1.5*REM, 0) + M.adjustOxyLoss(-1.5*REM, 0) + M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs + ..() + . = 1 + +// Pyroxadone is a chemical that heals all damage types, but only if the user is above a certain body temperature. +// It is made from cryoxadone and slime jelly, and apparently inverses the requirement for its activation. + +/datum/reagent/medicine/pyroxadone + name = "Pyroxadone" + description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." + color = "#f7832a" + taste_description = "spicy jelly" + +/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) + . = ..() + + var/bodytemp = M.bodytemperature + var/heatlimit = M.dna.species.bodytemp_heat_damage_limit + if(bodytemp < heatlimit) + return . + var/power = 0 + if(bodytemp < 400) + power = 2 + else if(bodytemp < 460) + power = 3 + else + power = 5 + if(M.on_fire) + power *= 2 + M.adjustOxyLoss(-2 * power, 0) + M.adjustBruteLoss(-power, 0) + M.adjustFireLoss(-1.5 * power, 0) + M.adjustToxLoss(-power, 0, TRUE) + M.adjustCloneLoss(-power, 0) + for(var/i in M.all_wounds) + var/datum/wound/iter_wound = i + iter_wound.on_xadone(power) + REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) + +// Restorative Nanites + +/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs + name = "Restorative Nanites" + description = "Miniature medical robots that swiftly restore bodily damage." + reagent_state = SOLID + color = "#555555" + overdose_threshold = 30 + process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs + +/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment. + M.adjustFireLoss(-5*REM, 0) + M.adjustOxyLoss(-15, 0) + M.adjustToxLoss(-5*REM, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) + M.adjustCloneLoss(-3*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots + if(prob(25)) + M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code + M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies + ..() + . = 1 + +/* + Misc Medicines +*/ + +// Melatonin is a chemical that has varying effects on different species. +// It has no effect on non-carbon life, but in carbon life it promotes healing and regeneration in exchange for a temporary period of discomfort. +// In spiderpeople, it promotes the regeneration of lost limbs, but causes aching in the remaining ones until the regeneration is complete. + +/datum/reagent/medicine/melatonin + name = "Melatonin" + description = "A compound typically found within organics. The exact effects vary on the species it is administered to." + color = "#e1b1e1" //very light pink ourple + overdose_threshold = 0 + var/regenerating + var/rachnid_limb + +/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L) + . = ..() + if(iscarbon(L)) + var/mob/living/carbon/imbiber = L + if(isspiderperson(imbiber)) + //we check limbs, if one is missing, we break from the for loop after setting it to heal + for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(!imbiber.get_bodypart(limb)) + rachnid_limb = limb + break + +/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L) + . = ..() + if(isspiderperson(L) && regenerating) + var/mob/living/carbon/spider + spider.regenerate_limb(rachnid_limb, TRUE, FALSE) + return + +/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M) + . = ..() + if(isvox(M)) + M.adjustToxLoss(1) + if(islizard(M)) + if(prob(10)) + M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) + if(isspiderperson(M) && rachnid_limb) + if(prob(7)) + to_chat(M, "Your body aches near [rachnid_limb]") + if(current_cycle > 20 && !regenerating) + regenerating = TRUE + + else + if(M.IsSleeping()) + if(M.getBruteLoss() && M.getFireLoss()) + if(prob(50)) + M.adjustBruteLoss(-0.5) + else + M.adjustFireLoss(-0.5) + else if(M.getBruteLoss()) + M.adjustBruteLoss(-0.2) + else if(M.getFireLoss()) + M.adjustFireLoss(-0.2) + +// Skeleton's Boon is a reagent that provides temporary armor to the user. +// It provides more protection to plasmamen than it does to skeletons, but it provides some protection to both. Overdose causes brittle bones. + +/datum/reagent/medicine/skeletons_boon + name = "Skeleton’s Boon" + description = "A robust solution of minerals that greatly strengthens the bones." + color = "#dbdfa2" + metabolization_rate = REAGENTS_METABOLISM * 0.125 + overdose_threshold = 50 + var/plasma_armor = 33 + var/skele_armor = 20 + var/added_armor = 0 + +/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) + ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) + if(isplasmaman(M)) + var/mob/living/carbon/human/H = M + H.physiology.armor.melee += plasma_armor + H.physiology.armor.bullet += plasma_armor + added_armor = plasma_armor + if(isskeleton(M)) + var/mob/living/carbon/human/H = M + H.physiology.armor.melee += skele_armor + H.physiology.armor.bullet += skele_armor + added_armor = skele_armor + ..() + +/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M) + REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) + REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.physiology.armor.melee -= added_armor + H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist + ..() + +/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M) + ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC) + REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC) + ..() + +/* + Brute Medicine +*/ + +// Bicaridine is a chemical that restores bruising, but overdose causes it instead. + +/datum/reagent/medicine/bicaridine + name = "Bicaridine" + description = "Restores bruising. Overdose causes it instead." + reagent_state = LIQUID + color = "#bf0000" + overdose_threshold = 30 + +/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-0.5*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M) + M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + ..() + . = 1 + +// Helbital + +/datum/reagent/medicine/helbital //kinda a C2 only if you're not in hardcrit. + name = "Helbital" + description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." + color = "#9400D3" + taste_description = "cold and lifeless" + overdose_threshold = 35 + reagent_state = SOLID + var/helbent = FALSE + var/reaping = FALSE + harmful = TRUE + metabolization_rate = 0.2 + +/datum/reagent/medicine/helbital/on_mob_life(mob/living/carbon/M) + . = TRUE + var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss()) + var/thou_shall_heal = 0 + var/good_kind_of_healing = FALSE + switch(M.stat) + if(CONSCIOUS) //bad + thou_shall_heal = death_is_coming/50 + M.adjustOxyLoss(2, TRUE) + if(SOFT_CRIT) //meh convert + thou_shall_heal = round(death_is_coming/47,0.1) + M.adjustOxyLoss(1, TRUE) + else //no convert + thou_shall_heal = round(death_is_coming/45,0.1) + good_kind_of_healing = TRUE + M.adjustBruteLoss(-thou_shall_heal, FALSE) + + if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper! + reaping = TRUE + var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to + if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING)) + helbent = TRUE + to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?")) + var/timeisticking = world.time + var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors + if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time)) + reaping = FALSE + return //good job, you ruined it + if(!RPSchoice) + to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon.")) + reaping = FALSE + return + var/grim = pick(RockPaperScissors) + if(grim == RPSchoice) //You Tied! + to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) + reaping = FALSE + else if(RockPaperScissors[RPSchoice] == grim) //You lost! + to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) + M.dust() + return + else //VICTORY ROYALE + to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) + M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M) + M.revive(full_heal = TRUE, admin_revive = FALSE) + M.reagents.del_reagent(type) + return + + ..() + return + +/datum/reagent/medicine/helbital/overdose_process(mob/living/carbon/M) + if(!helbent) + M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) + helbent = TRUE + ..() + return TRUE + +/datum/reagent/medicine/helbital/on_mob_delete(mob/living/L) + if(helbent) + L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) + ..() + +/* + Burn Medicine +*/ + +// Kelotane + +/datum/reagent/medicine/kelotane + name = "Kelotane" + description = "Heals burn damage. Overdose causes it instead." + reagent_state = LIQUID + color = "#FFa800" + overdose_threshold = 30 + +/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-0.5*REM, 0) + ..() + . = 1 + +/datum/reagent/medicine/kelotane/overdose_process(mob/living/M) + M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC) + ..() + . = 1 + +// Aiuri + +/datum/reagent/medicine/aiuri + name = "Aiuri" + description = "Used to treat burns. Does minor eye damage." + reagent_state = LIQUID + color = "#8C93FF" + var/resetting_probability = 0 + var/message_cd = 0 + harmful = TRUE + metabolization_rate = 0.2 + +/datum/reagent/medicine/aiuri/on_mob_life(mob/living/carbon/M) + M.adjustFireLoss(-2*REM) + M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM) + ..() + return TRUE + +/* + Toxin Medicine +*/ + +// Dylovene + +/datum/reagent/medicine/dylovene + name = "Dylovene" + description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage." + reagent_state = LIQUID + color = "#00a000" + overdose_threshold = 30 + taste_description = "a roll of gauze" + +/datum/reagent/medicine/dylovene/on_mob_life(mob/living/carbon/M) + M.adjustToxLoss(-0.5*REM, 0) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + M.reagents.remove_reagent(R.type,1) + ..() + . = 1 + +/datum/reagent/medicine/dylovene/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/medicine/dylovene/overdose_process(mob/living/M) + M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2. + ..() + . = 1 + +// Multiver + +/datum/reagent/medicine/multiver //enhanced with MULTIple medicines + name = "Multiver" + description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)." + reagent_state = LIQUID + harmful = TRUE + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/medicine/multiver/on_mob_life(mob/living/carbon/human/M) + var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 + var/list/medicine_types = list() //track unique medicine types to avoid double-counting + + //Check medicines in bloodstream + for(var/r in M.reagents.reagent_list) + var/datum/reagent/the_reagent = r + if(istype(the_reagent, /datum/reagent/medicine) && !(the_reagent.type in medicine_types)) + medicine_types += the_reagent.type + medibonus += 1 + + //Check medicines in stomach (for when multiver is drunk) + var/obj/item/organ/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH) + if(belly) + for(var/r in belly.reagents.reagent_list) + var/datum/reagent/the_reagent = r + if(istype(the_reagent, /datum/reagent/medicine) && !(the_reagent.type in medicine_types)) + medicine_types += the_reagent.type + medibonus += 1 + + M.adjustToxLoss(-0.5 * (min(medibonus, 3) + 1)) //1u alone, 1.5u with 1 other med, 2u with 2+ other meds + M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u + + //Purge reagents from bloodstream + for(var/r2 in M.reagents.reagent_list) + var/datum/reagent/the_reagent2 = r2 + if(the_reagent2 == src) + continue + var/amount2purge = 3 + if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines + continue + M.reagents.remove_reagent(the_reagent2.type, amount2purge) + + //Purge reagents from stomach (for when multiver is drunk) + if(belly) + for(var/r2 in belly.reagents.reagent_list) + var/datum/reagent/the_reagent2 = r2 + if(the_reagent2.type == type) //don't purge ourselves + continue + var/amount2purge = 3 + if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) + continue + belly.reagents.remove_reagent(the_reagent2.type, amount2purge) + + ..() + return TRUE + +/* + Oxygen Medicine +*/ + +// Convermol + +#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox + +/datum/reagent/medicine/convermol + name = "Convermol" + description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." + reagent_state = LIQUID + color = "#FF6464" + overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long + harmful = TRUE + metabolization_rate = 0.2 + +/datum/reagent/medicine/convermol/on_mob_life(mob/living/carbon/human/M) + var/oxycalc = 2.5*REM*current_cycle + if(!overdosed) + oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. + M.adjustOxyLoss(-oxycalc, 0) + M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0) + if(prob(current_cycle) && M.losebreath) + M.losebreath-- + ..() + return TRUE + +/datum/reagent/medicine/convermol/overdose_process(mob/living/carbon/human/M) + metabolization_rate += 1 + ..() + return TRUE + +#undef CONVERMOL_RATIO + +// Tirimol + +/datum/reagent/medicine/tirimol + name = "Tirimol" + description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes." + color = "#FF6464" + var/drowsycd = 0 + harmful = TRUE + metabolization_rate = 0.2 + +/datum/reagent/medicine/tirimol/on_mob_life(mob/living/carbon/human/M) + M.adjustOxyLoss(-3) + M.adjustStaminaLoss(2) + if(drowsycd && (world.time > drowsycd)) + M.drowsyness += 10 + drowsycd = world.time + (45 SECONDS) + else if(!drowsycd) + drowsycd = world.time + (15 SECONDS) + ..() + return TRUE + +/datum/reagent/medicine/tirimol/on_mob_end_metabolize(mob/living/L) + if(current_cycle > 20) + L.Sleeping(10 SECONDS) + ..() diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm new file mode 100644 index 00000000000..887c96d88b9 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for organ repair. +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm new file mode 100644 index 00000000000..89dd96e0c05 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for pain management. +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm new file mode 100644 index 00000000000..e0f3df600c9 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for status and mood effects. +*/ diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm new file mode 100644 index 00000000000..1aa88d3a9f8 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm @@ -0,0 +1,3 @@ +/* + Chemical Reagents for wound treatment. +*/ diff --git a/modular_pentest/modules/chemistry/code/overrides.dm b/modular_pentest/modules/chemistry/code/overrides.dm new file mode 100644 index 00000000000..f0cc11b7073 --- /dev/null +++ b/modular_pentest/modules/chemistry/code/overrides.dm @@ -0,0 +1,5 @@ +/datum/blackmarket_item/consumable/syndie_cigs + desc = "Who said smoking was bad for you? These Omnizine Panacea laced cigarettes will have you feeling like a million bucks!" + +/datum/uplink_item/badass/syndiecigs + desc = "Strong flavor, dense smoke, infused with Ominzine Panacea." diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm new file mode 100644 index 00000000000..53a23458d4d --- /dev/null +++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm @@ -0,0 +1,103 @@ +/* + Modularization +*/ + +/datum/chemical_reaction/charcoal + results = list(/datum/reagent/medicine/charcoal = 1) + required_reagents = list(/datum/reagent/ash = 3, /datum/reagent/oxygen = 1) + mix_message = "The mixture turns into a fine black powder." + +/datum/chemical_reaction/charcoal2 + results = list(/datum/reagent/medicine/charcoal = 2) + required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/water = 5) + mix_message = "The mixture turns into a fine black powder." + required_temp = 800 + +/* + Clone Healing +*/ + +/datum/chemical_reaction/clonexadone + results = list(/datum/reagent/medicine/clonexadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/* + Omni Healing +*/ + +/datum/chemical_reaction/regen_jelly + results = list(/datum/reagent/medicine/regen_jelly = 1) + required_reagents = list(/datum/reagent/medicine/cureall = 1, /datum/reagent/toxin/slimejelly = 1) + +/datum/chemical_reaction/regen_jelly2 + results = list(/datum/reagent/medicine/regen_jelly = 2) + required_reagents = list(/datum/reagent/medicine/panacea = 1, /datum/reagent/toxin/slimejelly = 1) + +/datum/chemical_reaction/pyroxadone + results = list(/datum/reagent/medicine/pyroxadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) + +/* + Misc Medicines +*/ + +// Melatonin has no recipe. Pills only. + +/datum/chemical_reaction/skele_boon + results = list(/datum/reagent/medicine/skeletons_boon = 5) + required_reagents = list(/datum/reagent/medicine/hunter_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5) + +/* + Brute Medicine +*/ + +/datum/chemical_reaction/bicaridine + results = list(/datum/reagent/medicine/bicaridine = 3) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) + +/datum/chemical_reaction/helbital + results = list(/datum/reagent/medicine/helbital = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) + mix_message = "The mixture turns into a thick, yellow powder." + +/* + Burn Medicine +*/ + +/datum/chemical_reaction/kelotane + results = list(/datum/reagent/medicine/kelotane = 2) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) + +/datum/chemical_reaction/aiuri + results = list(/datum/reagent/medicine/aiuri = 4) + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) + +/* + Toxin Medicine +*/ + +/datum/chemical_reaction/dylovene + results = list(/datum/reagent/medicine/dylovene = 3) + required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1, /datum/reagent/potassium = 1) + +/datum/chemical_reaction/multiver + results = list(/datum/reagent/medicine/multiver = 2) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1) + mix_message = "The mixture yields a fine black powder." + required_temp = 380 + +/* + Oxygen Medicine +*/ + +/datum/chemical_reaction/convermol + results = list(/datum/reagent/medicine/convermol = 3) + required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) + required_temp = 370 + mix_message = "The mixture rapidly turns into a dense pink liquid." + +/datum/chemical_reaction/tirimol + results = list(/datum/reagent/medicine/tirimol = 5) + required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) + required_catalysts = list(/datum/reagent/toxin/acid = 1) diff --git a/modular_pentest/modules/chemistry/readme.md b/modular_pentest/modules/chemistry/readme.md new file mode 100644 index 00000000000..05375b5cf90 --- /dev/null +++ b/modular_pentest/modules/chemistry/readme.md @@ -0,0 +1,35 @@ + + +https://github.com/PentestSS13/Pentest/pull/ + +## \Pentest fixes + +Module ID: PENTEST_CHEM + +### Description: + +Pentest Chemistry Overhaul + +### Shiptest Proc/File Changes: + +- N/A + +### Modular Overrides: + +- N/A + +### Defines: + +- N/A + +### Map additions: + +- N/A + +### Included files that are not contained in this module: + +- N/A + +### Credits: + +Ossa diff --git a/modular_pentest/modules/cult/code/cult_items.dm b/modular_pentest/modules/cult/code/cult_items.dm index 40826ccb6fd..89b847fc138 100644 --- a/modular_pentest/modules/cult/code/cult_items.dm +++ b/modular_pentest/modules/cult/code/cult_items.dm @@ -510,17 +510,6 @@ else return -/obj/item/reagent_containers/glass/beaker/unholywater - name = "flask of unholy water" - desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown." - icon = 'icons/obj/drinks/drinks.dmi' - icon_state = "holyflask" - color = "#333333" - list_reagents = list(/datum/reagent/fuel/unholywater = 50) - can_have_cap = FALSE - cap_icon_state = null - cap_on = FALSE - /obj/item/cult_shift name = "veil shifter" desc = "This relic instantly teleports you, and anything you're pulling, forward by a moderate distance." @@ -841,7 +830,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.stat != DEAD) - H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7) + H.reagents.add_reagent(/datum/reagent/medicine/panacea, 7) if(isshade(target) || isconstruct(target)) var/mob/living/simple_animal/M = target if(M.health+15 < M.maxHealth) diff --git a/modular_pentest/modules/cult/code/cult_ritual.dm b/modular_pentest/modules/cult/code/cult_ritual.dm index f476b517ee5..1d104b426fa 100644 --- a/modular_pentest/modules/cult/code/cult_ritual.dm +++ b/modular_pentest/modules/cult/code/cult_ritual.dm @@ -26,9 +26,7 @@ This file contains the cult dagger and rune list code if(iscultist(M)) if(M.reagents && M.reagents.has_reagent(/datum/reagent/water/holywater)) //allows cultists to be rescued from the clutches of ordained religion to_chat(user, span_cult("You remove the taint from [M].") ) - var/holy2unholy = M.reagents.get_reagent_amount(/datum/reagent/water/holywater) M.reagents.del_reagent(/datum/reagent/water/holywater) - M.reagents.add_reagent(/datum/reagent/fuel/unholywater,holy2unholy) log_combat(user, M, "smacked", src, " removing the holy water from them") return FALSE . = ..() diff --git a/modular_pentest/modules/cult/code/cult_structures.dm b/modular_pentest/modules/cult/code/cult_structures.dm index 6f64e77d37c..cdec58beff9 100644 --- a/modular_pentest/modules/cult/code/cult_structures.dm +++ b/modular_pentest/modules/cult/code/cult_structures.dm @@ -109,8 +109,6 @@ pickedtype += /obj/item/sharpener/cult if("Construct Shell") pickedtype += /obj/structure/constructshell - if("Flask of Unholy Water") - pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater else return if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) diff --git a/modular_pentest/modules/robots/code/med_borg.dm b/modular_pentest/modules/robots/code/med_borg.dm index b34765ba052..3bc2dfdb538 100644 --- a/modular_pentest/modules/robots/code/med_borg.dm +++ b/modular_pentest/modules/robots/code/med_borg.dm @@ -130,7 +130,7 @@ desc = "An upgrade to the Medical module's hypospray, allowing it \ to treat a wider range of conditions and problems." additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, - /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, /datum/reagent/medicine/rezadone, + /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/ysiltane, /datum/reagent/medicine/silfrine, /datum/reagent/medicine/rezadone, /datum/reagent/medicine/pen_acid) // diff --git a/code/game/objects/items/hot_potato.dm b/modular_pentest/modules/toys/code/hot_potato.dm similarity index 86% rename from code/game/objects/items/hot_potato.dm rename to modular_pentest/modules/toys/code/hot_potato.dm index f1957f7132b..4e92e8a6f87 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/modular_pentest/modules/toys/code/hot_potato.dm @@ -1,3 +1,12 @@ +/datum/uplink_item/role_restricted/explosive_hot_potato + name = "Exploding Hot Potato" + desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \ + The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." + item = /obj/item/hot_potato/syndicate + cost = 4 + surplus = 0 + restricted_roles = list("Cook", "Botanist") + //CREATOR'S NOTE: DO NOT FUCKING GIVE THIS TO BOTANY! /obj/item/hot_potato name = "hot potato" @@ -173,3 +182,15 @@ sticky = FALSE reusable = TRUE forceful_attachment = FALSE + +/datum/reagent/medicine/muscle_stimulant + name = "Muscle Stimulant" + description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." + +/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L) + . = ..() + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + +/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L) + . = ..() + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) diff --git a/modular_pentest/modules/toys/readme.md b/modular_pentest/modules/toys/readme.md new file mode 100644 index 00000000000..0b0248659a0 --- /dev/null +++ b/modular_pentest/modules/toys/readme.md @@ -0,0 +1,35 @@ + + +https://github.com/PentestSS13/Pentest/pull/ + +## \ Umbrellas + +Module ID: PENTEST_TOYS + +### Description: + +This file has code for toys! + +### Shiptest Proc/File Changes: + +- N/A + +### Modular Overrides: + +- N/A + +### Defines: + +- N/A + +### Map additions +- N/A + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + +Ossa diff --git a/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm b/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm index a7b19bebc3b..30b16b1d5d8 100644 --- a/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm +++ b/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm @@ -128,11 +128,11 @@ To add a crossbreed: color = "#FFCCCC" list_reagents = list(/datum/reagent/pax/peaceborg = 5) -/obj/item/slimecrossbeaker/omnizine //15u omnizine. +/obj/item/slimecrossbeaker/panacea //15u omnizine panacea. name = "healing extract" desc = "A gelatinous extract of pure omnizine." color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/omnizine = 15) + list_reagents = list(/datum/reagent/medicine/panacea = 15) /obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. var/ignore_flags = FALSE diff --git a/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm b/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm index 3e105e71708..a3aff3374ea 100644 --- a/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm +++ b/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm @@ -52,7 +52,7 @@ Charged extracts: effect_desc = "Creates a packet of omnizine." /obj/item/slimecross/charged/purple/do_effect(mob/user) - new /obj/item/slimecrossbeaker/omnizine(get_turf(user)) + new /obj/item/slimecrossbeaker/panacea(get_turf(user)) user.visible_message(span_notice("[src] sparks, and floods with a regenerative solution!")) ..() diff --git a/modular_pentest/modules/xenobiology/code/slime_extracts.dm b/modular_pentest/modules/xenobiology/code/slime_extracts.dm index 9e2656f12a8..b58925d9851 100644 --- a/modular_pentest/modules/xenobiology/code/slime_extracts.dm +++ b/modular_pentest/modules/xenobiology/code/slime_extracts.dm @@ -454,6 +454,16 @@ required_other = TRUE required_container = /obj/item/slime_extract/black +/datum/reagent/aslimetoxin + name = "Advanced Mutation Toxin" + description = "An advanced corruptive toxin produced by slimes." + color = "#13BC5E" // rgb: 19, 188, 94 + taste_description = "slime" + +/datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume) + if(method != TOUCH && method != SMOKE) + L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) + //Oil /datum/chemical_reaction/slime/slimeexplosion diff --git a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm index 3769cca7bcf..017ff36b8c4 100644 --- a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm +++ b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm @@ -29,3 +29,18 @@ if(prob(50)) for(var/j = 1, j <= rand(1, 3), j++) step(S, pick(NORTH,SOUTH,EAST,WEST)) + +/datum/uplink_item/role_restricted/spider_injector + name = "Australicus Slime Mutator" + desc = "Crikey mate, it's been a wild travel from the Australicus sector but we've managed to get \ + some special spider extract from the giant spiders down there. Use this injector on a gold slime core \ + to create a few of the same type of spiders we found on the planets over there. They're a bit tame until you \ + also give them a bit of sentience though." + item = /obj/item/reagent_containers/syringe/spider_extract + cost = 10 + restricted_roles = list("Research Director", "Scientist", "Roboticist") + +/obj/item/reagent_containers/syringe/spider_extract + name = "spider extract syringe" + desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." + list_reagents = list(/datum/reagent/spider_extract = 1) diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme index 0f01ffcb89f..33b31b7c013 100644 --- a/modular_pentest/~pentest.dme +++ b/modular_pentest/~pentest.dme @@ -28,6 +28,7 @@ #include "master_files\code\datums\components\crafting\recipes\misc.dm" #include "master_files\code\datums\components\crafting\recipes\clothing.dm" #include "master_files\code\datums\components\crafting\recipes\weapons.dm" +#include "master_files\code\datums\diseases\decloning.dm" #include "master_files\code\datums\diseases\pierrot_throat.dm" #include "master_files\code\game\atoms.dm" #include "master_files\code\game\pentest_proc.dm" @@ -38,6 +39,7 @@ #include "master_files\code\game\objects\AI_modules.dm" #include "master_files\code\game\objects\effects\decals\turfdecal\flooring_decals.dm" #include "master_files\code\game\objects\effects\spawners\random\food_or_drink.dm" +#include "master_files\code\game\objects\items\cigs_lighters.dm" #include "master_files\code\game\objects\items\dna_injector.dm" #include "master_files\code\game\objects\items\holy_weapons.dm" #include "master_files\code\game\objects\items\puzzle_pieces.dm" @@ -72,6 +74,7 @@ #include "master_files\code\game\objects\items\stacks\sheets\recipes\crate_recipes.dm" #include "master_files\code\game\objects\items\storage\backpack.dm" #include "master_files\code\game\objects\items\storage\boxes.dm" +#include "master_files\code\game\objects\items\storage\fancy.dm" #include "master_files\code\game\objects\items\storage\toolbox.dm" #include "master_files\code\game\objects\structures\crates.dm" #include "master_files\code\game\objects\structures\statues.dm" @@ -79,6 +82,7 @@ #include "master_files\code\game\turfs\open\water.dm" #include "master_files\code\game\turfs\open\floor\plating\misc_plating.dm" #include "master_files\code\game\turfs\walls\reinf_plastitanium.dm" +#include "master_files\code\modules\antagonists\abductor\equipment\abduction_gear.dm" #include "master_files\code\modules\antagonists\changeling\changeling.dm" #include "master_files\code\modules\antagonists\wizard\equipment\spellbook.dm" #include "master_files\code\modules\assembly\flash.dm" @@ -225,6 +229,13 @@ #include "modules\_pentest_fixes\weapons\gun_jam_removal.dm" #include "modules\achievements\code\achievements.dm" #include "modules\bedsheets\code\bedsheets.dm" +#include "modules\catalog\catalog.dm" +#include "modules\catalog\reagent_categories.dm" +#include "modules\catalog\design_visibility.dm" +#include "modules\catalog\mecha_extraction.dm" +#include "modules\catalog\designs_extraction.dm" +#include "modules\chemistry\code\medical_reagents\medicine_reagents.dm" +#include "modules\chemistry\code\recipes\medical_reactions.dm" #include "modules\cult\code\_cult_gamemode.dm" #include "modules\cult\code\construct_spells.dm" #include "modules\cult\code\constructs.dm" @@ -375,6 +386,7 @@ #include "modules\surgery\code\wing_reconstruction.dm" #include "modules\swarmers\code\megafauna_swarmer.dm" #include "modules\swarmers\code\swarmer.dm" +#include "modules\toys\code\hot_potato.dm" #include "modules\umbrella\code\umbrellas.dm" #include "modules\vehicle_atv\code\atv.dm" #include "modules\vehicle_clown\code\clowncar.dm" diff --git a/shiptest.dme b/shiptest.dme index e384448bc29..edd2f0e4f59 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -693,7 +693,6 @@ #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\decloning.dm" #include "code\datums\diseases\dna_spread.dm" #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" @@ -1365,7 +1364,6 @@ #include "code\game\objects\items\gun_maint_kit.dm" #include "code\game\objects\items\handcuffs.dm" #include "code\game\objects\items\holosign_creator.dm" -#include "code\game\objects\items\hot_potato.dm" #include "code\game\objects\items\hourglass.dm" #include "code\game\objects\items\inducer.dm" #include "code\game\objects\items\kitchen.dm" @@ -3357,11 +3355,9 @@ #include "code\modules\reagents\chemistry\machinery\pandemic.dm" #include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" #include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" -#include "code\modules\reagents\chemistry\reagents\cat2_medicine_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" #include "code\modules\reagents\chemistry\reagents\food_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" #include "code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" #include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" @@ -3370,8 +3366,19 @@ #include "code\modules\reagents\chemistry\reagents\alcohol_reagents\ethanol.dm" #include "code\modules\reagents\chemistry\reagents\alcohol_reagents\fruit_wine.dm" #include "code\modules\reagents\chemistry\reagents\alcohol_reagents\mixed_drinks.dm" -#include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\_medicine_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\blood_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\fauna_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\flora_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\ipc_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\medicine_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\misc_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\organ_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\pain_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\status_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medical_reagents\wound_reagents.dm" #include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\medical_consumables.dm" #include "code\modules\reagents\chemistry\recipes\medicine.dm" #include "code\modules\reagents\chemistry\recipes\others.dm" #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js new file mode 100644 index 00000000000..9f711b5c059 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosCatalog.js @@ -0,0 +1,783 @@ +import { useBackend } from '../backend'; +import { Box, Button, Input, Section, Stack, Table } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosCatalog = (props, context) => { + const { act, data } = useBackend(context); + const { + PC_device_theme, + current_view, + current_category, + search_query, + chemicals = [], + mechas = [], + designs = [], + } = data; + + return ( + <NtosWindow width={600} height={700} theme={PC_device_theme} resizable> + <NtosWindow.Content> + <Stack vertical fill> + {/* Fixed header section */} + <Section> + <Stack> + <Stack.Item grow> + <Box fontSize="1.5em" bold mb={1}> + NanoPedia + </Box> + <Box color="label" mb={1}> + NanoTrasen Comprehensive Reference Database + </Box> + </Stack.Item> + </Stack> + </Section> + + {/* Fixed view buttons */} + <Section> + <Stack vertical> + <Stack.Item> + <Stack> + <Stack.Item> + <Button + icon="flask" + color={current_view === 'chemistry' ? 'good' : ''} + content="Chemistry" + onClick={() => act('change_view', { view: 'chemistry' })} + /> + </Stack.Item> + <Stack.Item> + <Button + icon="medkit" + color={current_view === 'medical' ? 'good' : ''} + content="Medical" + onClick={() => act('change_view', { view: 'medical' })} + /> + </Stack.Item> + <Stack.Item> + <Button + icon="glass-martini" + color={current_view === 'drinks' ? 'good' : ''} + content="Drinks" + onClick={() => act('change_view', { view: 'drinks' })} + /> + </Stack.Item> + <Stack.Item> + <Button + icon="leaf" + color={current_view === 'misc' ? 'good' : ''} + content="Misc" + onClick={() => act('change_view', { view: 'misc' })} + /> + </Stack.Item> + <Stack.Item> + <Button + icon="robot" + color={current_view === 'mechs' ? 'good' : ''} + content="Exosuits" + onClick={() => act('change_view', { view: 'mechs' })} + /> + </Stack.Item> + <Stack.Item> + <Button + icon="wrench" + color={current_view === 'designs' ? 'good' : ''} + content="Designs" + onClick={() => act('change_view', { view: 'designs' })} + /> + </Stack.Item> + </Stack> + </Stack.Item> + <Stack.Item> + <Stack> + <Stack.Item grow> + <Input + fluid + placeholder="Search..." + value={search_query} + onInput={(e, value) => act('search', { query: value })} + /> + </Stack.Item> + {search_query && ( + <Stack.Item> + <Button + icon="times" + content="Clear" + onClick={() => act('clear_search')} + /> + </Stack.Item> + )} + </Stack> + </Stack.Item> + </Stack> + </Section> + + {/* Scrollable content area */} + <Section fill scrollable mb={2}> + {(current_view === 'chemistry' || + current_view === 'medical' || + current_view === 'drinks' || + current_view === 'misc') && ( + <ChemistryCatalog + chemicals={chemicals} + view={current_view} + current_category={current_category} + act={act} + /> + )} + {current_view === 'mechs' && <MechaCatalog mechas={mechas} />} + {current_view === 'designs' && ( + <DesignsCatalog + designs={designs} + current_category={current_category} + act={act} + /> + )} + </Section> + </Stack> + </NtosWindow.Content> + </NtosWindow> + ); +}; + +const ChemistryCatalog = (props, context) => { + const { chemicals = [], view, current_category, act } = props; + + // Determine section title based on view + const getSectionTitle = () => { + switch (view) { + case 'medical': + return 'Medical Chemistry'; + case 'drinks': + return 'Drinks & Beverages'; + case 'misc': + return 'Miscellaneous'; + case 'chemistry': + default: + return 'Chemistry'; + } + }; + + if (chemicals.length === 0) { + return ( + <Section> + <Box color="label" textAlign="center" my={2}> + No chemicals found matching your search. + </Box> + </Section> + ); + } + + return ( + <Stack vertical> + {/* Medical category filter buttons */} + {view === 'medical' && ( + <Stack.Item> + <Box fontSize="1.2em" bold mb={1}> + {getSectionTitle()} ({chemicals.length} chemicals) + </Box> + <Stack fill mb={1}> + <Stack.Item grow> + <Button + fluid + selected={current_category === 'all'} + onClick={() => act('change_category', { category: 'all' })} + > + All + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="grey" + selected={current_category === 'misc'} + onClick={() => act('change_category', { category: 'misc' })} + > + Misc + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="red" + selected={current_category === 'brute'} + onClick={() => act('change_category', { category: 'brute' })} + > + Brute + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="orange" + selected={current_category === 'burn'} + onClick={() => act('change_category', { category: 'burn' })} + > + Burn + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="green" + selected={current_category === 'toxin'} + onClick={() => act('change_category', { category: 'toxin' })} + > + Toxin + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="blue" + selected={current_category === 'oxygen'} + onClick={() => act('change_category', { category: 'oxygen' })} + > + Oxygen + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="purple" + selected={current_category === 'omni'} + onClick={() => act('change_category', { category: 'omni' })} + > + Omni + </Button> + </Stack.Item> + </Stack> + </Stack.Item> + )} + + {/* Chemical list */} + <Stack.Item> + {view !== 'medical' && ( + <Section + title={`${getSectionTitle()} (${chemicals.length} chemicals)`} + > + <Stack vertical> + {chemicals.map((chemical) => ( + <Stack.Item key={chemical.type}> + <ChemicalEntry chemical={chemical} /> + </Stack.Item> + ))} + </Stack> + </Section> + )} + {view === 'medical' && ( + <Stack vertical> + {chemicals.map((chemical) => ( + <Stack.Item key={chemical.type}> + <ChemicalEntry chemical={chemical} /> + </Stack.Item> + ))} + </Stack> + )} + </Stack.Item> + </Stack> + ); +}; + +const ChemicalEntry = (props, context) => { + const { chemical } = props; + + // Determine color based on category + const getCategoryColor = (category) => { + switch (category) { + case 'medical': + return '#4a90e2'; // Blue + case 'chemistry': + return '#50c878'; // Green + case 'drinks': + return '#e67e22'; // Orange + case 'misc': + return '#1abc9c'; // Teal + default: + return '#95a5a6'; // Gray + } + }; + + return ( + <> + <Box + backgroundColor={getCategoryColor(chemical.category)} + height="3px" + mb={1} + /> + <Section title={chemical.name} level={2}> + <Stack vertical> + <Stack.Item> + <Box italic mb={1}> + {chemical.description} + </Box> + </Stack.Item> + + {chemical.biogenerator_cost && ( + <Stack.Item> + <Box bold color="teal" mb={0.5}> + Biogenerator Cost: {chemical.biogenerator_cost} Biomass + </Box> + </Stack.Item> + )} + + {chemical.recipes && chemical.recipes.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Recipes: + </Box> + <Stack vertical> + {chemical.recipes.map((recipe, index) => ( + <Stack.Item key={index}> + <RecipeEntry recipe={recipe} /> + </Stack.Item> + ))} + </Stack> + </Stack.Item> + )} + + {(!chemical.recipes || chemical.recipes.length === 0) && ( + <Stack.Item> + <Box color="label" fontSize="0.9em"> + No known chemical recipes. May be found naturally or created + through other means. + </Box> + </Stack.Item> + )} + </Stack> + </Section> + </> + ); +}; + +const RecipeEntry = (props, context) => { + const { recipe } = props; + + return ( + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={0.5}> + <Table> + <Table.Row> + <Table.Cell bold color="label" width="180px"> + Required: + </Table.Cell> + <Table.Cell> + {recipe.required && recipe.required.length > 0 ? ( + recipe.required.map((req, i) => ( + <Box key={i}> + {req.amount}u {req.name} + </Box> + )) + ) : ( + <Box color="label">None</Box> + )} + </Table.Cell> + </Table.Row> + + {recipe.catalysts && recipe.catalysts.length > 0 && ( + <Table.Row> + <Table.Cell bold color="label" width="180px"> + Catalysts: + </Table.Cell> + <Table.Cell> + {recipe.catalysts.map((cat, i) => ( + <Box key={i}> + {cat.amount}u {cat.name} + </Box> + ))} + </Table.Cell> + </Table.Row> + )} + + <Table.Row> + <Table.Cell bold color="label" width="180px"> + Produces: + </Table.Cell> + <Table.Cell> + <Box color="good">{recipe.produces}u</Box> + </Table.Cell> + </Table.Row> + + {recipe.temperature && ( + <Table.Row> + <Table.Cell bold color="label" width="180px"> + Temperature: + </Table.Cell> + <Table.Cell> + <Box color={recipe.is_cold ? 'blue' : 'orange'}> + {recipe.is_cold ? '< ' : '> '} + {recipe.temperature}K + </Box> + </Table.Cell> + </Table.Row> + )} + </Table> + </Box> + ); +}; + +const MechaCatalog = (props, context) => { + const { mechas = [] } = props; + + if (mechas.length === 0) { + return ( + <Section> + <Box color="label" textAlign="center" my={2}> + No exosuits found matching your search. + </Box> + </Section> + ); + } + + return ( + <Section title={`Exosuit Construction Guide (${mechas.length} exosuits)`}> + <Stack vertical> + {mechas.map((mecha, index) => ( + <Stack.Item key={index}> + <MechaEntry mecha={mecha} /> + </Stack.Item> + ))} + </Stack> + </Section> + ); +}; + +const MechaEntry = (props, context) => { + const { mecha } = props; + + // Determine color based on category + const getCategoryColor = (category) => { + switch (category) { + case 'working': + return '#f39c12'; // Orange for working mechs + case 'combat': + return '#e74c3c'; // Red for combat mechs + case 'medical': + return '#3498db'; // Blue for medical mechs + case 'advanced': + return '#9b59b6'; // Purple for advanced mechs + case 'clown': + return '#ff69b4'; // Hot pink for H.O.N.K! + default: + return '#95a5a6'; // Gray + } + }; + + return ( + <> + <Box + backgroundColor={getCategoryColor(mecha.category)} + height="3px" + mb={1} + /> + <Section title={mecha.name} level={2}> + <Stack vertical> + {/* Materials Required */} + {mecha.materials && mecha.materials.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Total Materials Required: + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Stack> + {mecha.materials.map((mat, i) => ( + <Stack.Item key={i} mr={2}> + <Box> + <Box as="span" bold> + {mat.amount} + </Box>{' '} + {mat.name} + </Box> + </Stack.Item> + ))} + </Stack> + </Box> + </Stack.Item> + )} + + {/* Parts to Fabricate */} + {mecha.parts && mecha.parts.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Step 1: Fabricate Parts (Exosuit Fabricator) + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Stack vertical> + {mecha.parts.map((part, i) => ( + <Stack.Item key={i}> + <Box> + <Box as="span" color="label"> + • + </Box>{' '} + {part.name} + </Box> + </Stack.Item> + ))} + </Stack> + </Box> + </Stack.Item> + )} + + {/* Assembly Steps */} + {mecha.assembly_steps && mecha.assembly_steps.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Step 2: Assembly Instructions + </Box> + <Stack vertical> + {mecha.assembly_steps.map((step, i) => ( + <Stack.Item key={i}> + <AssemblyStep step={step} /> + </Stack.Item> + ))} + </Stack> + </Stack.Item> + )} + </Stack> + </Section> + </> + ); +}; + +const AssemblyStep = (props, context) => { + const { step } = props; + + return ( + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={0.5}> + <Stack> + <Stack.Item> + <Box + backgroundColor="rgba(255, 255, 255, 0.1)" + p={0.5} + mr={1} + width="30px" + textAlign="center" + bold + > + {step.number} + </Box> + </Stack.Item> + <Stack.Item grow> + <Box> + {step.tool && ( + <Box color="orange" bold mb={0.5}> + Tool: {step.tool} + </Box> + )} + {step.item && ( + <Box color="blue" bold mb={0.5}> + {step.amount && <Box as="span">{step.amount}x </Box>} + {step.item} + </Box> + )} + {step.action && <Box color="label">{step.action}</Box>} + </Box> + </Stack.Item> + </Stack> + </Box> + ); +}; + +const DesignsCatalog = (props, context) => { + const { designs = [], current_category, act } = props; + + if (designs.length === 0) { + return ( + <Box color="label" textAlign="center" my={2}> + No designs found matching your search. + </Box> + ); + } + + return ( + <Stack vertical> + {/* Title */} + <Stack.Item> + <Box fontSize="1.2em" bold mb={1}> + Fabricator Designs ({designs.length} designs) + </Box> + </Stack.Item> + + {/* Category buttons */} + <Stack.Item> + <Stack fill> + <Stack.Item grow> + <Button + fluid + selected={current_category === 'all'} + onClick={() => act('change_category', { category: 'all' })} + > + All + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="blue" + selected={current_category === 'autolathe'} + onClick={() => act('change_category', { category: 'autolathe' })} + > + Autolathe + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="purple" + selected={current_category === 'protolathe'} + onClick={() => act('change_category', { category: 'protolathe' })} + > + Protolathe + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="green" + selected={current_category === 'imprinter'} + onClick={() => act('change_category', { category: 'imprinter' })} + > + Circuit Imprinter + </Button> + </Stack.Item> + <Stack.Item grow> + <Button + fluid + color="orange" + selected={current_category === 'mechfab'} + onClick={() => act('change_category', { category: 'mechfab' })} + > + Mech Fab + </Button> + </Stack.Item> + </Stack> + </Stack.Item> + + {/* Design entries */} + {designs.map((design, index) => ( + <Stack.Item key={design.id || index}> + <DesignEntry design={design} /> + </Stack.Item> + ))} + </Stack> + ); +}; + +const DesignEntry = (props, context) => { + const { design } = props; + + return ( + <> + <Box backgroundColor="#7f8c8d" height="3px" mb={1} /> + <Section title={design.name} level={2}> + <Stack vertical> + {design.description && ( + <Stack.Item> + <Box italic mb={1} color="label"> + {design.description} + </Box> + </Stack.Item> + )} + + {/* Fabricators */} + {design.categories && design.categories.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Available at: + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Stack> + {design.categories.map((fab, i) => ( + <Stack.Item key={i}> + <Box color="cyan"> + •{' '} + {fab.charAt(0).toUpperCase() + + fab.slice(1).replace('mechfab', 'Mech Fab')} + </Box> + </Stack.Item> + ))} + </Stack> + </Box> + </Stack.Item> + )} + + {/* Departments */} + {design.departments && design.departments.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Department Access: + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Stack> + {design.departments.map((dept, i) => ( + <Stack.Item key={i}> + <Box + color={ + dept === 'All Departments' ? 'average' : 'yellow' + } + > + • {dept} + </Box> + </Stack.Item> + ))} + </Stack> + </Box> + </Stack.Item> + )} + + {/* Materials */} + {design.materials && design.materials.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Materials Required: + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Table> + {design.materials.map((mat, i) => ( + <Table.Row key={i}> + <Table.Cell> + <Box color="label">{mat.name}</Box> + </Table.Cell> + <Table.Cell textAlign="right"> + <Box bold color="good"> + {mat.amount} + </Box> + </Table.Cell> + </Table.Row> + ))} + </Table> + </Box> + </Stack.Item> + )} + + {/* Research Requirements */} + {design.research_nodes && design.research_nodes.length > 0 && ( + <Stack.Item> + <Box bold mb={0.5} color="good"> + Requires Research: + </Box> + <Box backgroundColor="rgba(0, 0, 0, 0.33)" p={1} mb={1}> + <Stack vertical> + {design.research_nodes.map((node, i) => ( + <Stack.Item key={i}> + <Box color="purple"> + • {node.name || node.id || 'Unknown Research Node'} + </Box> + </Stack.Item> + ))} + </Stack> + </Box> + </Stack.Item> + )} + + {/* Categories */} + {design.categories && design.categories.length > 0 && ( + <Stack.Item> + <Box fontSize="0.9em" color="label"> + Categories: {design.categories.join(', ')} + </Box> + </Stack.Item> + )} + </Stack> + </Section> + </> + ); +}; diff --git a/tools/UpdatePaths/Scripts/5162_chem_kill.txt b/tools/UpdatePaths/Scripts/5162_chem_kill.txt new file mode 100644 index 00000000000..27898bacf53 --- /dev/null +++ b/tools/UpdatePaths/Scripts/5162_chem_kill.txt @@ -0,0 +1,12 @@ +/obj/item/reagent_containers/pill/patch/styptic : /obj/item/reagent_containers/pill/patch/indomide{@OLD} +/obj/item/reagent_containers/pill/patch/silver_sulf : /obj/item/reagent_containers/pill/patch/alvitane{@OLD} +/obj/item/reagent_containers/pill/patch/quardexane : /obj/item/reagent_containers/pill/patch/alvitane{@OLD} +/obj/item/reagent_containers/pill/trophazole : /obj/item/reagent_containers/pill/indomide{@OLD} +/obj/item/reagent_containers/syringe/contraband/fentanyl : /obj/item/reagent_containers/syringe/contraband/morphine{@OLD} +/obj/item/reagent_containers/syringe/oxandrolone : /obj/item/reagent_containers/syringe/ysiltane{@OLD} +/obj/item/reagent_containers/glass/bottle/bicaridine : /obj/item/reagent_containers/glass/bottle/indomide{@OLD} +/obj/item/reagent_containers/hypospray/medipen/stimulants : /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis{@OLD} +/obj/item/reagent_containers/hypospray/medipen/tricord : /obj/item/reagent_containers/hypospray/medipen/cureall{@OLD} +/obj/item/hypospray/mkii/tricord : /obj/item/hypospray/mkii/cureall +/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord : /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall +/obj/item/reagent_containers/glass/bottle/antitoxin : /obj/item/reagent_containers/glass/bottle/charcoal \ No newline at end of file diff --git a/tools/_pentest_scripts/run_prettier_v2.cmd b/tools/_pentest_scripts/run_prettier_v2.cmd new file mode 100644 index 00000000000..084ab66594a --- /dev/null +++ b/tools/_pentest_scripts/run_prettier_v2.cmd @@ -0,0 +1,22 @@ +@echo off +setlocal +REM Script to run prettier on the tgui folder +REM This fixes formatting issues without needing to update the prettier version + +cd /d "%~dp0..\..\tgui" +echo Running prettier on tgui folder... +call yarn prettier . --write + +if %errorlevel% neq 0 ( + echo. + echo Prettier failed with error code %errorlevel% + echo. + pause + exit /b %errorlevel% +) + +echo. +echo Prettier formatting complete! +echo. +pause +exit /b 0