mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
[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:
co-authored by
Rohesie
Mothblocks
Aleksej Komarov
Thalpy
parent
4c9b4e8749
commit
8cb1c0040b
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user