From d1f79a6168628dc1caa75f67638c6826f4c95ebc Mon Sep 17 00:00:00 2001 From: NanakoAC Date: Tue, 2 Aug 2016 19:42:48 +0100 Subject: [PATCH] Janitor slot and janicart tweaks (#612) Adds an extra janitor slot and some mapping work to support it, reworks the janicart a fair bit. changes: rscadd: "Increased number of janitor slots to two." rscadd: "Janitorial carts can now be constructed with metal sheets, and deconstructed with a wrench, welder or plasmacutter if empty." tweak: "Janicarts now come without a bucket. Click and drag a mop bucket onto a cart to mount it, and you can unmount it from the janicart interface." tweak: "Placing a mop into a janicart, and pouring containers into the bucket, is now done with alt-click. A leftclick will now always wet the mop, and throw objects into the trashbag, respectively." rscadd: "Janicarts can now be climbed over like tables - Click and drag your sprite onto it." tweak: "Custodial closet's Spraycleaner, cleaning grenades, and spare lights, are now inside the janitorial locker instead of on table/floor." tweak: "Added an extra janitorial locker in the custodial closet." bugfix: "Fixed the Captain's deluxe soap being unuseable for cleaning" tweak: "Soap can now clean more tiles when wetted" tweak: "Soap and rags can now be wetted in buckets, mopbuckets, watertanks and janicarts" --- code/defines/obj/weapon.dm | 1 + code/game/jobs/job/civilian.dm | 4 +- .../game/objects/items/weapons/clown_items.dm | 23 ++- .../objects/items/weapons/storage/storage.dm | 10 + code/game/objects/objs.dm | 12 ++ .../crates_lockers/closets/job_closets.dm | 7 +- code/game/objects/structures/janicart.dm | 175 +++++++++++++++--- code/modules/detectivework/tools/rag.dm | 3 +- code/modules/materials/material_recipes.dm | 1 + html/changelogs/Nanako-Janicart.yml | 45 +++++ icons/obj/janitor.dmi | Bin 11086 -> 11069 bytes maps/exodus-1.dmm | 13 +- nano/templates/janitorcart.tmpl | 5 + 13 files changed, 254 insertions(+), 45 deletions(-) create mode 100644 html/changelogs/Nanako-Janicart.yml diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index e92a003a190..d5abf7d9cfb 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -43,6 +43,7 @@ icon_state = "soapdeluxe" /obj/item/weapon/soap/deluxe/New() + ..() desc = "A deluxe Waffle Co. brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]." /obj/item/weapon/soap/syndie diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index dc90cb0b929..362a801cfba 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -184,8 +184,8 @@ department = "Civilian" department_flag = CIVILIAN faction = "Station" - total_positions = 1 - spawn_positions = 1 + total_positions = 2 + spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#dddddd" access = list(access_janitor, access_maint_tunnels, access_engine, access_research, access_sec_doors, access_medical) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index c0847d282df..f8bf29dc6b7 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -17,11 +17,12 @@ */ /obj/item/weapon/soap/New() ..() - create_reagents(5) + create_reagents(10) wet() - + /obj/item/weapon/soap/proc/wet() - reagents.add_reagent("cleaner", 5) + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + reagents.add_reagent("cleaner", 10) /obj/item/weapon/soap/Crossed(AM as mob|obj) if (istype(AM, /mob/living)) @@ -38,12 +39,20 @@ user << "You scrub \the [target.name] out." qdel(target) else if(istype(target,/turf)) - user << "You scrub \the [target.name] clean." - var/turf/T = target - T.clean(src, user) - else if(istype(target,/obj/structure/sink)) + user << "You start scrubbing the [target.name]" + if (do_after(user, 30, needhand = 0)) + 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)) 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) + user << "You wet \the [src] in the [target]." + wet() + else + user << "\The [target] is empty!" else user << "You clean \the [target.name]." target.clean_blood() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 292e1726af0..ed54bc42225 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -458,6 +458,16 @@ max_w_class = max(I.w_class, max_w_class) max_storage_space += I.get_storage_cost() +//Useful for spilling the contents of containers all over the floor +/obj/item/weapon/storage/proc/spill() + if (istype(loc, /turf))//If its not on the floor this might cause issues + var/turf/T = get_turf(src) + for (var/obj/O in contents) + contents.Remove(O) + O.forceMove(T) + O.tumble(2) + + //Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). //Returns -1 if the atom was not found on container. /atom/proc/storage_depth(atom/container) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4eb799233d8..6d51c6de78c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -155,3 +155,15 @@ tesla_zap(src, 5, power_bounced) spawn(10) being_shocked = 0 + + +//To be called from things that spill objects on the floor. +//Makes an object move around randomly for a couple of tiles +/obj/proc/tumble(var/dist) + if (dist >= 1) + spawn() + dist += rand(0,1) + for(var/i = 1, i <= dist, i++) + if(src) + step(src, pick(NORTH,SOUTH,EAST,WEST)) + sleep(rand(2,4)) 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 e8d70f8eeb7..535da4cec68 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -78,7 +78,12 @@ new /obj/item/weapon/storage/bag/trash(src) new /obj/item/clothing/shoes/galoshes(src) new /obj/item/weapon/storage/belt/janitor(src) - + new /obj/item/weapon/storage/box/lights/mixed(src) + new /obj/item/weapon/grenade/chem_grenade/cleaner(src) + new /obj/item/weapon/grenade/chem_grenade/cleaner(src) + new /obj/item/weapon/grenade/chem_grenade/cleaner(src) + new /obj/item/weapon/reagent_containers/spray/cleaner(src) + /* * Lawyer */ diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 36f65251a52..8a1b0985aed 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -5,6 +5,7 @@ icon_state = "cart" anchored = 0 density = 1 + climbable = 1 flags = OPENCONTAINER //copypaste sorry var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite @@ -12,74 +13,179 @@ var/obj/item/weapon/mop/mymop = null var/obj/item/weapon/reagent_containers/spray/myspray = null var/obj/item/device/lightreplacer/myreplacer = null + var/obj/structure/mopbucket/mybucket = null var/signs = 0 //maximum capacity hardcoded below + var/has_items = 0//This is set true whenever the cart has anything loaded/mounted on it + var/dismantled = 0//This is set true after the object has been dismantled to avoid an infintie loop -/obj/structure/janitorialcart/New() - create_reagents(100) +///obj/structure/janitorialcart/New() /obj/structure/janitorialcart/examine(mob/user) if(..(user, 1)) - user << "[src] \icon[src] contains [reagents.total_volume] unit\s of liquid!" + if (mybucket) + user << "[src] \icon The bucket contains [mybucket.reagents.total_volume] unit\s of liquid!" + else + user << "[src] \icon There is no bucket mounted on it!" //everything else is visible, so doesn't need to be mentioned -/obj/structure/janitorialcart/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/storage/bag/trash) && !mybag) - user.drop_item() - mybag = I - I.loc = src +/obj/structure/janitorialcart/MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob) + if (istype(O, /obj/structure/mopbucket) && !mybucket) + O.loc = src + mybucket = O + user << "You mount the [O] on the janicart." update_icon() - updateUsrDialog() - user << "You put [I] into [src]." + else + ..() - else if(istype(I, /obj/item/weapon/mop)) - if(I.reagents.total_volume < I.reagents.maximum_volume) //if it's not completely soaked we assume they want to wet it, otherwise store it - if(reagents.total_volume < 1) - user << "[src] is out of water!" - else - reagents.trans_to_obj(I, 5) // - user << "You wet [I] in [src]." - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - return +//New Altclick functionality! +//Altclick the cart with a mop to stow the mop away +//Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash +/obj/structure/janitorialcart/AltClick() + var/obj/I = usr.get_active_hand() + if(istype(I, /obj/item/weapon/mop)) if(!mymop) - user.drop_item() + usr.drop_item() mymop = I - I.loc = src + I.forceMove(src) update_icon() updateUsrDialog() - user << "You put [I] into [src]." + usr << "You put [I] into [src]." + else + usr << "The cart already has a mop attached" + return + else if(istype(I, /obj/item/weapon/reagent_containers) && mybucket) + var/obj/item/weapon/reagent_containers/C = I + C.afterattack(mybucket, usr, 1) + +/obj/structure/janitorialcart/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/reagent_containers/glass/rag) || istype(I, /obj/item/weapon/soap)) + if (mybucket) + if(I.reagents.total_volume < I.reagents.maximum_volume) + if(mybucket.reagents.total_volume < 1) + user << "[mybucket] is empty!" + else + mybucket.reagents.trans_to_obj(I, 5) // + user << "You wet [I] in [mybucket]." + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + else + user << "[I] can't absorb anymore liquid!" + else + user << "There is no bucket mounted here to dip [I] into!" + return 1 else if(istype(I, /obj/item/weapon/reagent_containers/spray) && !myspray) user.drop_item() myspray = I - I.loc = src + I.forceMove(src) update_icon() updateUsrDialog() user << "You put [I] into [src]." + return 1 else if(istype(I, /obj/item/device/lightreplacer) && !myreplacer) user.drop_item() myreplacer = I - I.loc = src + I.forceMove(src) update_icon() updateUsrDialog() user << "You put [I] into [src]." + return 1 + + else if(istype(I, /obj/item/weapon/storage/bag/trash) && !mybag) + user.drop_item() + mybag = I + I.forceMove(src) + update_icon() + updateUsrDialog() + user << "You put [I] into [src]." + return 1 else if(istype(I, /obj/item/weapon/caution)) if(signs < 4) user.drop_item() - I.loc = src + I.forceMove(src) signs++ update_icon() updateUsrDialog() user << "You put [I] into [src]." else user << "[src] can't hold any more signs." + return 1 else if(mybag) - mybag.attackby(I, user) + return mybag.attackby(I, user) + //This return will prevent afterattack from executing if the object goes into the trashbag, + //This prevents dumb stuff like splashing the cart with the contents of a container, after putting said container into trash + + else if (!has_items && (istype(I, /obj/item/weapon/wrench) || istype(I, /obj/item/weapon/weldingtool) || istype(I, /obj/item/weapon/pickaxe/plasmacutter))) + dismantle(user) + return + ..() + +/obj/structure/janitorialcart/proc/dismantle(var/mob/user = null) + if (!dismantled) + if (has_items) + spill() + + if (user) + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message("[user] starts taking apart the [src]", "You start disasembling the [src]") + if (!do_after(user, 30, needhand = 0)) + return + + new /obj/item/stack/material/steel(src.loc, 15) + dismantled = 1 + qdel(src) + +/obj/structure/janitorialcart/ex_act(severity) + spill(100 / severity) + ..() + +//This is called if the cart is caught in an explosion, or destroyed by weapon fire +/obj/structure/janitorialcart/proc/spill(var/chance = 100) + var/turf/dropspot = get_turf(src) + if (mymop && prob(chance)) + mymop.forceMove(dropspot) + mymop.tumble(2) + mymop = null + + if (myspray && prob(chance)) + myspray.forceMove(dropspot) + myspray.tumble(3) + myspray = null + + if (myreplacer && prob(chance)) + myreplacer.forceMove(dropspot) + myreplacer.tumble(3) + myreplacer = null + + if (mybucket && prob(chance*0.5))//bucket is heavier, harder to knock off + mybucket.forceMove(dropspot) + mybucket.tumble(1) + mybucket = null + + if (signs) + for (var/obj/item/weapon/caution/Sign in src) + if (prob(min((chance*2),100))) + signs-- + Sign.forceMove(dropspot) + Sign.tumble(3) + if (signs < 0)//safety for something that shouldn't happen + signs = 0 + update_icon() + return + + if (mybag && prob(min((chance*2),100)))//Bag is flimsy + mybag.forceMove(dropspot) + mybag.tumble(1) + mybag.spill()//trashbag spills its contents too + mybag = null + + update_icon() + /obj/structure/janitorialcart/attack_hand(mob/user) @@ -90,6 +196,7 @@ var/data[0] data["name"] = capitalize(name) data["bag"] = mybag ? capitalize(mybag.name) : null + data["bucket"] = mybucket ? capitalize(mybucket.name) : null data["mop"] = mymop ? capitalize(mymop.name) : null data["spray"] = myspray ? capitalize(myspray.name) : null data["replacer"] = myreplacer ? capitalize(myreplacer.name) : null @@ -107,7 +214,7 @@ if(!isliving(usr)) return var/mob/living/user = usr - + if(href_list["take"]) switch(href_list["take"]) if("garbage") @@ -140,6 +247,11 @@ else warning("[src] signs ([signs]) didn't match contents") signs = 0 + if("bucket") + if(mybucket) + mybucket.forceMove(get_turf(user)) + user << "You unmount [mybucket] from [src]." + mybucket = null update_icon() updateUsrDialog() @@ -147,16 +259,25 @@ /obj/structure/janitorialcart/update_icon() overlays = null + has_items = 0 + if(mybucket) + overlays += "cart_bucket" + has_items = 1 if(mybag) overlays += "cart_garbage" + has_items = 1 if(mymop) overlays += "cart_mop" + has_items = 1 if(myspray) overlays += "cart_spray" + has_items = 1 if(myreplacer) overlays += "cart_replacer" + has_items = 1 if(signs) overlays += "cart_sign[signs]" + has_items = 1 //old style retardo-cart diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 816a228a9c5..872140bdd6f 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -132,12 +132,13 @@ if(!proximity) return - if(istype(A, /obj/structure/reagent_dispensers)) + 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()) user << "\The [src] is already soaked." 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_name() return diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 3ef43422ea3..6a2e364cc31 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -42,6 +42,7 @@ )) recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1) + recipes += new/datum/stack_recipe("custodial cart", /obj/structure/janitorialcart, 15, time = 120, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1) diff --git a/html/changelogs/Nanako-Janicart.yml b/html/changelogs/Nanako-Janicart.yml new file mode 100644 index 00000000000..dc07363807f --- /dev/null +++ b/html/changelogs/Nanako-Janicart.yml @@ -0,0 +1,45 @@ +################################ +# 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 +################################# + +# Your name. +author: Nanako + +# 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: + - rscadd: "Increased number of janitor slots to two." + - rscadd: "Janitorial carts can now be constructed with metal sheets, and deconstructed with a wrench, welder or plasmacutter if empty." + - tweak: "Janicarts now come without a bucket. Click and drag a mop bucket onto a cart to mount it, and you can unmount it from the janicart interface." + - tweak: "Placing a mop into a janicart, and pouring containers into the bucket, is now done with alt-click. A leftclick will now always wet the mop, and throw objects into the trashbag, respectively." + - rscadd: "Janicarts can now be climbed over like tables - Click and drag your sprite onto it." + - tweak: "Custodial closet's Spraycleaner, cleaning grenades, and spare lights, are now inside the janitorial locker instead of on table/floor." + - tweak: "Added an extra janitorial locker in the custodial closet." + - bugfix: "Fixed the Captain's deluxe soap being unuseable for cleaning" + - tweak: "Soap can now clean more tiles when wetted" + - tweak: "Soap and rags can now be wetted in buckets, mopbuckets, watertanks and janicarts" diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index b1ffa87dea436959c2235a7537d4979c51f39b98..de85d22dd105c5cb286ab5b45dc285a55d59a6b9 100644 GIT binary patch literal 11069 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 SHA4HLEd&VTl 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 o=R)FZ7(`FZ&-4FtD1)zX$+D2b(OW$*tWFkClvR {{/if}} + {{if data.bucket}} +

+ {{:helper.link(data.bucket, '', { 'take' : 'bucket' })}} +
+ {{/if}} \ No newline at end of file