-
-
Notifications
You must be signed in to change notification settings - Fork 452
/
chem_heater.dm
151 lines (132 loc) · 4.77 KB
/
chem_heater.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/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
/// Multiplier for heat
var/heater_coefficient = 0.0125
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_appearance(UPDATE_ICON)
/obj/machinery/chem_heater/update_icon_state()
. = ..()
icon_state = "mixer[beaker ? 1 : 0][on ? "a" : "b"]"
/obj/machinery/chem_heater/CtrlClick(mob/user)
if(!user.canUseTopic(src, !issilicon(user)))
return
on = !on
update_appearance(UPDATE_ICON)
/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_appearance(UPDATE_ICON)
return TRUE
/obj/machinery/chem_heater/RefreshParts()
heater_coefficient = initial(heater_coefficient)
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(delta_time)
..()
if(stat & NOPOWER)
return
if(on)
if(beaker && beaker.reagents.total_volume)
var/direction = beaker.reagents.chem_temp > target_temperature // is it cooling? used to allow it to snap to the target temp
var/heating = (1000 - beaker.reagents.chem_temp) * heater_coefficient * delta_time * (direction ? -1 : 1) // How much to increase the heat by
if(heating + beaker.reagents.chem_temp >= target_temperature && !direction) // Heat snapping condition
heating = target_temperature - beaker.reagents.chem_temp // Makes it snap to target temp
else if(heating + beaker.reagents.chem_temp <= target_temperature && direction) // Cooling snapping condition
heating = target_temperature - beaker.reagents.chem_temp // Makes it snap to target temp
beaker.reagents.adjust_thermal_energy(heating * 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_notice("You add [B] to [src]."))
updateUsrDialog()
update_appearance(UPDATE_ICON)
return
return ..()
/obj/machinery/chem_heater/on_deconstruction()
replace_beaker()
return ..()
/obj/machinery/chem_heater/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ChemHeater", name)
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["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
update_appearance(UPDATE_ICON)
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