diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 19710a89fe..175f3d45ab 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -114,8 +114,9 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define TRANSITIONEDGE 7 //Distance from edge to move to another z-level -#define BE_CLOSE 1 //in the case of a silicon, to select if they need to be next to the atom -#define NO_DEXTERY 1 //if other mobs (monkeys, aliens, etc) can use this +#define BE_CLOSE TRUE //in the case of a silicon, to select if they need to be next to the atom +#define NO_DEXTERY TRUE //if other mobs (monkeys, aliens, etc) can use this +#define NO_TK TRUE //used by canUseTopic() //singularity defines diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 923a224b81..1df81a797b 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -94,7 +94,7 @@ visible_message("[src] easily breaks out of [p_their()] handcuffs!", \ "With just a thought your handcuffs fall off.") -/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(incapacitated()) to_chat(src, "You can't do that right now!") return FALSE diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 67d0252bb2..6e25db1fa6 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -98,7 +98,7 @@ desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents." icon_state = "purple" item_state = "glasses" - scan_reagents = 1 //You can see reagents while wearing science goggles + scan_reagents = TRUE //You can see reagents while wearing science goggles actions_types = list(/datum/action/item_action/toggle_research_scanner) glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF @@ -202,7 +202,7 @@ /obj/item/clothing/glasses/sunglasses/reagent name = "beer goggles" desc = "A pair of sunglasses outfitted with apparatus to scan reagents." - scan_reagents = 1 + scan_reagents = TRUE /obj/item/clothing/glasses/sunglasses/garb name = "black gar glasses" @@ -377,7 +377,7 @@ item_state = "godeye" vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS darkness_view = 8 - scan_reagents = 1 + scan_reagents = TRUE item_flags = NODROP lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index d40b5f4e9b..22eac9f5aa 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -445,7 +445,7 @@ flash_protect = 0 armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - scan_reagents = 1 + scan_reagents = TRUE /obj/item/clothing/suit/space/hardsuit/medical icon_state = "hardsuit-medical" @@ -467,7 +467,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) var/obj/machinery/doppler_array/integrated/bomb_radar - scan_reagents = 1 + scan_reagents = TRUE actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) /obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize() @@ -626,7 +626,7 @@ item_state = "anc_hardsuit" armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500) slowdown = 6 //Slow - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -639,7 +639,7 @@ armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500) item_color = "ancient" brightness_on = 16 - scan_reagents = 1 + scan_reagents = TRUE flash_protect = 5 //We will not be flash by bombs tint = 1 var/obj/machinery/doppler_array/integrated/bomb_radar diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 55b8891534..96de3b299a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -753,7 +753,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_icon() -/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return IsAdminGhost(usr) /mob/dead/observer/is_literate() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c03c0fc0a9..4e857c46a0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -725,12 +725,12 @@ remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") cut_overlay(MA) -/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(incapacitated() || lying ) to_chat(src, "You can't do that right now!") return FALSE if(!Adjacent(M) && (M.loc != src)) - if((be_close == 0) || (dna.check_mutation(TK) && tkMaxRangeCheck(src, M))) + if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))) return TRUE to_chat(src, "You are too far away!") return FALSE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 69168caad1..b253e27e8d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -814,7 +814,7 @@ /mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering return -/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(incapacitated()) to_chat(src, "You can't do that right now!") return FALSE diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 46576a357f..6d225d3913 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -779,7 +779,7 @@ return TRUE return ..() -/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(control_disabled || incapacitated()) to_chat(src, "You can't do that right now!") return FALSE diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 896d8674be..7fd861bfeb 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -183,7 +183,7 @@ // See software.dm for Topic() -/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(be_close && !in_range(M, src)) to_chat(src, "You are too far away!") return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 335645b17e..e71e269222 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -910,7 +910,7 @@ if(DISCONNECT) //Tampering with the wires to_chat(connected_ai, "

