[MIRROR] Fermichem part 2.2 Adds new tools, crafts and methods for ghetto chemists to handle the new reaction mechanics. (#3512)

* Fermichem part 2.2 Adds new tools, crafts and methods for ghetto chemists to handle the new reaction mechanics. (#56871)

Since reactions now require a bit more involvement from chemists, ghetto chemistry is a bit harder. This seeks to help some of those problems by providing new tools for those without a chem heater/reaction chamber.

Also some of these might be useful for chemists in the lab too!

Here's what you can make:
image
the burners are similar to candles - except they burn their internal reagents. The temperature they heat by is dependant on the flame, fuel and oil burn for a lower amount, ethanol for a higher amount and plasma for the highest amount. They can be put on tables and bonked with beakers for a quick way to heat them (similar to lighters). You'll need to light them with a match or lighter too, though, and can be put out by use in hand.

The thermometer looks like this and gives you temperature readings!
thermom

The pH booklets are the same as before - but you can now craft them by making universal indicator. These are the best way for a ghetto chemist to check their pH, and multiple sheets should be used over a reaction.

The improvised chem heater looks like this, and is a reconfigured space heater, it requires more materials and tools lending itself to a static drug den, but has the best method of adjusting temperature and fighting against exo/endo thermic reactions:
Improv_heater

Finally, the cooling spray lets chemists do the oposite of a lighter on their beaker - cooling the reagents within. In addition, fire extinquishers perform the same function.

In addition ice and universal indicator have been added as reactions.

Co-authored-by: Rohesie <rohesie@ gmail.com>
Co-authored-by: Mothblocks <35135081+Jared-Fogle@ users.noreply.github.com>
Co-authored-by: Aleksej Komarov <stylemistake@ gmail.com>

* Fermichem part 2.2 Adds new tools, crafts and methods for ghetto chemists to handle the new reaction mechanics.

Co-authored-by: Thalpy <33956696+Thalpy@users.noreply.github.com>
Co-authored-by: Rohesie <rohesie@ gmail.com>
Co-authored-by: Mothblocks <35135081+Jared-Fogle@ users.noreply.github.com>
Co-authored-by: Aleksej Komarov <stylemistake@ gmail.com>
This commit is contained in:
SkyratBot
2021-02-19 19:14:58 +00:00
committed by GitHub
co-authored by Rohesie Mothblocks Aleksej Komarov Thalpy
parent 4c9b4e8749
commit 8cb1c0040b
29 changed files with 969 additions and 172 deletions
@@ -116,6 +116,20 @@
if(hotness && reagents)
reagents.expose_temperature(hotness)
to_chat(user, "<span class='notice'>You heat [name] with [I]!</span>")
//Cooling method
if(istype(I, /obj/item/extinguisher))
var/obj/item/extinguisher/extinguisher = I
if(extinguisher.safety)
return
if(extinguisher.reagents.total_volume < 1)
to_chat(user, "<span class='warning'>\The [extinguisher] is empty!</span>")
return
var/cooling = (0 - reagents.chem_temp) * (extinguisher.cooling_power * 2)
reagents.expose_temperature(cooling)
to_chat(user, "<span class='notice'>You cool the [name] with the [I]!</span>")
playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3)
extinguisher.reagents.remove_all(1)
..()
/obj/item/reagent_containers/food/drinks/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
@@ -67,7 +67,7 @@
new /obj/item/food/chocolatebar(location)
return
/datum/chemical_reaction/soysauce
/datum/chemical_reaction/food/soysauce
results = list(/datum/reagent/consumable/soysauce = 5)
required_reagents = list(/datum/reagent/consumable/soymilk = 4, /datum/reagent/toxin/acid = 1)
+204 -35
View File
@@ -79,45 +79,15 @@
var/used = FALSE
/obj/item/ph_paper/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
var/obj/item/reagent_containers/cont = target
if(!istype(cont))
if(!is_reagent_container(target))
return
var/obj/item/reagent_containers/cont = target
if(used == TRUE)
to_chat(user, "<span class='warning'>[src] has already been used!</span>")
return
if(!LAZYLEN(cont.reagents.reagent_list))
return
switch(round(cont.reagents.ph, 1))
if(14 to INFINITY)
color = "#462c83"
if(13 to 14)
color = "#63459b"
if(12 to 13)
color = "#5a51a2"
if(11 to 12)
color = "#3853a4"
if(10 to 11)
color = "#3f93cf"
if(9 to 10)
color = "#0bb9b7"
if(8 to 9)
color = "#23b36e"
if(7 to 8)
color = "#3aa651"
if(6 to 7)
color = "#4cb849"
if(5 to 6)
color = "#b5d335"
if(4 to 5)
color = "#f7ec1e"
if(3 to 4)
color = "#fbc314"
if(2 to 3)
color = "#f26724"
if(1 to 2)
color = "#ef1d26"
if(-INFINITY to 1)
color = "#c6040c"
CONVERT_PH_TO_COLOR(round(cont.reagents.ph, 1), color)
desc += " The paper looks to be around a pH of [round(cont.reagents.ph, 1)]"
name = "used [name]"
used = TRUE
@@ -130,7 +100,6 @@
desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays nothing."
icon_state = "pHmeter"
icon = 'icons/obj/chemical.dmi'
resistance_flags = FLAMMABLE
w_class = WEIGHT_CLASS_TINY
///level of detail for output for the meter
var/scanmode = DETAILED_CHEM_OUTPUT
@@ -145,7 +114,7 @@
/obj/item/ph_meter/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!istype(target, /obj/item/reagent_containers))
if(!is_reagent_container(target))
return
var/obj/item/reagent_containers/cont = target
if(LAZYLEN(cont.reagents.reagent_list) == null)
@@ -162,3 +131,203 @@
out_message += "<b>Analysis:</b> [R.description]\n"
to_chat(user, "[out_message.Join()]</span>")
desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays detected vol: [round(cont.volume, 0.01)] detected pH:[round(cont.reagents.ph, 0.1)]."
/obj/item/burner
name = "Alcohol burner"
desc = "A small table size burner used for heating up beakers."
icon = 'icons/obj/chemical.dmi'
icon_state = "burner"
grind_results = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/silicon = 10)
item_flags = NOBLUDGEON
resistance_flags = FLAMMABLE
w_class = WEIGHT_CLASS_TINY
heat = 2000
///If the flame is lit - i.e. if we're processing and burning
var/lit = FALSE
///total reagent volume
var/max_volume = 50
///What the creation reagent is
var/reagent_type = /datum/reagent/consumable/ethanol
/obj/item/burner/Initialize()
. = ..()
create_reagents(max_volume, TRANSPARENT)//We have our own refillable - since we want to heat and pour
if(reagent_type)
reagents.add_reagent(reagent_type, 15)
/obj/item/burner/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(is_reagent_container(I))
if(lit)
var/obj/item/reagent_containers/container = I
container.reagents.expose_temperature(get_temperature())
to_chat(user, "<span class='notice'>You heat up the [I] with the [src].</span>")
playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE)
return
else if(I.is_drainable()) //Transfer FROM it TO us. Special code so it only happens when flame is off.
var/obj/item/reagent_containers/container = I
if(!container.reagents.total_volume)
to_chat(user, "<span class='warning'>[container] is empty and can't be poured!</span>")
return
if(reagents.holder_full())
to_chat(user, "<span class='warning'>[src] is full.</span>")
return
var/trans = container.reagents.trans_to(src, container.amount_per_transfer_from_this, transfered_by = user)
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [container].</span>")
if(I.heat < 1000)
return
set_lit(TRUE)
user.visible_message("<span class='notice'>[user] lights up the [src].</span>")
/obj/item/burner/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(lit)
if(is_reagent_container(target))
var/obj/item/reagent_containers/container = target
container.reagents.expose_temperature(get_temperature())
to_chat(user, "<span class='notice'>You heat up the [src].</span>")
playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE)
return
else if(isitem(target))
var/obj/item/item = target
if(item.heat > 1000)
set_lit(TRUE)
user.visible_message("<span class='notice'>[user] lights up the [src].</span>")
/obj/item/burner/update_icon_state()
. = ..()
icon_state = "[initial(icon_state)][lit ? "-on" : ""]"
/obj/item/burner/proc/set_lit(new_lit)
if(lit == new_lit)
return
lit = new_lit
if(lit)
force = 5
damtype = BURN
hitsound = 'sound/items/welder.ogg'
attack_verb_continuous = string_list(list("burns", "sings"))
attack_verb_simple = string_list(list("burn", "sing"))
START_PROCESSING(SSobj, src)
else
hitsound = "swing_hit"
force = 0
attack_verb_continuous = null //human_defense.dm takes care of it
attack_verb_simple = null
STOP_PROCESSING(SSobj, src)
set_light_on(lit)
update_icon()
/obj/item/burner/extinguish()
set_lit(FALSE)
/obj/item/burner/attack_self(mob/living/user)
. = ..()
if(.)
return
if(lit)
set_lit(FALSE)
user.visible_message("<span class='notice'>[user] snuffs out [src]'s flame.</span>")
/obj/item/burner/attack(mob/living/carbon/M, mob/living/carbon/user)
if(lit && M.IgniteMob())
message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(M)] on fire with [src] at [AREACOORD(user)]")
log_game("[key_name(user)] set [key_name(M)] on fire with [src] at [AREACOORD(user)]")
return ..()
/obj/item/burner/process()
var/current_heat = 0
var/number_of_burning_reagents = 0
for(var/datum/reagent/reagent as anything in reagents.reagent_list)
reagent.burn(reagents) //burn can set temperatures of reagents
if(!isnull(reagent.burning_temperature))
current_heat += reagent.burning_temperature
number_of_burning_reagents += 1
reagents.remove_reagent(reagent.type, reagent.burning_volume)
continue
if(!number_of_burning_reagents)
set_lit(FALSE)
heat = 0
return
open_flame()
current_heat /= number_of_burning_reagents
heat = current_heat
/obj/item/burner/get_temperature()
return lit * heat
/obj/item/burner/oil
name = "Oil burner"
reagent_type = /datum/reagent/fuel/oil
grind_results = list(/datum/reagent/fuel/oil = 5, /datum/reagent/silicon = 10)
/obj/item/burner/fuel
name = "Fuel burner"
reagent_type = /datum/reagent/fuel
grind_results = list(/datum/reagent/fuel = 5, /datum/reagent/silicon = 10)
/obj/item/thermometer
name = "thermometer"
desc = "A thermometer for checking a beaker's temperature"
icon_state = "thermometer"
icon = 'icons/obj/chemical.dmi'
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_TINY
grind_results = list(/datum/reagent/mercury = 5)
///The reagents datum that this object is attached to, so we know where we are when it's added to something.
var/datum/reagents/attached_to_reagents
/obj/item/thermometer/Destroy()
QDEL_NULL(attached_to_reagents) //I have no idea how you can destroy this, but not the beaker, but here we go
return ..()
/obj/item/thermometer/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(target.reagents)
if(!user.transferItemToLoc(src, target))
return
attached_to_reagents = target.reagents
to_chat(user, "<span class='notice'>You add the [src] to the [target].</span>")
ui_interact(usr, null)
/obj/item/thermometer/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Thermometer", name)
ui.open()
/obj/item/thermometer/ui_close(mob/user)
. = ..()
remove_thermometer(user)
/obj/item/thermometer/ui_status(mob/user)
if(!(in_range(src, user)))
return UI_CLOSE
return UI_INTERACTIVE
/obj/item/thermometer/ui_state(mob/user)
return GLOB.physical_state
/obj/item/thermometer/ui_data(mob/user)
if(!attached_to_reagents)
ui_close(user)
var/data = list()
data["Temperature"] = round(attached_to_reagents.chem_temp)
return data
/obj/item/thermometer/proc/remove_thermometer(mob/target)
try_put_in_hand(src, target)
attached_to_reagents = null
/obj/item/thermometer/proc/try_put_in_hand(obj/object, mob/living/user)
to_chat(user, "<span class='notice'>You remove the [src] from the [attached_to_reagents.my_atom].</span>")
if(!issilicon(user) && in_range(src.loc, user))
user.put_in_hands(object)
else
object.forceMove(drop_location())
/obj/item/thermometer/pen
color = "#888888"
+10 -1
View File
@@ -81,10 +81,15 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/impure_chem = /datum/reagent/impurity
/// If the impurity is below 0.5, replace ALL of the chem with inverse_chem upon metabolising
var/inverse_chem_val = 0.25
/// What chem is metabolised when purity is below inverse_chem_val
/// What chem is metabolised when purity is below inverse_chem_val
var/inverse_chem = /datum/reagent/impurity/toxic
///what chem is made at the end of a reaction IF the purity is below the recipies purity_min at the END of a reaction only
var/failed_chem = /datum/reagent/consumable/failed_reaction
///Thermodynamic vars
///How hot this reagent burns when it's on fire - null means it can't burn
var/burning_temperature = null
///How much is consumed when it is burnt per second
var/burning_volume = 0.5
///Assoc list with key type of addiction this reagent feeds, and value amount of addiction points added per unit of reagent metabolzied (which means * REAGENTS_METABOLISM every life())
var/list/addiction_types = null
@@ -129,6 +134,10 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
return SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_TURF, exposed_turf, reac_volume)
///Called whenever a reagent is on fire, or is in a holder that is on fire. (WIP)
/datum/reagent/proc/burn(datum/reagents/holder)
return
/// Called from [/datum/reagents/proc/metabolize]
/datum/reagent/proc/on_mob_life(mob/living/carbon/M, delta_time, times_fired)
current_cycle++
@@ -15,6 +15,8 @@
taste_description = "alcohol"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
ph = 7.33
burning_temperature = 2193//ethanol burns at 1970C (at it's peak)
burning_volume = 0.1
var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning
/*
@@ -156,6 +156,8 @@
color = "#0000C8"
taste_description = "blue"
ph = 11
burning_temperature = 20 //cold burning
burning_volume = 0.1
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired)
@@ -12,6 +12,12 @@
penetrates_skin = NONE
ph = 7.4
// FEED ME
/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray)
. = ..()
if(chems.has_reagent(type, 1))
mytray.adjustPests(rand(2,3))
/datum/reagent/blood/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0)
. = ..()
if(data && data["viruses"])
@@ -224,6 +230,14 @@
ph = 7.5 //God is alkaline
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
// Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits. Also ALSO increases instability.
/datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray)
if(chems.has_reagent(type, 1))
mytray.adjustWater(round(chems.get_reagent_amount(type) * 1))
mytray.adjustHealth(round(chems.get_reagent_amount(type) * 0.1))
if(myseed)
myseed.adjust_instability(round(chems.get_reagent_amount(type) * 0.15))
/datum/reagent/water/holywater/on_mob_metabolize(mob/living/L)
..()
ADD_TRAIT(L, TRAIT_HOLY, type)
@@ -1106,6 +1120,8 @@
glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption."
penetrates_skin = NONE
ph = 4
burning_temperature = 1725 //more refined than oil
burning_volume = 0.2
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
addiction_types = list(/datum/addiction/alcohol = 4)
@@ -1714,6 +1730,8 @@
reagent_state = LIQUID
color = "#2D2D2D"
taste_description = "oil"
burning_temperature = 1200//Oil is crude
burning_volume = 0.05 //but has a lot of hydrocarbons
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
addiction_types = null
@@ -2576,3 +2594,16 @@
M.adjustBruteLoss(2 * REM * delta_time, FALSE)
..()
/datum/reagent/universal_indicator
name = "Universal indicator"
description = "A solution that can be used to create pH paper booklets, or sprayed on things to colour them by their pH."
taste_description = "a strong chemical taste"
color = "#1f8016"
//Colours things by their pH
/datum/reagent/universal_indicator/expose_atom(atom/exposed_atom, reac_volume)
. = ..()
if(exposed_atom.reagents)
var/color
CONVERT_PH_TO_COLOR(exposed_atom.reagents.ph, color)
exposed_atom.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY)
@@ -216,8 +216,14 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
self_consuming = TRUE
burning_volume = 0.05
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/cryostylane/burn(datum/reagents/holder)
if(holder.has_reagent(/datum/reagent/oxygen))
burning_temperature = 0//king chilly
return
burning_temperature = null
/datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M, delta_time, times_fired) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent(/datum/reagent/oxygen))
@@ -242,6 +248,8 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "bitterness"
self_consuming = TRUE
burning_temperature = null
burning_volume = 0.05
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M, delta_time, times_fired)
@@ -253,6 +261,12 @@
humi.adjust_coretemperature(15 * REM * delta_time)
..()
/datum/reagent/pyrosium/burn(datum/reagents/holder)
if(holder.has_reagent(/datum/reagent/oxygen))
burning_temperature = 3500
return
burning_temperature = null
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water."
@@ -78,6 +78,8 @@
material = /datum/material/plasma
penetrates_skin = NONE
ph = 4
burning_temperature = 4500//plasma is hot!!
burning_volume = 0.3//But burns fast
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/toxin/plasma/on_new(data)
@@ -21,7 +21,6 @@
///Determines if a chemical reaction can occur inside a mob
var/mob_react = TRUE
///The message shown to nearby people upon mixing, if applicable
var/mix_message = "The solution begins to bubble."
///The sound played upon mixing, if applicable
@@ -643,3 +643,50 @@
for(var/i in 1 to created_volume)
new /obj/item/stack/sheet/mineral/silver(location)
//////////////////////////////////// Water ////////////////////////////////////////////////
/datum/chemical_reaction/ice
results = list(/datum/reagent/consumable/ice = 1.09)//density
required_reagents = list(/datum/reagent/water = 1)
is_cold_recipe = TRUE
required_temp = 274 // So we can be sure that basic ghetto rigged stuff can freeze
optimal_temp = 200
overheat_temp = 0
optimal_ph_min = 0
optimal_ph_max = 14
thermic_constant = 0
H_ion_release = 0
rate_up_lim = 50
purity_min = 0
mix_message = "The solution freezes up into ice!"
reaction_flags = REACTION_COMPETITIVE
/datum/chemical_reaction/water
results = list(/datum/reagent/water = 0.92)//rough density excahnge
required_reagents = list(/datum/reagent/consumable/ice = 1)
required_temp = 275
optimal_temp = 350
overheat_temp = 99999
optimal_ph_min = 0
optimal_ph_max = 14
thermic_constant = 0
H_ion_release = 0
rate_up_lim = 50
purity_min = 0
mix_message = "The ice melts back into water!"
////////////////////////////////////
/datum/chemical_reaction/universal_indicator
results = list(/datum/reagent/universal_indicator = 3)//rough density excahnge
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/iodine = 1)
required_temp = 274
optimal_temp = 350
overheat_temp = 99999
optimal_ph_min = 0
optimal_ph_max = 14
thermic_constant = 0
H_ion_release = 0
rate_up_lim = 50
purity_min = 0
mix_message = "The mixture's colors swirl together."
@@ -32,9 +32,6 @@
RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), .proc/on_reagent_change)
RegisterSignal(reagents, COMSIG_PARENT_QDELETING, .proc/on_reagents_del)
/obj/item/reagent_containers/Destroy()
return ..()
/obj/item/reagent_containers/attack(mob/living/M, mob/living/user, params)
if (!user.combat_mode)
return
@@ -86,6 +86,20 @@
reagents.expose_temperature(hotness)
to_chat(user, "<span class='notice'>You heat [name] with [I]!</span>")
//Cooling method
if(istype(I, /obj/item/extinguisher))
var/obj/item/extinguisher/extinguisher = I
if(extinguisher.safety)
return
if (extinguisher.reagents.total_volume < 1)
to_chat(user, "<span class='warning'>\The [extinguisher] is empty!</span>")
return
var/cooling = (0 - reagents.chem_temp) * extinguisher.cooling_power * 2
reagents.expose_temperature(cooling)
to_chat(user, "<span class='notice'>You cool the [name] with the [I]!</span>")
playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3)
extinguisher.reagents.remove_all(1)
if(istype(I, /obj/item/food/egg)) //breaking eggs
var/obj/item/food/egg/E = I
if(reagents)
@@ -129,6 +129,21 @@
if(hotness && reagents)
reagents.expose_temperature(hotness)
to_chat(user, "<span class='notice'>You heat [name] with [I]!</span>")
//Cooling method
if(istype(I, /obj/item/extinguisher))
var/obj/item/extinguisher/extinguisher = I
if(extinguisher.safety)
return
if (extinguisher.reagents.total_volume < 1)
to_chat(user, "<span class='warning'>\The [extinguisher] is empty!</span>")
return
var/cooling = (0 - reagents.chem_temp) * extinguisher.cooling_power * 2
reagents.expose_temperature(cooling)
to_chat(user, "<span class='notice'>You cool the [name] with the [I]!</span>")
playsound(loc, 'sound/effects/extinguish.ogg', 75, TRUE, -3)
extinguisher.reagents.remove_all(1)
return ..()
/obj/item/reagent_containers/spray/verb/empty()