//////////////////////////////////////////////////////////////////////////////// /// (Mixing)Glass. //////////////////////////////////////////////////////////////////////////////// /obj/item/reagent_containers/glass name = " " var/base_name = " " desc = " " icon = 'icons/obj/chemical.dmi' icon_state = "null" item_state = "null" amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50) volume = 50 container_type = OPENCONTAINER has_lid = TRUE resistance_flags = ACID_PROOF blocks_emissive = FALSE usesound = 'sound/items/deconstruct.ogg' var/label_text = "" /obj/item/reagent_containers/glass/Initialize(mapload) . = ..() base_name = name /obj/item/reagent_containers/glass/examine(mob/user) . = ..() if(get_dist(user, src) <= 2 && !is_open_container()) . += "Airtight lid seals it completely." . += "[src] can hold up to [reagents.maximum_volume] units." /obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone) if(!is_open_container()) return ..() if(!reagents || !reagents.total_volume) to_chat(user, "[src] is empty!") return if(istype(M)) var/list/transferred = list() for(var/datum/reagent/R in reagents.reagent_list) transferred += R.name var/contained = english_list(transferred) if(user.a_intent == INTENT_HARM) M.visible_message("[user] splashes the contents of [src] onto [M]!", \ "[user] splashes the contents of [src] onto [M]!") add_attack_logs(user, M, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() else if(!iscarbon(M)) // Non-carbons can't process reagents to_chat(user, "You cannot find a way to feed [M].") return if(M != user) M.visible_message("[user] attempts to feed something to [M].", \ "[user] attempts to feed something to you.") if(!do_mob(user, M)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.") add_attack_logs(user, M, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL) else to_chat(user, "You swallow a gulp of [src].") var/fraction = min(5 / reagents.total_volume, 1) reagents.reaction(M, REAGENT_INGEST, fraction) addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5), 5) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) /obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) if((!proximity) || !check_allowed_items(target, target_self = TRUE)) return if(!is_open_container()) return if(!reagents) return if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty!") return if(target.reagents.holder_full()) to_chat(user, "[target] is full.") return var/trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "You transfer [trans] unit\s of the solution to [target].") else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) to_chat(user, "[target] is empty and can't be refilled!") return if(reagents.holder_full()) to_chat(user, "[src] is full.") return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") else if(reagents.total_volume) if(user.a_intent == INTENT_HARM) user.visible_message("[user] splashes the contents of [src] onto [target]!", \ "You splash the contents of [src] onto [target].") reagents.reaction(target, REAGENT_TOUCH) reagents.clear_reagents() /obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) if(is_pen(I)) var/t = rename_interactive(user, I) if(!isnull(t)) label_text = t else return ..() /obj/item/reagent_containers/glass/beaker name = "beaker" desc = "A simple glass beaker, nothing special." icon = 'icons/obj/chemical.dmi' icon_state = "beaker" item_state = "beaker" belt_icon = "beaker" materials = list(MAT_GLASS = 1000) var/obj/item/assembly_holder/assembly = null var/can_assembly = 1 /obj/item/reagent_containers/glass/beaker/examine(mob/user) . = ..() if(assembly) . += "There is an [assembly] attached to it, use a screwdriver to remove it." /obj/item/reagent_containers/glass/beaker/on_reagent_change() update_icon(UPDATE_OVERLAYS) /obj/item/reagent_containers/glass/beaker/update_overlays() . = ..() if(reagents.total_volume) var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") var/percent = round((reagents.total_volume / volume) * 100) switch(percent) if(0 to 9) filling.icon_state = "[icon_state]-10" if(10 to 24) filling.icon_state = "[icon_state]10" if(25 to 49) filling.icon_state = "[icon_state]25" if(50 to 74) filling.icon_state = "[icon_state]50" if(75 to 79) filling.icon_state = "[icon_state]75" if(80 to 90) filling.icon_state = "[icon_state]80" if(91 to INFINITY) filling.icon_state = "[icon_state]100" filling.icon += mix_color_from_reagents(reagents.reagent_list) . += filling if(!is_open_container()) . += "lid_[initial(icon_state)]" if(!blocks_emissive) . += emissive_blocker(icon, "lid_[initial(icon_state)]") if(assembly) . += "assembly" /obj/item/reagent_containers/glass/beaker/proc/heat_beaker() if(reagents) reagents.temperature_reagents(4000) /obj/item/reagent_containers/glass/beaker/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/assembly_holder) && can_assembly) if(assembly) to_chat(usr, "[src] already has an assembly.") return ..() assembly = W user.drop_item() W.forceMove(src) update_icon(UPDATE_OVERLAYS) else ..() /obj/item/reagent_containers/glass/beaker/HasProximity(atom/movable/AM) if(assembly) assembly.HasProximity(AM) /obj/item/reagent_containers/glass/beaker/Crossed(atom/movable/AM, oldloc) if(assembly) assembly.Crossed(AM, oldloc) /obj/item/reagent_containers/glass/beaker/on_found(mob/finder) //for mousetraps if(assembly) assembly.on_found(finder) /obj/item/reagent_containers/glass/beaker/hear_talk(mob/living/M, list/message_pieces) if(assembly) assembly.hear_talk(M, message_pieces) /obj/item/reagent_containers/glass/beaker/hear_message(mob/living/M, msg) if(assembly) assembly.hear_message(M, msg) /obj/item/reagent_containers/glass/beaker/screwdriver_act(mob/living/user, obj/item/I) if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return if(assembly) to_chat(user, "You detach [assembly] from [src]") user.put_in_hands(assembly) assembly = null update_icon(UPDATE_OVERLAYS) else to_chat(user, "There is no assembly to remove.") /obj/item/reagent_containers/glass/beaker/large name = "large beaker" desc = "A large glass beaker with twice the capacity of a normal beaker." icon_state = "beakerlarge" materials = list(MAT_GLASS=2500) volume = 100 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100) container_type = OPENCONTAINER /obj/item/reagent_containers/glass/beaker/vial name = "vial" desc = "A small glass vial, often used by virologists of the 25th century." icon_state = "vial" belt_icon = "vial" materials = list(MAT_GLASS=250) volume = 25 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25) container_type = OPENCONTAINER can_assembly = 0 /obj/item/reagent_containers/glass/beaker/drugs name = "baggie" desc = "A small plastic baggie, often used by pharmaceutical \"entrepreneurs\"." icon_state = "baggie" amount_per_transfer_from_this = 2 possible_transfer_amounts = null volume = 10 container_type = OPENCONTAINER can_assembly = 0 /obj/item/reagent_containers/glass/beaker/noreact name = "cryostasis beaker" desc = "A cryostasis beaker that allows for chemical storage without reactions." icon_state = "beakernoreact" materials = list(MAT_METAL=3000) volume = 50 amount_per_transfer_from_this = 10 origin_tech = "materials=2;engineering=3;plasmatech=3" container_type = OPENCONTAINER blocks_emissive = EMISSIVE_BLOCK_GENERIC /obj/item/reagent_containers/glass/beaker/noreact/Initialize(mapload) . = ..() reagents.set_reacting(FALSE) /obj/item/reagent_containers/glass/beaker/bluespace name = "bluespace beaker" desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete." icon_state = "beakerbluespace" materials = list(MAT_GLASS=3000) volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,50,100,300) container_type = OPENCONTAINER blocks_emissive = EMISSIVE_BLOCK_GENERIC origin_tech = "bluespace=5;materials=4;plasmatech=4" /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) /obj/item/reagent_containers/glass/beaker/sulphuric list_reagents = list("sacid" = 50) /obj/item/reagent_containers/glass/beaker/slime list_reagents = list("slimejelly" = 50) /obj/item/reagent_containers/glass/beaker/drugs/meth list_reagents = list("methamphetamine" = 10) /obj/item/reagent_containers/glass/bucket name = "bucket" desc = "Useful for moving liquids, or having a helmet in the zombie apocalypse." icon = 'icons/obj/janitor.dmi' icon_state = "bucket" item_state = "bucket" materials = list(MAT_METAL=200) w_class = WEIGHT_CLASS_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120) volume = 120 armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 75, ACID = 50) //Weak melee protection, because you can wear it on your head slot_flags = SLOT_FLAG_HEAD resistance_flags = NONE blocks_emissive = EMISSIVE_BLOCK_GENERIC container_type = OPENCONTAINER dog_fashion = /datum/dog_fashion/head/bucket /obj/item/reagent_containers/glass/bucket/update_overlays() . = ..() if(!is_open_container()) . += "lid_[initial(icon_state)]" /obj/item/reagent_containers/glass/bucket/wooden name = "wooden bucket" icon_state = "woodbucket" item_state = "woodbucket" materials = null armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 50) resistance_flags = FLAMMABLE /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() if(slot == SLOT_HUD_HEAD && reagents.total_volume) to_chat(user, "[src]'s contents spill all over you!") reagents.reaction(user, REAGENT_TOUCH) reagents.clear_reagents() /obj/item/reagent_containers/glass/bucket/attackby(obj/D, mob/user, params) if(istype(D, /obj/item/mop)) var/obj/item/mop/m = D m.wet_mop(src, user) return if(isprox(D)) to_chat(user, "You add [D] to [src].") qdel(D) user.put_in_hands(new /obj/item/bucket_sensor) user.unEquip(src) qdel(src) else ..() /obj/item/reagent_containers/glass/beaker/waterbottle name = "bottle of water" desc = "A bottle of water filled at an old Earth bottling facility." icon = 'icons/obj/drinks.dmi' icon_state = "smallbottle" item_state = "bottle" list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard materials = list(MAT_GLASS = 0) volume = 50 amount_per_transfer_from_this = 10 /obj/item/reagent_containers/glass/beaker/waterbottle/empty list_reagents = list() /obj/item/reagent_containers/glass/beaker/waterbottle/large desc = "A fresh commercial-sized bottle of water." icon_state = "largebottle" materials = list(MAT_GLASS = 0) list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty list_reagents = list()