#define PH_WEAK (1 << 0) #define TEMP_WEAK (1 << 1) /obj/item/reagent_containers name = "Container" desc = "..." icon = 'icons/obj/chemical.dmi' icon_state = null w_class = WEIGHT_CLASS_TINY var/amount_per_transfer_from_this = 5 var/list/possible_transfer_amounts = list(5,10,15,20,25,30) var/volume = 30 var/reagent_flags var/list/list_reagents = null var/spawned_disease = null var/disease_amount = 20 var/spillable = FALSE var/beaker_weakness_bitflag = NONE//Bitflag! var/container_HP = 2 /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() if(isnum(vol) && vol > 0) volume = vol create_reagents(volume, reagent_flags) if(spawned_disease) var/datum/disease/F = new spawned_disease() var/list/data = list("viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) add_initial_reagents() /obj/item/reagent_containers/proc/add_initial_reagents() if(list_reagents) reagents.add_reagent_list(list_reagents) /obj/item/reagent_containers/attack_self(mob/user) if(possible_transfer_amounts.len) var/i=0 for(var/A in possible_transfer_amounts) i++ if(A == amount_per_transfer_from_this) if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.") return /obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) if(!iscarbon(eater)) return 0 var/mob/living/carbon/C = eater var/covered = "" if(C.is_mouth_covered(head_only = 1)) covered = "headgear" else if(C.is_mouth_covered(mask_only = 1)) covered = "mask" if(covered) var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, "You have to remove [who] [covered] first!") return 0 return 1 /obj/item/reagent_containers/ex_act() if(reagents) for(var/datum/reagent/R in reagents.reagent_list) R.on_ex_act() if(!QDELETED(src)) ..() /obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) ..() /obj/item/reagent_containers/throw_impact(atom/target) . = ..() SplashReagents(target, TRUE) /obj/item/reagent_containers/proc/bartender_check(atom/target) . = FALSE if(target.CanPass(src, get_turf(src)) && thrownby && thrownby.actions) for(var/datum/action/innate/drink_fling/D in thrownby.actions) if(D.active) return TRUE /obj/item/reagent_containers/proc/ForceResetRotation() transform = initial(transform) /obj/item/reagent_containers/proc/SplashReagents(atom/target, thrown = FALSE) if(!reagents || !reagents.total_volume || !spillable) return if(ismob(target) && target.reagents) if(thrown) reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target var/mob/M = target var/R target.visible_message("[M] has been splashed with something!", \ "[M] has been splashed with something!") for(var/datum/reagent/A in reagents.reagent_list) R += A.id + " (" R += num2text(A.volume) + ")," if(thrownby) log_combat(thrownby, M, "splashed", R) reagents.reaction(target, TOUCH) else if(bartender_check(target) && thrown) visible_message("[src] lands onto the [target.name] without spilling a single drop.") transform = initial(transform) addtimer(CALLBACK(src, .proc/ForceResetRotation), 1) return else if(isturf(target) && reagents.reagent_list.len && thrownby) log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]") log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].") message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].") visible_message("[src] spills its contents all over [target].") reagents.reaction(target, TOUCH) if(QDELETED(src)) return reagents.clear_reagents() //melts plastic beakers /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) reagents.expose_temperature(1000) if(beaker_weakness_bitflag & TEMP_WEAK) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/H in seen) to_chat(H, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) qdel(src) ..() //melts plastic beakers /obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) reagents.expose_temperature(exposed_temperature) temp_check() /obj/item/reagent_containers/proc/temp_check() if(beaker_weakness_bitflag & TEMP_WEAK) if(reagents.chem_temp >= 444)//assuming polypropylene var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the temperature!") playsound(get_turf(src), 'sound/FermiChem/heatmelt.ogg', 80, 1) to_chat(M, "[iconhtml] Have you tried using glass or meta beakers for high temperature reactions? These are immune to temperature effects.") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from temperature") qdel(src) //melts glass beakers /obj/item/reagent_containers/proc/pH_check() if(beaker_weakness_bitflag & PH_WEAK) if((reagents.pH < 0.5) || (reagents.pH > 13.5)) var/list/seen = viewers(5, get_turf(src)) var/iconhtml = icon2html(src, seen) container_HP-- if(container_HP <= 0) for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s melts from the extreme pH!") playsound(get_turf(src), 'sound/FermiChem/acidmelt.ogg', 80, 1) SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times beakers have melted from pH") qdel(src) else for(var/mob/M in seen) to_chat(M, "[iconhtml] \The [src]'s is damaged by the extreme pH and begins to deform!") playsound(get_turf(src), 'sound/FermiChem/bufferadd.ogg', 50, 1) to_chat(M, "[iconhtml] Have you tried using plastic beakers (XL) or metabeakers for high pH reactions? These beakers are immune to pH effects.")