mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-09 16:07:40 +00:00
159 lines
4.7 KiB
Plaintext
159 lines
4.7 KiB
Plaintext
/obj/machinery/chem_heater
|
|
name = "chemical heater"
|
|
density = TRUE
|
|
icon = 'icons/obj/chemical.dmi'
|
|
icon_state = "mixer0b"
|
|
use_power = IDLE_POWER_USE
|
|
idle_power_usage = 40
|
|
resistance_flags = FIRE_PROOF | ACID_PROOF
|
|
circuit = /obj/item/circuitboard/machine/chem_heater
|
|
var/obj/item/reagent_containers/beaker = null
|
|
var/target_temperature = 300
|
|
var/heater_coefficient = 0.1
|
|
var/on = FALSE
|
|
|
|
/obj/machinery/chem_heater/Destroy()
|
|
QDEL_NULL(beaker)
|
|
return ..()
|
|
|
|
/obj/machinery/chem_heater/handle_atom_del(atom/A)
|
|
. = ..()
|
|
if(A == beaker)
|
|
beaker = null
|
|
update_icon()
|
|
|
|
/obj/machinery/chem_heater/update_icon_state()
|
|
if(beaker)
|
|
icon_state = "mixer1b"
|
|
else
|
|
icon_state = "mixer0b"
|
|
|
|
/obj/machinery/chem_heater/AltClick(mob/living/user)
|
|
. = ..()
|
|
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
|
return
|
|
replace_beaker(user)
|
|
return TRUE
|
|
|
|
/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
|
|
if(beaker)
|
|
beaker.forceMove(drop_location())
|
|
if(user && Adjacent(user) && user.can_hold_items())
|
|
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
|
|
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
|
|
heater_coefficient *= M.rating
|
|
|
|
/obj/machinery/chem_heater/examine(mob/user)
|
|
. = ..()
|
|
if(in_range(user, src) || isobserver(user))
|
|
. += "<span class='notice'>The status display reads: Heating reagents at <b>[heater_coefficient*1000]%</b> speed.</span>"
|
|
|
|
/obj/machinery/chem_heater/process()
|
|
..()
|
|
if(stat & NOPOWER)
|
|
return
|
|
if(on)
|
|
if(beaker && beaker.reagents.total_volume)
|
|
beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
|
|
beaker.reagents.handle_reactions()
|
|
|
|
/obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params)
|
|
if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I))
|
|
return
|
|
|
|
if(default_deconstruction_crowbar(I))
|
|
return
|
|
|
|
if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
|
|
. = TRUE //no afterattack
|
|
var/obj/item/reagent_containers/B = I
|
|
if(!user.transferItemToLoc(B, src))
|
|
return
|
|
replace_beaker(user, B)
|
|
to_chat(user, "<span class='notice'>You add [B] to [src].</span>")
|
|
updateUsrDialog()
|
|
update_icon()
|
|
return
|
|
|
|
if(beaker)
|
|
if(istype(I, /obj/item/reagent_containers/dropper))
|
|
var/obj/item/reagent_containers/dropper/D = I
|
|
D.afterattack(beaker, user, 1)
|
|
|
|
if(istype(I, /obj/item/reagent_containers/syringe))
|
|
var/obj/item/reagent_containers/syringe/S = I
|
|
S.afterattack(beaker, user, 1)
|
|
|
|
return ..()
|
|
|
|
/obj/machinery/chem_heater/on_deconstruction()
|
|
replace_beaker()
|
|
return ..()
|
|
|
|
/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
|
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
|
if(!ui)
|
|
ui = new(user, src, ui_key, "ChemHeater", name, 300, 400, master_ui, state)
|
|
ui.open()
|
|
|
|
/obj/machinery/chem_heater/ui_data()
|
|
var/data = list()
|
|
data["targetTemp"] = target_temperature
|
|
data["isActive"] = on
|
|
data["isBeakerLoaded"] = beaker ? 1 : 0
|
|
|
|
data["currentTemp"] = beaker ? beaker.reagents.chem_temp : null
|
|
data["currentpH"] = beaker ? beaker.reagents.pH : null
|
|
data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null
|
|
data["beakerMaxVolume"] = beaker ? beaker.volume : null
|
|
//purity and pH accuracy
|
|
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
|
|
data["partRating"]= 10**(M.rating-1)
|
|
if(M.rating == 4)
|
|
data["showPurity"] = 1
|
|
else
|
|
data["showPurity"] = 0
|
|
|
|
var beakerContents[0]
|
|
if(beaker)
|
|
for(var/datum/reagent/R in beaker.reagents.reagent_list)
|
|
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume, "purity" = R.purity))) // list in a list because Byond merges the first list...
|
|
data["beakerContents"] = beakerContents
|
|
return data
|
|
|
|
/obj/machinery/chem_heater/ui_act(action, params)
|
|
if(..())
|
|
return
|
|
switch(action)
|
|
if("power")
|
|
on = !on
|
|
. = TRUE
|
|
if("temperature")
|
|
var/target = params["target"]
|
|
var/adjust = text2num(params["adjust"])
|
|
if(target == "input")
|
|
target = input("New target temperature:", name, target_temperature) as num|null
|
|
if(!isnull(target) && !..())
|
|
. = TRUE
|
|
else if(adjust)
|
|
target = target_temperature + adjust
|
|
else if(text2num(target) != null)
|
|
target = text2num(target)
|
|
. = TRUE
|
|
if(.)
|
|
target_temperature = clamp(target, 0, 1000)
|
|
if("eject")
|
|
on = FALSE
|
|
replace_beaker(usr)
|
|
. = TRUE
|