obj/machinery/atmospherics/trinary/mixer icon = 'icons/obj/atmospherics/mixer.dmi' icon_state = "intact_off" name = "Gas mixer" mirror = /obj/machinery/atmospherics/trinary/mixer/mirrored var/on = 0 var/target_pressure = ONE_ATMOSPHERE var/node1_concentration = 0.5 var/node2_concentration = 0.5 //node 3 is the outlet, nodes 1 & 2 are intakes obj/machinery/atmospherics/trinary/mixer/update_icon() if(stat & NOPOWER) icon_state = "intact_off" else if(node2 && node3 && node1) icon_state = "intact_[on?("on"):("off")]" else icon_state = "intact_off" on = 0 ..() obj/machinery/atmospherics/trinary/mixer/power_change() var/old_stat = stat ..() if(old_stat != stat) update_icon() obj/machinery/atmospherics/trinary/mixer/New() ..() air3.volume = 300 obj/machinery/atmospherics/trinary/mixer/process() . = ..() if(!on) return var/output_starting_pressure = air3.return_pressure() if(output_starting_pressure >= target_pressure) //No need to mix if target is already full! return //Calculate necessary moles to transfer using PV=nRT var/pressure_delta = target_pressure - output_starting_pressure var/transfer_moles1 = 0 var/transfer_moles2 = 0 if(air1.temperature > 0) transfer_moles1 = (node1_concentration*pressure_delta)*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) if(air2.temperature > 0) transfer_moles2 = (node2_concentration*pressure_delta)*air3.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) var/air1_moles = air1.total_moles() var/air2_moles = air2.total_moles() if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) if(!transfer_moles1 || !transfer_moles2) return var/ratio = min(air1_moles/transfer_moles1, air2_moles/transfer_moles2) transfer_moles1 *= ratio transfer_moles2 *= ratio //Actually transfer the gas if(transfer_moles1 > 0) var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) air3.merge(removed1) if(transfer_moles2 > 0) var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) air3.merge(removed2) if(network1 && transfer_moles1) network1.update = 1 if(network2 && transfer_moles2) network2.update = 1 if(network3) network3.update = 1 return 1 obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) if(..()) return src.add_fingerprint(usr) if(!src.allowed(user)) user << "Access denied." return usr.set_machine(src) var/dat = {"Power: [on?"On":"Off"]
Desirable output pressure: [target_pressure]kPa | Change
Node 1 Concentration: - - [node1_concentration]([node1_concentration*100]%) + +
Node 2 Concentration: - - [node2_concentration]([node2_concentration*100]%) + + "} user << browse("[src.name] control[dat]", "window=atmo_mixer") onclose(user, "atmo_mixer") return obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list) if(..()) return if(href_list["power"]) on = !on if(href_list["set_press"]) var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num src.target_pressure = max(0, min(4500, new_pressure)) if(href_list["node1_c"]) var/value = text2num(href_list["node1_c"]) src.node1_concentration = max(0, min(1, src.node1_concentration + value)) src.node2_concentration = max(0, min(1, src.node2_concentration - value)) if(href_list["node2_c"]) var/value = text2num(href_list["node2_c"]) src.node2_concentration = max(0, min(1, src.node2_concentration + value)) src.node1_concentration = max(0, min(1, src.node1_concentration - value)) src.update_icon() src.updateUsrDialog() return /obj/machinery/atmospherics/trinary/mixer/mirrored icon_state = "intactm_off" pipe_flags = IS_MIRROR /obj/machinery/atmospherics/trinary/mixer/mirrored/update_icon() ..() if(stat & NOPOWER) icon_state = "intactm_off" else if(node2 && node3 && node1) icon_state = "intactm_[on?("on"):("off")]" else icon_state = "intactm_off" on = 0 return