diff --git a/aurorastation.dme b/aurorastation.dme index b6aa3c4d96d..dbdfd1fb4f3 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -833,7 +833,6 @@ #include "code\game\objects\items\weapons\cards_ids_syndicate.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\cloaking_device.dm" -#include "code\game\objects\items\weapons\clown_items.dm" #include "code\game\objects\items\weapons\cosmetics.dm" #include "code\game\objects\items\weapons\dice.dm" #include "code\game\objects\items\weapons\dna_injector.dm" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 44c3dd553c1..7d95f8bbddd 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -37,6 +37,15 @@ attack_verb = list("HONKED") var/spam_flag = 0 +/obj/item/weapon/bikehorn/attack_self(mob/user as mob) + if (spam_flag == 0) + spam_flag = 1 + playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) + src.add_fingerprint(user) + spawn(20) + spam_flag = 0 + return + /obj/item/weapon/cane name = "cane" desc = "A cane used by a true gentlemen. Or a clown." diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm deleted file mode 100644 index 682d0104dac..00000000000 --- a/code/game/objects/items/weapons/clown_items.dm +++ /dev/null @@ -1,94 +0,0 @@ -/* Clown Items - * Contains: - * Banana Peels - * Soap - * Bike Horns - */ - -/* - * Banana Peals - */ -/obj/item/weapon/bananapeel/Crossed(AM as mob|obj) - if (istype(AM, /mob/living)) - var/mob/living/M = AM - M.slip("the [src.name]",4) -/* - * Soap - */ -/obj/item/weapon/soap/New() - ..() - create_reagents(10) - wet() - -/obj/item/weapon/soap/proc/wet() - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - reagents.add_reagent("cleaner", 10) - -/obj/item/weapon/soap/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/key)) - if(!key_data) - to_chat(user, "You imprint \the [I] into \the [src].") - var/obj/item/weapon/key/K = I - key_data = K.key_data - update_icon() - return - ..() - -/obj/item/weapon/soap/update_icon() - overlays.Cut() - if(key_data) - overlays += image('icons/obj/items.dmi', icon_state = "soap_key_overlay") - -/obj/item/weapon/soap/Crossed(AM as mob|obj) - if (istype(AM, /mob/living)) - var/mob/living/M = AM - M.slip("the [src.name]",3) - -/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity) - if(!proximity) return - //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. - //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn - if(user.client && (target in user.client.screen)) - to_chat(user, "You need to take that [target.name] off before cleaning it.") - else if(istype(target,/obj/effect/decal/cleanable)) - to_chat(user, "You scrub \the [target.name] out.") - qdel(target) - else if(istype(target,/turf)) - to_chat(user, "You start scrubbing the [target.name]") - if (do_after(user, 30, needhand = 0)) - to_chat(user, "You scrub \the [target.name] clean.") - var/turf/T = target - T.clean(src, user) - else if(istype(target,/obj/structure/sink) || istype(target,/obj/structure/sink)) - to_chat(user, "You wet \the [src] in the sink.") - wet() - else if (istype(target, /obj/structure/mopbucket) || istype(target, /obj/item/weapon/reagent_containers/glass) || istype(target, /obj/structure/reagent_dispensers/watertank)) - if (target.reagents && target.reagents.total_volume) - to_chat(user, "You wet \the [src] in the [target].") - wet() - else - to_chat(user, "\The [target] is empty!") - else - to_chat(user, "You clean \the [target.name].") - target.clean_blood() - return - -//attack_as_weapon -/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone) - if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" ) - user.visible_message("\The [user] washes \the [target]'s mouth out with soap!") - user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam - return - ..() - -/* - * Bike Horns - */ -/obj/item/weapon/bikehorn/attack_self(mob/user as mob) - if (spam_flag == 0) - spam_flag = 1 - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - src.add_fingerprint(user) - spawn(20) - spam_flag = 0 - return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 603602ce272..de98ea48d4e 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -6,15 +6,16 @@ item_state = "mop" force = 3.0 throwforce = 10.0 - throw_speed = 5 - throw_range = 10 + throw_speed = 3 + throw_range = 7 w_class = 3.0 attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") var/mopping = 0 var/mopcount = 0 + var/cleantime = 25 -/obj/item/weapon/mop/New() - ..() +/obj/item/weapon/mop/Initialize() + . = ..() create_reagents(30) janitorial_supplies |= src @@ -23,21 +24,21 @@ return ..() /obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity) - update_icon() if(!proximity) return if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune)) if(reagents.total_volume < 1) to_chat(user, "Your mop is dry!") return - user.visible_message("[user] begins to clean \the [get_turf(A)].") + user.visible_message("[user] begins to mop \the [get_turf(A)].") playsound(loc, 'sound/effects/mop.ogg', 25, 1) - if(do_after(user, 40)) + if(do_after(user, cleantime)) var/turf/T = get_turf(A) if(T) T.clean(src, user) to_chat(user, "You have finished mopping!") + update_icon() /obj/effect/attackby(obj/item/I, mob/user) @@ -47,11 +48,52 @@ /obj/item/weapon/mop/update_icon() if(reagents.total_volume < 1) - icon_state = "mop" - item_state = "mop" + icon_state = "[initial(icon_state)]" + item_state = icon_state if(reagents.total_volume > 1) - icon_state = "mop_wet" - item_state = "mop_wet" + icon_state = "[initial(icon_state)]_wet" + item_state = icon_state /obj/item/weapon/mop/on_reagent_change() update_icon() + +/obj/item/weapon/mop/advanced + name = "advanced mop" + desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this!" + icon = 'icons/obj/janitor.dmi' + icon_state = "advmop" + item_state = "advmop" + force = 6.0 + throwforce = 14 + throw_range = 8 + cleantime = 15 + var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water. + var/refill_rate = 0.5 //Rate per process() tick mop refills itself + var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING + +/obj/item/weapon/mop/advanced/New() + ..() + START_PROCESSING(SSprocessing, src) + +/obj/item/weapon/mop/advanced/attack_self(mob/user) + refill_enabled = !refill_enabled + if(refill_enabled) + START_PROCESSING(SSprocessing, src) + else + STOP_PROCESSING(SSprocessing,src) + to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.") + playsound(user, 'sound/machines/click.ogg', 25, 1) + +/obj/item/weapon/mop/advanced/process() + if(reagents.total_volume < 30) + reagents.add_reagent(refill_reagent, refill_rate) + +/obj/item/weapon/mop/advanced/examine(mob/user) + ..() + to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + +/obj/item/weapon/mop/advanced/Destroy() + if(refill_enabled) + STOP_PROCESSING(SSprocessing, src) + return ..() + diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 60ea7d0944b..e8f2b76fc73 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -6,6 +6,7 @@ gender = PLURAL icon = 'icons/obj/soap.dmi' icon_state = "soap" + item_state = "soap" w_class = 2.0 throwforce = 0 throw_speed = 4 @@ -14,15 +15,81 @@ var/key_data drop_sound = 'sound/misc/slip.ogg' +/obj/item/weapon/soap/New() + ..() + create_reagents(10) + wet() + +/obj/item/weapon/soap/proc/wet() + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + reagents.add_reagent("cleaner", 10) + +/obj/item/weapon/soap/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/key)) + if(!key_data) + to_chat(user, "You imprint \the [I] into \the [src].") + var/obj/item/weapon/key/K = I + key_data = K.key_data + update_icon() + return + ..() + +/obj/item/weapon/soap/update_icon() + overlays.Cut() + if(key_data) + overlays += image('icons/obj/items.dmi', icon_state = "soap_key_overlay") + +/obj/item/weapon/soap/Crossed(AM as mob|obj) + if (istype(AM, /mob/living)) + var/mob/living/M = AM + M.slip("the [src.name]",3) + +/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity) + if(!proximity) return + //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. + //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn + if(user.client && (target in user.client.screen)) + to_chat(user, "You need to take that [target.name] off before cleaning it.") + else if(istype(target,/obj/structure/sink) || istype(target,/obj/structure/sink)) + to_chat(user, "You wet \the [src] in the sink.") + wet() + else if (istype(target, /obj/structure/mopbucket) || istype(target, /obj/item/weapon/reagent_containers/glass) || istype(target, /obj/structure/reagent_dispensers/watertank)) + if (target.reagents && target.reagents.total_volume) + to_chat(user, "You wet \the [src] in the [target].") + wet() + else + to_chat(user, "\The [target] is empty!") + else + to_chat(user, "You start scrubbing the [target.name]") + playsound(loc, 'sound/effects/mop.ogg', 25, 1) + if (do_after(user, 25, needhand = 0)) + target.clean_blood() + to_chat(user, "You scrub \the [target.name] out.") + if(istype(target, /turf) || istype(target, /obj/effect/decal/cleanable) || istype(target, /obj/effect/overlay)) + var/turf/T = get_turf(target) + if(T) + T.clean(src, user) + return + +//attack_as_weapon +/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone) + if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" ) + user.visible_message("\The [user] washes \the [target]'s mouth out with soap!") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam + return + ..() + /obj/item/weapon/soap/nanotrasen desc = "A NanoTrasen-brand bar of soap. Smells of phoron." icon_state = "soapnt" + item_state = "soapnt" /obj/item/weapon/soap/plant desc = "A green bar of soap. Smells like dirt and plants." /obj/item/weapon/soap/deluxe icon_state = "soapdeluxe" + item_state = "soapdeluxe" /obj/item/weapon/soap/deluxe/Initialize() @@ -32,6 +99,7 @@ /obj/item/weapon/soap/syndie desc = "An untrustworthy bar of soap. Smells of fear." icon_state = "soapsyndie" + item_state = "soapsyndie" /obj/item/weapon/soap/space_soap name = "Soap" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index e78e1c6a134..bed93031068 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -78,6 +78,21 @@ return 1 ..() +/obj/item/weapon/storage/bag/trash/bluespace + name = "bluespace trash bag" + desc = "A highly advanced trashbag with a huge storage capacity!" + icon_state = "trashbagb0" + + max_storage_space = 128 + +/obj/item/weapon/storage/bag/trash/bluespace/update_icon() + if(contents.len == 0) + icon_state = "trashbagb0" + else if(contents.len < 42) + icon_state = "trashbagb1" + else if(contents.len < 84) + icon_state = "trashbagb2" + else icon_state = "trashbagb3" // ----------------------------- // Plastic Bag diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 0681e9a5da8..b9619fcf5f2 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -233,15 +233,20 @@ w_class = 3 max_w_class = 3 can_hold = list( - /obj/item/weapon/grenade/chem_grenade, //if I'm going to be doing a full allowance on one belt, I need to do the other. - /obj/item/device/lightreplacer, - /obj/item/device/flashlight, - /obj/item/weapon/reagent_containers/spray, - /obj/item/weapon/soap, - /obj/item/weapon/storage/bag/trash, + /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/wrench, - /obj/item/weapon/crowbar + /obj/item/device/flashlight, + /obj/item/weapon/extinguisher/mini, + /obj/item/device/radio, + /obj/item/clothing/gloves, + /obj/item/clothing/glasses/material, + /obj/item/weapon/reagent_containers/spray, + /obj/item/weapon/grenade/chem_grenade, //if I'm going to be doing a full allowance on one belt, I need to do the other. + /obj/item/device/lightreplacer, + /obj/item/weapon/soap, + /obj/item/weapon/storage/bag/trash, + /obj/item/weapon/reagent_containers/glass/rag ) /obj/item/weapon/storage/belt/wands @@ -273,7 +278,8 @@ storage_slots = 9 w_class = 4 max_w_class = 4 //Pickaxes are big. - can_hold = list(/obj/item/weapon/crowbar, + can_hold = list( + /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, 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 f5b21a1baac..0c9db7dca3d 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -86,6 +86,7 @@ new /obj/item/weapon/reagent_containers/spray/cleaner(src) new /obj/item/weapon/reagent_containers/glass/rag(src) new /obj/item/weapon/soap/nanotrasen(src) + new /obj/item/weapon/reagent_containers/glass/rag/advanced(src) /* * Lawyer diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 6d17adfbc62..e5d24084f24 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -271,6 +271,7 @@ if(mybucket) mybucket.forceMove(get_turf(user)) to_chat(user, "You unmount [mybucket] from [src].") + mybucket.update_icon() mybucket = null update_icon() diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 243fb503aae..8f8cbd5bf79 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -7,11 +7,11 @@ w_class = 3 flags = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite + var/bucketsize = 360 //about 3x the size relative to a regular bucket. - -/obj/structure/mopbucket/New() - ..() - create_reagents(100) +/obj/structure/mopbucket/Initialize() + . = ..() + create_reagents(bucketsize) janitorial_supplies |= src /obj/structure/mobbucket/Destroy() diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 8c0d2814b02..d7aa643cb1f 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -17,7 +17,7 @@ name = "rag" desc = "For cleaning up messes, you suppose." w_class = 1 - icon = 'icons/obj/toy.dmi' + icon = 'icons/obj/janitor.dmi' icon_state = "rag" amount_per_transfer_from_this = 5 possible_transfer_amounts = list(5) @@ -28,11 +28,13 @@ var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes + var/cleantime = 30 drop_sound = 'sound/items/drop/clothing.ogg' /obj/item/weapon/reagent_containers/glass/rag/Initialize() . = ..() update_name() + update_icon() /obj/item/weapon/reagent_containers/glass/rag/Destroy() STOP_PROCESSING(SSprocessing, src) //so we don't continue turning to ash while gc'd @@ -58,6 +60,7 @@ . = ..() update_name() + update_icon() /obj/item/weapon/reagent_containers/glass/rag/proc/update_name() if(on_fire) @@ -69,14 +72,20 @@ /obj/item/weapon/reagent_containers/glass/rag/update_icon() if(on_fire) - icon_state = "raglit" + icon_state = "[initial(icon_state)]_lit" + else if(reagents.total_volume) + icon_state = "[initial(icon_state)]_wet" else - icon_state = "rag" + icon_state = "[initial(icon_state)]" var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = loc if(istype(B)) B.update_icon() +/obj/item/weapon/reagent_containers/glass/rag/on_reagent_change() + update_name() + update_icon() + /obj/item/weapon/reagent_containers/glass/rag/proc/remove_contents(mob/user, atom/trans_dest = null) if(!trans_dest && !user.loc) return @@ -92,15 +101,18 @@ reagents.splash(user.loc, reagents.total_volume) user.visible_message("\The [user] wrings out [src] over [target_text].", "You finish to wringing out [src].") update_name() + update_icon() /obj/item/weapon/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user) if(!reagents.total_volume) to_chat(user, "The [initial(name)] is dry!") else user.visible_message("\The [user] starts to wipe down [A] with [src]!") + playsound(loc, 'sound/effects/mop.ogg', 25, 1) reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. update_name() - if(do_after(user,30)) + update_icon() + if(do_after(user,cleantime)) user.visible_message("\The [user] finishes wiping off \the [A]!") A.clean_blood() @@ -153,6 +165,7 @@ //^HA HA HA reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BREATHE) update_name() + update_icon() else wipe_down(target, user) return @@ -172,6 +185,7 @@ playsound(loc, 'sound/effects/slosh.ogg', 25, 1) user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].") update_name() + update_icon() return if(!on_fire && istype(A) && (src in user)) @@ -250,4 +264,17 @@ reagents.remove_reagent("fuel", reagents.maximum_volume/25) update_name() + update_icon() burn_time-- + +/obj/item/weapon/reagent_containers/glass/rag/advanced + name = "microfiber cloth" + desc = "A synthetic fiber cloth; the split fibers and the size of the individual filaments make it more effective for cleaning purposes." + w_class = 1 + icon = 'icons/obj/janitor.dmi' + icon_state = "advrag" + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5) + volume = 10 + cleantime = 15 + diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index f3c64dbf0cb..8613ecac61a 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -60,3 +60,8 @@ throwforce = 0 throw_speed = 4 throw_range = 20 + +/obj/item/weapon/bananapeel/Crossed(AM as mob|obj) + if (istype(AM, /mob/living)) + var/mob/living/M = AM + M.slip("the [src.name]",4) diff --git a/code/modules/reagents/reagent_containers/tooth_paste.dm b/code/modules/reagents/reagent_containers/tooth_paste.dm index 3d109229066..f02b427840d 100644 --- a/code/modules/reagents/reagent_containers/tooth_paste.dm +++ b/code/modules/reagents/reagent_containers/tooth_paste.dm @@ -45,20 +45,80 @@ add_overlay("toothpaste_overlay") /obj/item/weapon/reagent_containers/toothbrush/attack_self(mob/user as mob) + if(!reagents.total_volume) + to_chat(user, "The [initial(name)] is dry!") + else + playsound(loc, 'sound/effects/toothbrush.ogg', 15, 1) + if(do_after(user, 30)) + user.visible_message( + "\The [user] brushes [user.get_pronoun(1)] teeth with \the [src]", + "You brush your teeth with \the [src].") + reagents.trans_to_mob(user, amount_per_transfer_from_this, CHEM_BREATHE) + update_icon() return -/obj/item/weapon/reagent_containers/toothbrush/self_feed_message(var/mob/user) - user.visible_message("\The [user] brushes [user.get_pronoun(1)] teeth with \the [src]","You brush your teeth with \the [src]") - -/obj/item/weapon/reagent_containers/toothbrush/other_feed_message_start(var/mob/user, var/mob/target) - user.visible_message("[user] is trying to brush \the [target]'s teeth \the [src]!") - -/obj/item/weapon/reagent_containers/toothbrush/other_feed_message_finish(var/mob/user, var/mob/target) - user.visible_message("[user] has brushed \the [target]'s teeth with \the [src]!") - /obj/item/weapon/reagent_containers/toothbrush/feed_sound(var/mob/user) return +/obj/item/weapon/reagent_containers/toothbrush/proc/remove_contents(mob/user, atom/trans_dest = null) + if(!trans_dest && !user.loc) + return + +/obj/item/weapon/reagent_containers/toothbrush/attack(atom/target as obj|turf|area, mob/user as mob , flag) + if(isliving(target)) + var/mob/living/M = target + if(ishuman(M)) + if(!reagents.total_volume) + to_chat(user, "The [initial(name)] is dry!") + else if(reagents.total_volume) + if(user.zone_sel.selecting == "mouth" && !(M.wear_mask && M.wear_mask.item_flags & AIRTIGHT)) + user.do_attack_animation(src) + user.visible_message("[user] is trying to brush \the [target]'s teeth \the [src]!") + playsound(loc, 'sound/effects/toothbrush.ogg', 15, 1) + if(do_after(user, 30)) + user.visible_message("[user] has brushed \the [target]'s teeth with \the [src]!") + + reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BREATHE) + update_icon() + else + wipe_down(target, user) + return + + return ..() + +/obj/item/weapon/reagent_containers/toothbrush/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity) + if(!proximity) + return + + if(istype(A, /obj/structure/reagent_dispensers) || istype(A, /obj/structure/mopbucket) || istype(A, /obj/item/weapon/reagent_containers/glass)) + if(!reagents.get_free_space()) + return + + if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume)) + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].") + update_icon() + return + + if(istype(A) && (src in user)) + if(A.is_open_container() && !(A in user)) + remove_contents(user, A) + else if(!ismob(A)) //mobs are handled in attack() + wipe_down(A, user) + return + +/obj/item/weapon/reagent_containers/toothbrush/proc/wipe_down(atom/A, mob/user) + if(!reagents.total_volume) + to_chat(user, "The [initial(name)] is dry!") + else + user.visible_message("\The [user] starts to brush down [A] with [src]!") + playsound(loc, 'sound/effects/mop.ogg', 25, 1) + update_icon() + if(do_after(user, 120)) + user.visible_message("\The [user] finishes brushing off \the [A]!") + reagents.splash(A, 5) + A.clean_blood() + /obj/item/weapon/reagent_containers/toothbrush/green icon_state = "toothbrush_g" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ddb53593c69..b3de47de145 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -170,6 +170,24 @@ other types of metals and chemistry for reagents). build_path =/obj/item/device/lightreplacer/advanced sort_string = "VAAAH" +/datum/design/advmop + name = "Advanced Mop" + desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this!" + id = "advmop" + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 2500, "glass" = 200) + build_path = /obj/item/weapon/mop/advanced + sort_string = "VAAAI" + +/datum/design/blutrash + name = "Trashbag of Holding" + desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." + id = "blutrash" + build_type = PROTOLATHE + materials = list("gold" = 1500, "uranium" = 250, "phoron" = 1500) + build_path = /obj/item/weapon/storage/bag/trash/bluespace + sort_string = "VAAAJ" + /datum/design/item/experimental_welder name = "Experimental Welding Tool" desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply" @@ -448,4 +466,4 @@ other types of metals and chemistry for reagents). req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 5) materials = list(DEFAULT_WALL_MATERIAL = 320, "glass" = 800) build_path = /obj/item/weapon/implanter - sort_string = "VCBAC" \ No newline at end of file + sort_string = "VCBAC" diff --git a/html/changelogs/janitor_stuff-wezzy.yml b/html/changelogs/janitor_stuff-wezzy.yml new file mode 100644 index 00000000000..75193ed163b --- /dev/null +++ b/html/changelogs/janitor_stuff-wezzy.yml @@ -0,0 +1,46 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: Wowzewow + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Increases the size of the mop bucket by 3x, and makes mop mop faster, like, 1.5x faster." + - tweak: "Buffs the janibelt ( You can finally put gloves, rags and radios in them! )" + - imageadd: "Cooler rag sprites, and some tweaks to other sprites." + - rscadd: "New bluespace trashbag and advanced mop, available in the protolathe." + - rscadd: "Adds special janitor rags to their lockers." + diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index a35d8485d8a..7029efba7c2 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 84f62d919d8..537aaca71bc 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 0347ab765af..84c6a552aaa 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 33fc8a63520..bcb7d5bb99a 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index b2a597b7eeb..9ef15a77114 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/sound/effects/mop.ogg b/sound/effects/mop.ogg index c4abbe69819..fc81358e795 100644 Binary files a/sound/effects/mop.ogg and b/sound/effects/mop.ogg differ diff --git a/sound/effects/toothbrush.ogg b/sound/effects/toothbrush.ogg new file mode 100644 index 00000000000..9d832bf0d12 Binary files /dev/null and b/sound/effects/toothbrush.ogg differ