NOTICE - Remote telemetry lost with [name].
") -/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(stat || lockcharge || low_power_mode) to_chat(src, "You can't do that right now!") return FALSE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2517d2438d..1f81899d8a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -392,7 +392,7 @@ if(target) return new childspawn(target) -/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) if(incapacitated()) to_chat(src, "You can't do that right now!") return FALSE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7ff8fbc0b1..d8177af2ee 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -784,7 +784,7 @@ return 0 //Can the mob use Topic to interact with machines -/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return /mob/proc/faction_check_mob(mob/target, exact_match) diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 20ad2214cf..99d648d02b 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -44,7 +44,7 @@ return machinery_computer.update_icon() // This thing is not meant to be used on it's own, get topic data from our machinery owner. -//obj/item/modular_computer/processor/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE) +//obj/item/modular_computer/processor/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) // if(!machinery_computer) // return 0 diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d10e57783d..1875e2bd6a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -248,13 +248,8 @@ work_animation() . = TRUE if("eject") - if(beaker) - beaker.forceMove(drop_location()) - if(Adjacent(usr) && !issilicon(usr)) - usr.put_in_hands(beaker) - beaker = null - update_icon() - . = TRUE + replace_beaker(usr) + . = TRUE //no afterattack if("dispense_recipe") if(!is_operational() || QDELETED(cell)) return @@ -320,14 +315,12 @@ return if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) var/obj/item/reagent_containers/B = I - . = 1 //no afterattack - if(beaker) - to_chat(user, "A container is already loaded into [src]!") - return + . = TRUE //no afterattack if(!user.transferItemToLoc(B, src)) return - beaker = B + replace_beaker(user, B) to_chat(user, "You add [B] to [src].") + updateUsrDialog() update_icon() else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag)) to_chat(user, "You can't load [I] into [src]!") @@ -379,7 +372,17 @@ dispensable_reagents |= upgrade_reagents3 powerefficiency = round(newpowereff, 0.01) - +/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + beaker.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else + beaker = null + update_icon() + return TRUE /obj/machinery/chem_dispenser/on_deconstruction() cell = null @@ -415,6 +418,12 @@ final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2])) return final_list +/obj/machinery/chem_dispenser/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + return + /obj/machinery/chem_dispenser/drinks/Initialize() . = ..() AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index e4c6966cff..a17b1e8190 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -28,13 +28,23 @@ else icon_state = "mixer0b" -/obj/machinery/chem_heater/proc/eject_beaker(mob/user) +/obj/machinery/chem_heater/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + return + +/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) beaker.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) + if(user && Adjacent(user) && !issiliconoradminghost(user)) user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else beaker = null update_icon() + return TRUE /obj/machinery/chem_heater/RefreshParts() heater_coefficient = 0.1 @@ -58,21 +68,19 @@ return if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) - . = 1 //no afterattack - if(beaker) - to_chat(user, "A container is already loaded into [src]!") + . = TRUE //no afterattack + var/obj/item/reagent_containers/B = I + if(!user.transferItemToLoc(B, src)) return - - if(!user.transferItemToLoc(I, src)) - return - beaker = I - to_chat(user, "You add [I] to [src].") + replace_beaker(user, B) + to_chat(user, "You add [B] to [src].") + updateUsrDialog() update_icon() return return ..() /obj/machinery/chem_heater/on_deconstruction() - eject_beaker() + replace_beaker() return ..() /obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ @@ -122,5 +130,5 @@ target_temperature = CLAMP(target, 0, 1000) if("eject") on = FALSE - eject_beaker(usr) + replace_beaker(usr) . = TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 6327c5ba3a..aeed5ffc37 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -60,16 +60,6 @@ else icon_state = "mixer0" -/obj/machinery/chem_master/proc/eject_beaker(mob/user) - if(beaker) - beaker.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(beaker) - else - adjust_item_drop_location(beaker) - beaker = null - update_icon() - /obj/machinery/chem_master/blob_act(obj/structure/blob/B) if (prob(50)) qdel(src) @@ -85,36 +75,49 @@ return if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) - . = 1 // no afterattack + . = TRUE // no afterattack if(panel_open) to_chat(user, "You can't use the [src.name] while its panel is opened!") return - if(beaker) - to_chat(user, "A container is already loaded into [src]!") + var/obj/item/reagent_containers/B = I + if(!user.transferItemToLoc(B, src)) return - if(!user.transferItemToLoc(I, src)) - return - - beaker = I - to_chat(user, "You add [I] to [src].") - src.updateUsrDialog() + replace_beaker(user, B) + to_chat(user, "You add [B] to [src].") + updateUsrDialog() update_icon() - else if(!condi && istype(I, /obj/item/storage/pill_bottle)) if(bottle) to_chat(user, "A pill bottle is already loaded into [src]!") return if(!user.transferItemToLoc(I, src)) return - bottle = I to_chat(user, "You add [I] into the dispenser slot.") - src.updateUsrDialog() + updateUsrDialog() else return ..() +/obj/machinery/chem_master/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + replace_beaker(user) + return + +/obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + beaker.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else + beaker = null + update_icon() + return TRUE + /obj/machinery/chem_master/on_deconstruction() - eject_beaker() + replace_beaker(usr) if(bottle) bottle.forceMove(drop_location()) adjust_item_drop_location(bottle) @@ -164,7 +167,7 @@ return switch(action) if("eject") - eject_beaker(usr) + replace_beaker(usr) . = TRUE if("ejectp") diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 5c39cd9db2..1847f1f722 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -19,6 +19,12 @@ var/speed = 1 var/list/holdingitems + var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") + var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject") + var/static/radial_grind = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_grind") + var/static/radial_juice = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_juice") + var/static/radial_mix = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mix") + /obj/machinery/reagentgrinder/Initialize() . = ..() holdingitems = list() @@ -51,7 +57,6 @@ if(A == beaker) beaker = null update_icon() - updateUsrDialog() if(holdingitems[A]) holdingitems -= A @@ -67,6 +72,18 @@ else icon_state = "juicer0" +/obj/machinery/reagentgrinder/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) + if(beaker) + beaker.forceMove(drop_location()) + if(user && Adjacent(user) && !issiliconoradminghost(user)) + user.put_in_hands(beaker) + if(new_beaker) + beaker = new_beaker + else + beaker = null + update_icon() + return TRUE + /obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params) //You can only screw open empty grinder if(!beaker && !length(holdingitems) && default_deconstruction_screwdriver(user, icon_state, icon_state, I)) @@ -82,17 +99,14 @@ return TRUE if (istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) - if (!beaker) - if(!user.transferItemToLoc(I, src)) - to_chat(user, "[I] is stuck to your hand!") - return TRUE - to_chat(user, "You slide [I] into [src].") - beaker = I - update_icon() - updateUsrDialog() - else - to_chat(user, "There's already a container inside [src].") - return TRUE //no afterattack + var/obj/item/reagent_containers/B = I + . = TRUE + if(!user.transferItemToLoc(B, src)) + return + replace_beaker(user, B) + to_chat(user, "You add [B] to [src].") + update_icon() + return if(holdingitems.len >= limit) to_chat(user, "[src] is filled to capacity!") @@ -108,8 +122,6 @@ to_chat(user, "You empty [I] into [src].") else to_chat(user, "You fill [src] to the brim.") - - updateUsrDialog() return TRUE if(!I.grind_results && !I.juice_results) @@ -125,104 +137,89 @@ if(user.transferItemToLoc(I, src)) to_chat(user, "You add [I] to [src].") holdingitems[I] = TRUE - updateUsrDialog() return FALSE /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave . = ..() - var/is_chamber_empty = FALSE - var/is_beaker_ready = FALSE - var/processing_chamber = "" - var/beaker_contents = "" - var/dat = "" - if(!operating) - for (var/i in holdingitems) - var/obj/item/O = i - processing_chamber += "\A [O.name]
" + if(operating || !user.canUseTopic(src, !issilicon(user))) + return - if (!processing_chamber) - is_chamber_empty = TRUE - processing_chamber = "Nothing." - if (!beaker) - beaker_contents = "No beaker attached.
" - else - is_beaker_ready = TRUE - beaker_contents = "The beaker contains:
" - var/anything = FALSE - for(var/datum/reagent/R in beaker.reagents.reagent_list) - anything = TRUE - beaker_contents += "[R.volume] - [R.name]
" - if(!anything) - beaker_contents += "Nothing
" + var/list/options = list() - dat = {" - Processing chamber contains:
- [processing_chamber]
- [beaker_contents]
- "} - if (is_beaker_ready) - if(!is_chamber_empty && !(stat & (NOPOWER|BROKEN))) - dat += "Grind the reagents
" - dat += "Juice the reagents

