From ec3f5acec058802aaa35c14afca24cff0ece0c97 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 16 May 2025 15:49:27 -0500 Subject: [PATCH] [MDB Ignore] Damp Rag can now get dirty / Repaths damp rag (it's no longer a cup) (#90700) - Damp rag is now no longer god's perfect cleaning tool. After blood, the damp rag will collect it, and after cleaning a lot of blood, you can no longer clean with the rag until you wash it in a sink (or with cleaner or however you want) - This means the rag will collect DNA in it as you clean, which gives detectives an opportunity to investigate. - It also means the DNA it collects will occasionally spread onto you, meaning you will have to clean your gloves or hands. - Cleaning vomit and such is (currently) unaffected (and does not dirty the rag). - Diseases are not currently transferred to the rag (but this would be fun to add) - Gauze now gets dirty when using it to wrap bleeding wounds. This is just visual, though blood DNA gets transferred. It can be washed in a sink. - Removed gauze on sink / cloth on sink interaction. - Can't really wash gauze with it, plus it's redundant. - Damp rag is no longer a cup. Damp rag is just "soap without any downsides", which is kinda lame. I thought about going a step further and making it require you wet it first but then it just becomes "mop but small" which is also lame. Instead, you're required to clean it, which gives janitors / crewmembers an alternate cleaning method: - Soap: Small, finite, limited. Can't be replenished. - Cleaner: Small, finite, even more limited, ranged. Can be refilled with chemistry's help. - Mop: Large, infinite, limited. Needs a water bucket. - Damp Rag: Small, infinite, limited. Need to clean it after a few goes. :cl: Melbert balance: Damp Rags can now get dirty when using them to clean blood, passing blood DNA along. add: Gauze now gets dirty when apply it to actively bleeding wounds. Doesn't spread disease or anything, just passes blood DNA. It can be cleaned in a sink. del: Removed cloth on sink / gauze on sink interaction to make rags. Just use the crafting menu /:cl: --- .../LavaRuins/lavaland_biodome_beach.dmm | 2 +- .../LavaRuins/lavaland_surface_gas.dmm | 4 +- .../lavaland_surface_syndicate_base1.dmm | 2 +- .../SpaceRuins/allamericandiner.dmm | 2 +- _maps/RandomRuins/SpaceRuins/bus.dmm | 2 +- _maps/RandomRuins/SpaceRuins/film_studio.dmm | 2 +- .../RandomRuins/SpaceRuins/garbagetruck2.dmm | 2 +- _maps/RandomRuins/SpaceRuins/spacehotel.dmm | 2 +- .../RandomRuins/SpaceRuins/travelers_rest.dmm | 2 +- _maps/RandomZLevels/SnowCabin.dmm | 2 +- _maps/RandomZLevels/TheBeach.dmm | 2 +- _maps/RandomZLevels/moonoutpost19.dmm | 2 +- _maps/RandomZLevels/undergroundoutpost45.dmm | 2 +- _maps/map_files/Birdshot/birdshot.dmm | 10 +- .../CatwalkStation/CatwalkStation_2023.dmm | 6 +- .../map_files/Deltastation/DeltaStation2.dmm | 8 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 6 +- _maps/map_files/MetaStation/MetaStation.dmm | 16 +-- .../map_files/NebulaStation/NebulaStation.dmm | 24 ++-- _maps/map_files/generic/CentCom.dmm | 2 +- .../barcargoupper_attachment_a_3.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 8 +- _maps/map_files/wawastation/wawastation.dmm | 4 +- _maps/shuttles/emergency_birdshot.dmm | 2 +- _maps/shuttles/emergency_cruise.dmm | 2 +- _maps/shuttles/emergency_luxury.dmm | 2 +- _maps/shuttles/emergency_monastery.dmm | 2 +- _maps/shuttles/emergency_tranquility.dmm | 2 +- _maps/shuttles/pirate_irs.dmm | 2 +- _maps/templates/battlecruiser_starfury.dmm | 2 +- _maps/templates/holodeck_lounge.dmm | 2 +- _maps/templates/lazy_templates/nukie_base.dmm | 2 +- _maps/templates/shelter_3.dmm | 2 +- _maps/virtual_domains/beach_bar.dmm | 2 +- _maps/virtual_domains/island_brawl.dmm | 2 +- code/_globalvars/lists/maintenance_loot.dm | 2 +- code/datums/components/cleaner.dm | 7 +- code/datums/components/crafting/chemistry.dm | 2 +- .../elements/reagents_heated_on_fire.dm | 25 +++++ .../datums/elements/reagents_item_heatable.dm | 41 +++++++ code/game/objects/effects/decals/cleanable.dm | 2 +- .../objects/effects/spawners/random/trash.dm | 6 +- code/game/objects/items/stacks/medical.dm | 3 + .../items/stacks/sheets/sheet_types.dm | 2 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- .../game/objects/structures/cannons/cannon.dm | 2 +- .../crates_lockers/closets/job_closets.dm | 5 +- .../structures/water_structures/sink.dm | 4 +- .../water_structures/water_source.dm | 14 --- code/modules/art/paintings.dm | 4 +- code/modules/cargo/packs/service.dm | 2 +- code/modules/jobs/job_types/bartender.dm | 2 +- .../mob/living/silicon/robot/robot_model.dm | 2 +- code/modules/paperwork/fax.dm | 4 +- code/modules/reagents/reagent_containers.dm | 9 +- .../reagents/reagent_containers/cups/_cup.dm | 4 + .../reagents/reagent_containers/misc.dm | 106 ++++++++++++++++-- code/modules/unit_tests/damp_rag.dm | 2 +- code/modules/unit_tests/storage.dm | 2 +- code/modules/vending/wardrobes.dm | 4 +- tgstation.dme | 2 + tools/UpdatePaths/Scripts/90700_rags.txt | 1 + 62 files changed, 269 insertions(+), 130 deletions(-) create mode 100644 code/datums/elements/reagents_heated_on_fire.dm create mode 100644 code/datums/elements/reagents_item_heatable.dm create mode 100644 tools/UpdatePaths/Scripts/90700_rags.txt diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index e5edafff2b2..b4d563d8fed 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -1145,7 +1145,7 @@ /obj/structure/table, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/ruin/powered/beach) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm index 726a767d107..ae743175f17 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm @@ -243,7 +243,7 @@ "ks" = ( /obj/structure/sign/warning/fire/directional/north, /obj/structure/reagent_dispensers/fueltank/large{ - anchored = 1; + anchored = 1 }, /obj/structure/railing{ dir = 8 @@ -379,7 +379,7 @@ "qO" = ( /obj/structure/sign/warning/fire/directional/south, /obj/structure/reagent_dispensers/fueltank/large{ - anchored = 1; + anchored = 1 }, /obj/structure/railing{ dir = 8 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 6bdb976de4b..bbc09f38f59 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -3028,7 +3028,7 @@ /area/ruin/syndicate_lava_base/dormitories) "Ev" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -4; pixel_y = 9 }, diff --git a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm index e90c2666bdc..e548d3cbc6b 100644 --- a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm +++ b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm @@ -477,7 +477,7 @@ pixel_x = -1; pixel_y = 5 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 8; pixel_y = 3 }, diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index 1ecb40291e3..b821bf32195 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -244,7 +244,7 @@ /turf/open/misc/asteroid/airless, /area/ruin/space) "uO" = ( -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/misc/asteroid/airless, /area/ruin/space) "wc" = ( diff --git a/_maps/RandomRuins/SpaceRuins/film_studio.dmm b/_maps/RandomRuins/SpaceRuins/film_studio.dmm index fbd07432e52..4b8f54e1cdb 100644 --- a/_maps/RandomRuins/SpaceRuins/film_studio.dmm +++ b/_maps/RandomRuins/SpaceRuins/film_studio.dmm @@ -902,7 +902,7 @@ "rQ" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/item/reagent_containers/cup/glass/bottle/beer{ pixel_x = 5; pixel_y = -2 diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm index 96525b60616..4e01555219c 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm @@ -673,7 +673,7 @@ /obj/structure/sinkframe, /obj/structure/broken_flooring/pile, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 6; pixel_y = -3 }, diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index eec1e5a9671..1e2ad893c92 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -2517,7 +2517,7 @@ pixel_x = -4; pixel_y = 0 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 10; pixel_y = 17 }, diff --git a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm index af55da5cb4f..1b5da8d37ed 100644 --- a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm +++ b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm @@ -116,7 +116,7 @@ dir = 4; pixel_y = 0 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 6; pixel_y = 26 }, diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 823332f9297..bbc1f67457e 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -800,7 +800,7 @@ /area/awaymission/cabin) "ev" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/wood, /area/awaymission/cabin) "ew" = ( diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 63e3b580ec9..df0347e5729 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -3562,7 +3562,7 @@ /area/awaymission/beach) "Sg" = ( /obj/structure/table/bronze, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 5 }, /obj/item/reagent_containers/condiment/coconut_milk{ diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index c830fdc968f..5b0bbb0c733 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -4882,7 +4882,7 @@ "Gl" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 5 }, /obj/machinery/door/poddoor/shutters{ diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 16cc8924aae..b7d9cc58540 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -1689,7 +1689,7 @@ "hn" = ( /obj/structure/table, /obj/item/stack/package_wrap, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index cc46323dff5..4ced4938047 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -32123,9 +32123,9 @@ pixel_x = 3; pixel_y = 6 }, -/obj/item/reagent_containers/cup/rag{ - pixel_x = -6; - pixel_y = 4 +/obj/item/rag{ + pixel_y = 4; + pixel_x = -6 }, /turf/open/floor/iron/dark/small, /area/station/maintenance/department/science/xenobiology) @@ -33998,7 +33998,7 @@ /area/station/hallway/secondary/construction) "lnD" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -6; pixel_y = 6 }, @@ -66740,7 +66740,7 @@ pixel_x = -13; pixel_y = 14 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 7; pixel_y = 7 }, diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 870c9e34446..3b91b092916 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -1772,7 +1772,7 @@ id = "abandoned_kitchen"; name = "Kitchen Shudders" }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron/cafeteria, /area/station/maintenance/starboard/lesser) "aCO" = ( @@ -17454,7 +17454,7 @@ /area/station/maintenance/department/engine) "fmZ" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 2; pixel_y = 5 }, @@ -45317,7 +45317,7 @@ pixel_x = -6; pixel_y = 5 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 10; pixel_y = 17 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ab9355066a3..200f92a49b9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10046,7 +10046,7 @@ name = "Bar Requests Console" }, /obj/effect/mapping_helpers/requests_console/supplies, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron/checker{ dir = 1 }, @@ -47317,7 +47317,7 @@ pixel_x = -8 }, /obj/effect/turf_decal/delivery, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "lKe" = ( @@ -67036,7 +67036,7 @@ }, /obj/item/book/manual/wiki/cooking_to_serve_man, /obj/item/knife/kitchen, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) @@ -79566,7 +79566,7 @@ name = "scissors"; pixel_y = 1 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 4 }, /obj/structure/table, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index ca081aaa238..0890551bbb4 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -8286,7 +8286,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) "cjJ" = ( @@ -10449,7 +10449,7 @@ /area/station/command/heads_quarters/captain) "cQc" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/item/clothing/head/collectable/tophat{ pixel_x = 6; pixel_y = 5 @@ -82726,7 +82726,7 @@ pixel_x = 5; pixel_y = 6 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table/wood, /obj/item/holosign_creator/robot_seat/bar{ pixel_y = 6 diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 53ca4aad46d..37d299a5cd0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2512,7 +2512,7 @@ /obj/structure/desk_bell{ pixel_x = 7 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/item/reagent_containers/cup/glass/coffee{ pixel_x = -3; pixel_y = 9 @@ -6732,7 +6732,7 @@ pixel_x = 8; pixel_y = 2 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -4 }, /turf/open/floor/iron/cafeteria, @@ -8892,7 +8892,7 @@ }, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/apron/surgical, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/white, /area/station/medical/abandoned) @@ -10187,7 +10187,7 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/ce) "dJT" = ( -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table/wood, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -14345,7 +14345,7 @@ /obj/structure/table, /obj/item/kitchen/rollingpin, /obj/effect/turf_decal/trimline/brown/warning, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/effect/turf_decal/tile/bar{ dir = 1 }, @@ -24993,7 +24993,7 @@ /area/station/security/prison/mess) "iSt" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14 }, /obj/item/reagent_containers/cup/glass/waterbottle{ @@ -38105,7 +38105,7 @@ /obj/effect/landmark/navigate_destination/bar, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, @@ -39640,7 +39640,7 @@ pixel_x = -6; pixel_y = 10 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -10; pixel_y = 4 }, diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index 682eb7cfee9..d5a0b031d47 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -7320,7 +7320,7 @@ /area/station/medical/chemistry) "bfc" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14 }, /obj/item/reagent_containers/cup/glass/waterbottle{ @@ -54885,7 +54885,7 @@ /area/station/maintenance/port/aft) "ify" = ( /obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 11; pixel_x = -4 }, @@ -73482,7 +73482,7 @@ pixel_x = -6; pixel_y = 2 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 5; pixel_x = 6 }, @@ -81440,7 +81440,7 @@ }, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/apron/surgical, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron/white/textured_large, /area/station/maintenance/department/medical) "mec" = ( @@ -84085,7 +84085,7 @@ pixel_x = -8; pixel_y = 13 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14; pixel_x = 7 }, @@ -104261,7 +104261,7 @@ "puA" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -105860,7 +105860,7 @@ /area/station/engineering/atmos) "pFZ" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14; pixel_x = 7 }, @@ -114850,7 +114850,7 @@ /obj/structure/desk_bell{ pixel_x = 7 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/item/reagent_containers/cup/glass/coffee{ pixel_x = -3; pixel_y = 9 @@ -131082,7 +131082,7 @@ dir = 8 }, /obj/item/food/energybar, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14 }, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -146515,7 +146515,7 @@ "vKP" = ( /obj/effect/turf_decal/tile/dark/opposingcorners, /obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = -6; pixel_x = 6 }, @@ -151705,7 +151705,7 @@ dir = 1 }, /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 14 }, /obj/item/reagent_containers/cup/glass/waterbottle{ @@ -160772,7 +160772,7 @@ pixel_x = 7; pixel_y = 4 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -6; pixel_y = 4 }, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 6fd168d26ba..9408693271c 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -9585,7 +9585,7 @@ /obj/structure/table/wood, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/small/directional/east, diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_a_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_a_3.dmm index 933e982d3a8..d644068cab3 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_a_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_a_3.dmm @@ -53,7 +53,7 @@ "K" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 13; pixel_x = -7 }, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 33a4f4a4b5c..7faabeb5eff 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2163,7 +2163,7 @@ pixel_x = 6; pixel_y = 6 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -5; pixel_y = 8 }, @@ -10470,7 +10470,7 @@ "cAJ" = ( /obj/structure/table, /obj/item/razor, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 8; pixel_y = 15 }, @@ -23649,7 +23649,7 @@ pixel_x = 9; pixel_y = 5 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -6; pixel_y = 2 }, @@ -37745,7 +37745,7 @@ pixel_x = -5; pixel_y = 8 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 6; pixel_y = 5 }, diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 3c3fc943b1c..51a51c65385 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -524,7 +524,7 @@ /area/station/cargo/storage) "ait" = ( /obj/structure/table, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -5; pixel_y = 8 }, @@ -30028,7 +30028,7 @@ /obj/machinery/light/small/directional/east, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/plating, /area/station/maintenance/central/greater) "kvX" = ( diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm index 1cf44657848..47e5de8ac3a 100644 --- a/_maps/shuttles/emergency_birdshot.dmm +++ b/_maps/shuttles/emergency_birdshot.dmm @@ -257,7 +257,7 @@ /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = -4 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 3; pixel_y = 12 }, diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index a04903b6a3a..2558bc9c5bb 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -563,7 +563,7 @@ /obj/structure/table/wood/shuttle_bar{ boot_dir = 4 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -3; pixel_y = 1 }, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 01a873d8731..2eb0e949737 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -969,7 +969,7 @@ pixel_x = 7; pixel_y = 11 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -6; pixel_y = 4 }, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index 01e49397ee4..63df00c0048 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -3568,7 +3568,7 @@ /area/shuttle/escape) "XK" = ( /obj/structure/closet/crate/bin, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index 0de15be89cb..e44665e39c7 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -1597,7 +1597,7 @@ pixel_x = 6; pixel_y = 9 }, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = -2 }, /turf/open/floor/sepia, diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index c78c73a7538..dec40b87bd7 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -36,7 +36,7 @@ /obj/effect/turf_decal/siding/dark_green{ dir = 1 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /turf/open/floor/iron/kitchen, /area/shuttle/pirate) "bT" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 659a066347b..7a28474079a 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -2255,7 +2255,7 @@ pixel_x = 5; pixel_y = -2 }, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/turf_decal/siding/dark{ dir = 1 diff --git a/_maps/templates/holodeck_lounge.dmm b/_maps/templates/holodeck_lounge.dmm index 1bcec197d7b..88d56f65711 100644 --- a/_maps/templates/holodeck_lounge.dmm +++ b/_maps/templates/holodeck_lounge.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /obj/structure/table/wood/shuttle_bar, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_x = 10; pixel_y = 1 }, diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index ea39593ffb8..3d16561fd58 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -482,7 +482,7 @@ /area/centcom/syndicate_mothership/expansion_chemicalwarfare) "eF" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index 2bae50e8ba7..67b5155b9b4 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -41,7 +41,7 @@ "i" = ( /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/structure/table/wood/fancy/black, /turf/open/floor/pod/dark, /area/misc/survivalpod) diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index ba12436e048..b7d2e72ff6e 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -173,7 +173,7 @@ /obj/structure/table, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, +/obj/item/rag, /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/virtual_domain/fullbright) diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index ff94b8a335e..f9bbc496950 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -3298,7 +3298,7 @@ /area/virtual_domain) "Pq" = ( /obj/structure/table/bronze, -/obj/item/reagent_containers/cup/rag{ +/obj/item/rag{ pixel_y = 5 }, /obj/item/reagent_containers/condiment/coconut_milk{ diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d249a40d806..2eb6eab1d45 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -131,7 +131,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/lead_pipe = 1, /obj/item/reagent_containers/cup/beaker = 1, /obj/item/reagent_containers/cup/bottle/random_buffer = 2, - /obj/item/reagent_containers/cup/rag = 1, + /obj/item/rag = 1, /obj/item/reagent_containers/hypospray/medipen/pumpup = 2, /obj/item/reagent_containers/syringe = 1, /obj/item/stock_parts/power_store/cell/lead = 1, diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index de88ba08acd..f9134a409a7 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -118,7 +118,9 @@ if(user.mind) //higher cleaning skill can make the duration shorter //offsets the multiplier you get from cleaning skill, but doesn't allow the duration to be longer than the base duration cleaning_duration = (cleaning_duration * min(user.mind.get_skill_modifier(/datum/skill/cleaning, SKILL_SPEED_MODIFIER)+skill_duration_modifier_offset, 1)) - + // Assoc list, collects all items being cleaned with its value being any blood on it + var/list/all_cleaned = list() + all_cleaned[target] = GET_ATOM_BLOOD_DNA(target) || list() //do the cleaning var/clean_succeeded = FALSE if(do_after(user, cleaning_duration, target = target)) @@ -126,10 +128,11 @@ if(clean_target) for(var/obj/effect/decal/cleanable/cleanable_decal in target) //it's important to do this before you wash all of the cleanables off user.mind?.adjust_experience(/datum/skill/cleaning, round(cleanable_decal.beauty / CLEAN_SKILL_BEAUTY_ADJUSTMENT)) + all_cleaned[cleanable_decal] = GET_ATOM_BLOOD_DNA(cleanable_decal) if(target.wash(cleaning_strength)) user.mind?.adjust_experience(/datum/skill/cleaning, round(CLEAN_SKILL_GENERIC_WASH_XP)) - on_cleaned_callback?.Invoke(source, target, user, clean_succeeded) + on_cleaned_callback?.Invoke(source, target, user, clean_succeeded, all_cleaned) //remove the cleaning overlay target.cut_overlay(low_bubble) target.cut_overlay(high_bubble) diff --git a/code/datums/components/crafting/chemistry.dm b/code/datums/components/crafting/chemistry.dm index 77f33210e2c..eecbecea1ae 100644 --- a/code/datums/components/crafting/chemistry.dm +++ b/code/datums/components/crafting/chemistry.dm @@ -15,7 +15,7 @@ name = "Molotov" result = /obj/item/reagent_containers/cup/glass/bottle/molotov reqs = list( - /obj/item/reagent_containers/cup/rag = 1, + /obj/item/rag = 1, /obj/item/reagent_containers/cup/glass/bottle = 1, ) parts = list(/obj/item/reagent_containers/cup/glass/bottle = 1) diff --git a/code/datums/elements/reagents_heated_on_fire.dm b/code/datums/elements/reagents_heated_on_fire.dm new file mode 100644 index 00000000000..cf01dcad15b --- /dev/null +++ b/code/datums/elements/reagents_heated_on_fire.dm @@ -0,0 +1,25 @@ +/// When this atom is exposed to fire, that will propagate to its reagents +/datum/element/reagents_exposed_on_fire + +/datum/element/reagents_exposed_on_fire/Attach(datum/target) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_fire)) + RegisterSignal(target, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwave)) + +/datum/element/reagents_exposed_on_fire/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_ATOM_FIRE_ACT) + UnregisterSignal(source, COMSIG_ITEM_MICROWAVE_ACT) + return ..() + +/datum/element/reagents_exposed_on_fire/proc/on_fire(atom/source, exposed_temp, exposed_vol) + SIGNAL_HANDLER + + source.reagents?.expose_temperature(exposed_temp) + +/datum/element/reagents_exposed_on_fire/proc/on_microwave(atom/source, obj/machinery/microwave/microwave_source, mob/microwaver, randomize_pixel_offset) + SIGNAL_HANDLER + + source.reagents?.expose_temperature(1000) + return COMPONENT_MICROWAVE_SUCCESS diff --git a/code/datums/elements/reagents_item_heatable.dm b/code/datums/elements/reagents_item_heatable.dm new file mode 100644 index 00000000000..1dbd205064a --- /dev/null +++ b/code/datums/elements/reagents_item_heatable.dm @@ -0,0 +1,41 @@ +/// This atom can be touched by a hot item to warm up its reagents +/datum/element/reagents_item_heatable + +/datum/element/reagents_item_heatable/Attach(datum/target) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(on_item_interact)) + +/datum/element/reagents_item_heatable/Detach(datum/source, ...) + UnregisterSignal(source, COMSIG_ATOM_ITEM_INTERACTION) + return ..() + +/datum/element/reagents_item_heatable/proc/on_item_interact(atom/source, mob/living/user, obj/item/tool, list/modifiers) + SIGNAL_HANDLER + + if(isnull(source.reagents) || source.reagents.total_volume <= 0) + return NONE + + var/hotness = tool.get_temperature() + if(hotness) + source.reagents.expose_temperature(hotness) + source.balloon_alert(user, "heated [source]") + return ITEM_INTERACT_SUCCESS + + //Cooling method + if(istype(tool, /obj/item/extinguisher)) + var/obj/item/extinguisher/extinguisher = tool + if(extinguisher.safety) + return NONE + if (extinguisher.reagents?.total_volume < 1) + extinguisher.balloon_alert(user, "extinguisher is empty!") // being a bit more verbose to clarify the extinguisher - not source - is empty + return ITEM_INTERACT_BLOCKING + var/cooling = (0 - source.reagents.chem_temp) * extinguisher.cooling_power * 2 + source.reagents.expose_temperature(cooling) + source.balloon_alert(user, "cooled [source]") + playsound(source, 'sound/effects/extinguish.ogg', 75, TRUE, -3) + extinguisher.reagents.remove_all(1) + return ITEM_INTERACT_SUCCESS + + return NONE diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 66d01cd2f7d..1fdeb997e1d 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -82,7 +82,7 @@ return TRUE /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers) - if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/reagent_containers/cup/rag)) || istype(W, /obj/item/reagent_containers/cup/glass)) + if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/rag)) || istype(W, /obj/item/reagent_containers/cup/glass)) if(src.reagents && W.reagents) . = 1 //so the containers don't splash their content on the src while scooping. if(!src.reagents.total_volume) diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index e54f5549a63..7377331ecdc 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -20,7 +20,7 @@ /obj/item/stack/cable_coil = 5, /obj/item/food/deadmouse = 1, /obj/item/trash/candle = 1, - /obj/item/reagent_containers/cup/rag = 1, + /obj/item/rag = 1, /obj/item/trash/flare = 1, /obj/item/popsicle_stick = 1, /obj/item/reagent_containers/syringe = 1, @@ -47,7 +47,7 @@ /mob/living/basic/mouse = 1, /mob/living/basic/snail = 1, /obj/item/food/grown/cannabis = 1, - /obj/item/reagent_containers/cup/rag = 1, + /obj/item/rag = 1, /obj/effect/spawner/random/entertainment/drugs= 1, /obj/item/modular_computer/pda = 1, /obj/item/reagent_containers/syringe = 1, @@ -183,7 +183,7 @@ /obj/item/clothing/head/cone = 7, /obj/item/clothing/suit/caution = 3, /obj/effect/spawner/random/frog = 2, - /obj/item/reagent_containers/cup/rag = 2, + /obj/item/rag = 2, /obj/item/reagent_containers/cup/bucket = 2, /obj/effect/decal/cleanable/blood/old = 2, /obj/structure/mop_bucket = 2, diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 62aa0f98300..db6a30c68e2 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -475,6 +475,9 @@ ) if(heal_end_sound) playsound(patient, heal_end_sound, 75, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) + + if(limb.get_modified_bleed_rate()) + add_mob_blood(patient) limb.apply_gauze(src) /obj/item/stack/medical/gauze/twelve diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8e09d54a369..1b6d55039ac 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -499,7 +499,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6, crafting_flags = NONE, category = CAT_TOOLS), \ - new/datum/stack_recipe("rag", /obj/item/reagent_containers/cup/rag, 1, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("rag", /obj/item/rag, 1, crafting_flags = NONE, category = CAT_CHEMISTRY), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3, crafting_flags = NONE, category = CAT_FURNITURE), \ new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6, crafting_flags = NONE, category = CAT_FURNITURE), \ new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 0eef0dd502c..86f73dcf609 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -204,7 +204,7 @@ new /obj/item/card/id/advanced/chameleon(src) // 2 tc new /obj/item/clothing/under/chameleon(src) // 1 tc new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) // 5 tc - new /obj/item/reagent_containers/cup/rag(src) + new /obj/item/rag(src) new /obj/item/implanter/freedom(src) // 5 tc new /obj/item/flashlight/emp(src) // 2 tc new /obj/item/grenade/c4/x4(src) // 1ish tc diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 95f938994db..d312b8d6ddd 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -85,7 +85,7 @@ var/obj/item/reagent_containers/powder_keg = used_item if(!(powder_keg.reagent_flags & OPENCONTAINER)) return ..() - if(istype(powder_keg, /obj/item/reagent_containers/cup/rag)) + if(istype(powder_keg, /obj/item/rag)) return ..() if(!powder_keg.reagents.total_volume) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 25745884838..ce2c598ba12 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -14,7 +14,7 @@ /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/head/soft/black = 2, /obj/item/clothing/shoes/sneakers/black = 2, - /obj/item/reagent_containers/cup/rag = 2, + /obj/item/rag = 2, /obj/item/storage/box/beanbag = 1, /obj/item/clothing/suit/armor/vest/alt = 1, /obj/item/circuitboard/machine/dish_drive = 1, @@ -41,7 +41,7 @@ /obj/item/clothing/suit/toggle/chef = 1, /obj/item/clothing/under/costume/buttondown/slacks/service = 1, /obj/item/clothing/head/utility/chefhat = 1, - /obj/item/reagent_containers/cup/rag = 1) + /obj/item/rag = 1) generate_items_inside(items_inside,src) /obj/structure/closet/jcloset @@ -326,4 +326,3 @@ new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/storage/backpack/satchel/explorer(src) new /obj/item/storage/backpack/messenger/explorer(src) - diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index cadd73070b1..b7a1a66b47f 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -164,14 +164,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) if(istype(O, /obj/item/stack/medical/gauze)) var/obj/item/stack/medical/gauze/G = O - new /obj/item/reagent_containers/cup/rag(src.loc) + new /obj/item/rag(src.loc) to_chat(user, span_notice("You tear off a strip of gauze and make a rag.")) G.use(1) return if(istype(O, /obj/item/stack/sheet/cloth)) var/obj/item/stack/sheet/cloth/cloth = O - new /obj/item/reagent_containers/cup/rag(loc) + new /obj/item/rag(loc) to_chat(user, span_notice("You tear off a strip of cloth and make a rag.")) cloth.use(1) return diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm index dca271ba94b..678e2509b71 100644 --- a/code/game/objects/structures/water_structures/water_source.dm +++ b/code/game/objects/structures/water_structures/water_source.dm @@ -94,20 +94,6 @@ playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) return - if(istype(attacking_item, /obj/item/stack/medical/gauze)) - var/obj/item/stack/medical/gauze/G = attacking_item - new /obj/item/reagent_containers/cup/rag(loc) - to_chat(user, span_notice("You tear off a strip of gauze and make a rag.")) - G.use(1) - return - - if(istype(attacking_item, /obj/item/stack/sheet/cloth)) - var/obj/item/stack/sheet/cloth/cloth = attacking_item - new /obj/item/reagent_containers/cup/rag(loc) - to_chat(user, span_notice("You tear off a strip of cloth and make a rag.")) - cloth.use(1) - return - if(istype(attacking_item, /obj/item/stack/ore/glass)) new /obj/item/stack/sheet/sandblock(loc) to_chat(user, span_notice("You wet the sand and form it into a block.")) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 74e56ecf4e3..511096cc8fa 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -411,7 +411,7 @@ else if(istype(painting_implement, /obj/item/pen)) var/obj/item/pen/pen = painting_implement return pen.colour - else if(istype(painting_implement, /obj/item/soap) || istype(painting_implement, /obj/item/reagent_containers/cup/rag)) + else if(istype(painting_implement, /obj/item/soap) || istype(painting_implement, /obj/item/rag)) return canvas_color /// Generates medium description @@ -426,7 +426,7 @@ return "Crayon on canvas" else if(istype(painting_implement, /obj/item/pen)) return "Ink on canvas" - else if(istype(painting_implement, /obj/item/soap) || istype(painting_implement, /obj/item/reagent_containers/cup/rag)) + else if(istype(painting_implement, /obj/item/soap) || istype(painting_implement, /obj/item/rag)) return //These are just for cleaning, ignore them else return "Unknown medium" diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 3624d6d4111..858040bb544 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -37,7 +37,7 @@ /obj/item/clothing/suit/caution = 3, /obj/item/storage/bag/trash, /obj/item/reagent_containers/spray/cleaner, - /obj/item/reagent_containers/cup/rag, + /obj/item/rag, /obj/item/grenade/chem_grenade/cleaner = 3, ) crate_name = "janitorial supplies crate" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index d0e813bf46e..8084fc6cf62 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -20,7 +20,7 @@ /datum/job_department/service, ) - family_heirlooms = list(/obj/item/reagent_containers/cup/rag, /obj/item/clothing/head/hats/tophat, /obj/item/reagent_containers/cup/glass/shaker) + family_heirlooms = list(/obj/item/rag, /obj/item/clothing/head/hats/tophat, /obj/item/reagent_containers/cup/glass/shaker) mail_goodies = list( /obj/item/storage/box/rubbershot = 30, diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 35565082bf1..ed0ee16b03f 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -879,7 +879,7 @@ //obj/item/stack/pipe_cleaner_coil/cyborg, //obj/item/chisel, */ - /obj/item/reagent_containers/cup/rag, + /obj/item/rag, //obj/item/storage/bag/money, //This is never used and there's already too much bloat // SKYRAT EDIT END ) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index 4626f684099..f81c60c4b77 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -213,7 +213,7 @@ GLOBAL_VAR_INIT(fax_autoprinting, FALSE) user.visible_message(span_notice("[user] cleans \the [src]."), span_notice("You clean \the [src].")) jammed = FALSE return TRUE - if (istype(item, /obj/item/soap) || istype(item, /obj/item/reagent_containers/cup/rag)) + if (istype(item, /obj/item/soap) || istype(item, /obj/item/rag)) var/cleanspeed = 50 if (istype(item, /obj/item/soap)) var/obj/item/soap/used_soap = item @@ -565,7 +565,7 @@ GLOBAL_VAR_INIT(fax_autoprinting, FALSE) context[SCREENTIP_CONTEXT_LMB] = "Manipulate wires" return CONTEXTUAL_SCREENTIP_SET - if (jammed && is_type_in_list(held_item, list(/obj/item/reagent_containers/spray, /obj/item/soap, /obj/item/reagent_containers/cup/rag))) + if (jammed && is_type_in_list(held_item, list(/obj/item/reagent_containers/spray, /obj/item/soap, /obj/item/rag))) context[SCREENTIP_CONTEXT_LMB] = "Clean output tray" return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 43842d75978..97e7f8b4c78 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -66,6 +66,7 @@ var/list/data = list("viruses"= list(F)) reagents.add_reagent(/datum/reagent/blood, disease_amount, data) add_initial_reagents() + AddElement(/datum/element/reagents_exposed_on_fire) /obj/item/reagent_containers/examine(mob/user) . = ..() @@ -196,10 +197,6 @@ return ..() -/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) - reagents.expose_temperature(exposed_temperature) - ..() - /obj/item/reagent_containers/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum, do_splash = TRUE) . = ..() if(do_splash) @@ -262,10 +259,6 @@ reagents.clear_reagents() -/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver, randomize_pixel_offset) - reagents.expose_temperature(1000) - return ..() | COMPONENT_MICROWAVE_SUCCESS - /// Updates the icon of the container when the reagents change. Eats signal args /obj/item/reagent_containers/proc/on_reagent_change(datum/reagents/holder, ...) SIGNAL_HANDLER diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index b05d9d79c25..d0005ee5a7b 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -24,6 +24,10 @@ ///What sound does our consumption play on consuming from the container? var/consumption_sound = 'sound/items/drink.ogg' +/obj/item/reagent_containers/cup/Initialize(mapload, vol) + . = ..() + AddElement(/datum/element/reagents_item_heatable) + /obj/item/reagent_containers/cup/examine(mob/user) . = ..() if(drink_type) diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index 547de205031..4f1dafcce11 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -116,32 +116,49 @@ mug_glow.alpha = 255 * intensity . += mug_glow -/obj/item/reagent_containers/cup/rag +/obj/item/rag name = "damp rag" desc = "For cleaning up messes, you suppose." w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/toys/toy.dmi' icon_state = "rag" item_flags = NOBLUDGEON - reagent_flags = OPENCONTAINER - amount_per_transfer_from_this = 5 - has_variable_transfer_amount = FALSE - volume = 5 - spillable = FALSE - reagent_container_liquid_sound = null + resistance_flags = FLAMMABLE + /// How bloody is this rag? + var/blood_level = 0 -/obj/item/reagent_containers/cup/rag/Initialize(mapload) +/obj/item/rag/Initialize(mapload) . = ..() - AddComponent(/datum/component/cleaner, 3 SECONDS, pre_clean_callback=CALLBACK(src, PROC_REF(should_clean))) + create_reagents(5, OPENCONTAINER) + AddComponent(/datum/component/cleaner, 3 SECONDS, \ + pre_clean_callback = CALLBACK(src, PROC_REF(should_clean)), \ + on_cleaned_callback = CALLBACK(src, PROC_REF(on_cleaned)), \ + ) + AddElement(/datum/element/reagents_exposed_on_fire) + AddElement(/datum/element/reagents_item_heatable) -/obj/item/reagent_containers/cup/rag/suicide_act(mob/living/user) +/obj/item/rag/pickup(mob/user) + . = ..() + if(prob(5 * blood_level)) + bloody_holder(user) + +/obj/item/rag/proc/bloody_holder(mob/living/holder) + var/obj/item/clothing/gloves/gloves = holder.get_item_by_slot(ITEM_SLOT_GLOVES) + if(gloves) + gloves.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) + holder.update_worn_gloves() + else + holder.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) + +/obj/item/rag/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS -/obj/item/reagent_containers/cup/rag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/rag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!iscarbon(interacting_with) || !reagents?.total_volume) return ..() var/mob/living/carbon/carbon_target = interacting_with + carbon_target.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) var/reagentlist = pretty_string_from_reagent_list(reagents.reagent_list) var/log_object = "containing [reagentlist]" if(!carbon_target.is_mouth_covered()) @@ -155,10 +172,75 @@ log_combat(user, carbon_target, "touched", src, log_object) return ITEM_INTERACT_SUCCESS +/obj/item/rag/wash(clean_types) + . = ..() + if(!(clean_types & CLEAN_TYPE_BLOOD)) + return + blood_level = 0 + update_appearance() + ///Checks whether or not we should clean. -/obj/item/reagent_containers/cup/rag/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) +/obj/item/rag/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner) if(cleaner.combat_mode && ismob(atom_to_clean)) return CLEAN_BLOCKED|CLEAN_DONT_BLOCK_INTERACTION + if(blood_level >= 10) + // snowflakeeeee check to make it a bit more intuitive when cleaning the rag. + if(istype(atom_to_clean, /obj/structure/sink)) + return CLEAN_BLOCKED|CLEAN_DONT_BLOCK_INTERACTION + atom_to_clean.balloon_alert(cleaner, "[name] is too dirty!") + return CLEAN_BLOCKED if(loc == cleaner) return CLEAN_ALLOWED return CLEAN_ALLOWED|CLEAN_NO_XP + +///On cleaning, get the rag dirty +/obj/item/rag/proc/on_cleaned(datum/cleaning_source, atom/clean_target, mob/living/cleaner, was_successful, list/all_cleaned) + if(!was_successful) + return + + var/list/all_blood_dna = list() + for(var/atom/movable/cleaned in all_cleaned) + if(isturf(clean_target) && !HAS_TRAIT(cleaned, TRAIT_MOPABLE)) + continue + // collect dna FIRST + all_blood_dna |= all_cleaned[cleaned] + // THEN pass on dna (though in some cases the cleaned item is being deleted) + if(blood_level > 0 && !QDELING(cleaned)) + cleaned.add_blood_DNA(GET_ATOM_BLOOD_DNA(src)) + // THEN increment blood level + if(length(all_cleaned[cleaned])) + blood_level += get_blood_level_of_movable(cleaned) + // you didn't think you could "clean" a burning person and escape scot-free did you? + var/mob/living/living_cleaned = cleaned + if((cleaned.resistance_flags & ON_FIRE) || (istype(living_cleaned) && living_cleaned.on_fire)) + fire_act(500, 100) + + // FINALLY add the dna to us + add_blood_DNA(all_blood_dna) + update_appearance() + if(blood_level >= 10) + to_chat(cleaner, span_warning("[src] is too dirty to clean anything else! Wash it first!")) + if(prob(10 * blood_level)) + bloody_holder(cleaner) + +/obj/item/rag/proc/get_blood_level_of_movable(atom/movable/what) + if(istype(what, /obj/item/rag)) + var/obj/item/rag/friend_rag = what + return friend_rag.blood_level + if(istype(what, /obj/effect/decal/cleanable)) + var/obj/effect/decal/cleanable/mess = what + return round(mess.bloodiness / 20, 1) + return 1 + +/obj/item/rag/update_appearance(updates) + . = ..() + // v = green and blue color components (reduced as it gets dirtier) + var/v = max(1 - (0.1 * blood_level), 0) + var/list/colormatrix = list( + 1, 0, 0, 0, + 0, v, 0, 0, + 0, 0, v, 0, + 0, 0, 0, 1, + ) + + add_atom_colour(colormatrix, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/unit_tests/damp_rag.dm b/code/modules/unit_tests/damp_rag.dm index 6a3948036af..9a2af270da5 100644 --- a/code/modules/unit_tests/damp_rag.dm +++ b/code/modules/unit_tests/damp_rag.dm @@ -6,7 +6,7 @@ var/mob/living/carbon/human/consistent/attacker = EASY_ALLOCATE() var/mob/living/carbon/human/consistent/victim = EASY_ALLOCATE() var/obj/item/organ/stomach/victim_stomach = victim.get_organ_slot(ORGAN_SLOT_STOMACH) - var/obj/item/reagent_containers/cup/rag/rag = EASY_ALLOCATE() + var/obj/item/rag/rag = EASY_ALLOCATE() attacker.put_in_active_hand(rag, forced = TRUE) attacker.zone_selected = BODY_ZONE_PRECISE_MOUTH diff --git a/code/modules/unit_tests/storage.dm b/code/modules/unit_tests/storage.dm index cadf2261682..2736137981d 100644 --- a/code/modules/unit_tests/storage.dm +++ b/code/modules/unit_tests/storage.dm @@ -30,7 +30,7 @@ bag.atom_storage.max_total_storage = INFINITY var/list/common_noncombat_insertion_items = list( - /obj/item/reagent_containers/cup/rag, + /obj/item/rag, /obj/item/soap, /obj/item/card/emag, /obj/item/detective_scanner, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 8774791164d..675c148fb40 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -415,7 +415,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/storage/dice/hazard = 1, /obj/item/storage/box/beanbag = 1, /obj/item/circuitboard/machine/dish_drive = 1, - /obj/item/reagent_containers/cup/rag = 2, + /obj/item/rag = 2, /obj/item/radio/headset/headset_srv = 2, ) premium = list( @@ -448,7 +448,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/storage/box/mousetraps = 2, /obj/item/circuitboard/machine/dish_drive = 1, - /obj/item/reagent_containers/cup/rag = 2, + /obj/item/rag = 2, /obj/item/radio/headset/headset_srv = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe diff --git a/tgstation.dme b/tgstation.dme index 1e485fa35d4..f4ba5a29b19 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1735,6 +1735,8 @@ #include "code\datums\elements\radiation_protected_clothing.dm" #include "code\datums\elements\radioactive.dm" #include "code\datums\elements\ranged_armour.dm" +#include "code\datums\elements\reagents_heated_on_fire.dm" +#include "code\datums\elements\reagents_item_heatable.dm" #include "code\datums\elements\regal_rat_minion.dm" #include "code\datums\elements\relay_attackers.dm" #include "code\datums\elements\ridable.dm" diff --git a/tools/UpdatePaths/Scripts/90700_rags.txt b/tools/UpdatePaths/Scripts/90700_rags.txt new file mode 100644 index 00000000000..12ae2985e5d --- /dev/null +++ b/tools/UpdatePaths/Scripts/90700_rags.txt @@ -0,0 +1 @@ +/obj/item/reagent_containers/cup/rag : /obj/item/rag{@OLD}