mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 01:49:19 +00:00
136 lines
3.9 KiB
Plaintext
136 lines
3.9 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()
|
|
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
|
|
|
|
/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) && !issiliconoradminghost(user))
|
|
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/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
|
|
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, "chem_heater", name, 275, 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
|
|
|
|
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))) // 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
|