" - else if (beaker.reagents.total_volume) - dat += "Mix the reagents

" - if(length(holdingitems)) - dat += "Eject the reagents
" - if(beaker) - dat += "Detach the beaker
" + if(beaker || length(holdingitems)) + options["eject"] = radial_eject + + if(isAI(user)) + if(stat & NOPOWER) + return + options["examine"] = radial_examine + + // if there is no power or it's broken, the procs will fail but the buttons will still show + if(length(holdingitems)) + options["grind"] = radial_grind + options["juice"] = radial_juice + else if(beaker?.reagents.total_volume) + options["mix"] = radial_mix + + var/choice + + if(length(options) < 1) + return + if(length(options) == 1) + for(var/key in options) + choice = key else - dat += "Please wait..." + choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) - var/datum/browser/popup = new(user, "reagentgrinder", "All-In-One Grinder") - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open(1) - return + // post choice verification + if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user))) + return -/obj/machinery/reagentgrinder/Topic(href, href_list) - if(..()) - return - var/mob/user = usr - if(!user.canUseTopic(src)) - return - if(stat & (NOPOWER|BROKEN)) - return - user.set_machine(src) - if(operating) - updateUsrDialog() - return - switch(href_list["action"]) - if ("grind") + switch(choice) + if("eject") + eject(user) + if("grind") grind(user) if("juice") juice(user) if("mix") mix(user) - if("eject") - eject(user) - if("detach") - detach(user) - updateUsrDialog() + if("examine") + examine(user) -/obj/machinery/reagentgrinder/proc/detach(mob/user) - if(!beaker) +/obj/machinery/reagentgrinder/examine(mob/user) + . = ..() + if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + to_chat(user, "You're too far away to examine [src]'s contents and display!") return - beaker.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(beaker) - beaker = null - update_icon() - updateUsrDialog() + + if(operating) + to_chat(user, "\The [src] is operating.") + return + + if(beaker || length(holdingitems)) + to_chat(user, "\The [src] contains:") + if(beaker) + to_chat(user, "- \A [beaker].") + for(var/i in holdingitems) + var/obj/item/O = i + to_chat(user, "- \A [O.name].") + + if(!(stat & (NOPOWER|BROKEN))) + to_chat(user, "The status display reads:") + to_chat(user, "- Grinding reagents at [speed*100]%.") + if(beaker) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + to_chat(user, "- [R.volume] units of [R.name].") /obj/machinery/reagentgrinder/proc/eject(mob/user) - if(!length(holdingitems)) - return for(var/i in holdingitems) var/obj/item/O = i O.forceMove(drop_location()) holdingitems -= O - updateUsrDialog() + if(beaker) + replace_beaker(user) /obj/machinery/reagentgrinder/proc/remove_object(obj/item/O) holdingitems -= O @@ -240,7 +237,6 @@ /obj/machinery/reagentgrinder/proc/operate_for(time, silent = FALSE, juicing = FALSE) shake_for(time / speed) - updateUsrDialog() operating = TRUE if(!silent) if(!juicing) @@ -251,11 +247,10 @@ /obj/machinery/reagentgrinder/proc/stop_operating() operating = FALSE - updateUsrDialog() /obj/machinery/reagentgrinder/proc/juice() power_change() - if(!beaker || (beaker && (beaker.reagents.total_volume >= beaker.reagents.maximum_volume))) + if(!beaker || stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) return operate_for(50, juicing = TRUE) for(var/obj/item/i in holdingitems) @@ -274,7 +269,7 @@ /obj/machinery/reagentgrinder/proc/grind() power_change() - if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) + if(!beaker || stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume) return operate_for(60) for(var/i in holdingitems) @@ -296,13 +291,13 @@ /obj/machinery/reagentgrinder/proc/mix(mob/user) //For butter and other things that would change upon shaking or mixing power_change() - if(!beaker) + if(!beaker || stat & (NOPOWER|BROKEN)) return operate_for(50, juicing = TRUE) addtimer(CALLBACK(src, /obj/machinery/reagentgrinder/proc/mix_complete), 50) /obj/machinery/reagentgrinder/proc/mix_complete() - if(beaker && beaker.reagents.total_volume) + if(beaker?.reagents.total_volume) //Recipe to make Butter var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF, 1) beaker.reagents.remove_reagent("milk", MILK_TO_BUTTER_COEFF * butter_amt)