/obj/machinery/atmospherics/trinary/mixer icon = 'icons/atmos/mixer.dmi' icon_state = "map" density = 0 level = 1 name = "Gas mixer" use_power = 1 idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 3700 //This also doubles as a measure of how powerful the mixer is, in Watts. 3700 W ~ 5 HP var/set_flow_rate = ATMOS_DEFAULT_VOLUME_MIXER var/list/mixing_inputs //for mapping 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(var/safety = 0) if(istype(src, /obj/machinery/atmospherics/trinary/mixer/m_mixer)) icon_state = "m" else if(istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) icon_state = "t" else icon_state = "" if(!powered()) icon_state += "off" else if(node2 && node3 && node1) icon_state += use_power ? "on" : "off" else icon_state += "off" use_power = 0 /obj/machinery/atmospherics/trinary/mixer/update_underlays() if(..()) underlays.Cut() var/turf/T = get_turf(src) if(!istype(T)) return if(istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) add_underlay(T, node1, turn(dir, -90)) else add_underlay(T, node1, turn(dir, -180)) if(istype(src, /obj/machinery/atmospherics/trinary/mixer/m_mixer) || istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) add_underlay(T, node2, turn(dir, 90)) else add_underlay(T, node2, turn(dir, -90)) add_underlay(T, node3, dir) /obj/machinery/atmospherics/trinary/mixer/hide(var/i) update_underlays() /obj/machinery/atmospherics/trinary/mixer/power_change() var/old_stat = stat ..() if(old_stat != stat) update_icon() /obj/machinery/atmospherics/trinary/mixer/New() ..() air1.volume = ATMOS_DEFAULT_VOLUME_MIXER air2.volume = ATMOS_DEFAULT_VOLUME_MIXER air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5 if (!mixing_inputs) mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration) /obj/machinery/atmospherics/trinary/mixer/process() ..() last_power_draw = 0 last_flow_rate = 0 if((stat & (NOPOWER|BROKEN)) || !use_power) return //Figure out the amount of moles to transfer var/transfer_moles = (set_flow_rate*mixing_inputs[air1]/air1.volume)*air1.total_moles + (set_flow_rate*mixing_inputs[air1]/air2.volume)*air2.total_moles var/power_draw = -1 if (transfer_moles > MINIMUM_MOLES_TO_FILTER) power_draw = mix_gas(src, mixing_inputs, air3, transfer_moles, power_rating) if(network1 && mixing_inputs[air1]) network1.update = 1 if(network2 && mixing_inputs[air2]) network2.update = 1 if(network3) network3.update = 1 if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) return 1 /obj/machinery/atmospherics/trinary/mixer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (!istype(W, /obj/item/weapon/wrench)) return ..() var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ "[user] unfastens \the [src].", \ "\blue You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) /obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) if(..()) return src.add_fingerprint(usr) if(!src.allowed(user)) user << "\red Access denied." return usr.set_machine(src) var/dat = {"Power: [use_power?"On":"Off"]
Set Flow Rate Limit: [set_flow_rate]L/s | Change
Flow Rate: [round(last_flow_rate, 0.1)]L/s

Node 1 Concentration: - - [mixing_inputs[air1]]([mixing_inputs[air1]*100]%) + +
Node 2 Concentration: - - [mixing_inputs[air2]]([mixing_inputs[air2]*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 1 if(href_list["power"]) use_power = !use_power if(href_list["set_press"]) var/max_flow_rate = min(air1.volume, air2.volume) var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[max_flow_rate]L/s)","Flow Rate Control",src.set_flow_rate) as num src.set_flow_rate = max(0, min(max_flow_rate, new_flow_rate)) if(href_list["node1_c"]) var/value = text2num(href_list["node1_c"]) src.mixing_inputs[air1] = max(0, min(1, src.mixing_inputs[air1] + value)) src.mixing_inputs[air2] = 1.0 - mixing_inputs[air1] if(href_list["node2_c"]) var/value = text2num(href_list["node2_c"]) src.mixing_inputs[air2] = max(0, min(1, src.mixing_inputs[air2] + value)) src.mixing_inputs[air1] = 1.0 - mixing_inputs[air2] src.update_icon() src.updateUsrDialog() return obj/machinery/atmospherics/trinary/mixer/t_mixer icon_state = "tmap" dir = SOUTH initialize_directions = SOUTH|EAST|WEST //node 3 is the outlet, nodes 1 & 2 are intakes obj/machinery/atmospherics/trinary/mixer/t_mixer/New() ..() switch(dir) if(NORTH) initialize_directions = EAST|NORTH|WEST if(SOUTH) initialize_directions = SOUTH|WEST|EAST if(EAST) initialize_directions = EAST|NORTH|SOUTH if(WEST) initialize_directions = WEST|NORTH|SOUTH obj/machinery/atmospherics/trinary/mixer/t_mixer/initialize() ..() if(node1 && node2 && node3) return var/node1_connect = turn(dir, -90) var/node2_connect = turn(dir, 90) var/node3_connect = dir for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) if(target.initialize_directions & get_dir(target,src)) node1 = target break for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) if(target.initialize_directions & get_dir(target,src)) node2 = target break for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect)) if(target.initialize_directions & get_dir(target,src)) node3 = target break update_icon() update_underlays() obj/machinery/atmospherics/trinary/mixer/m_mixer icon_state = "mmap" dir = SOUTH initialize_directions = SOUTH|NORTH|EAST //node 3 is the outlet, nodes 1 & 2 are intakes obj/machinery/atmospherics/trinary/mixer/m_mixer/New() ..() switch(dir) if(NORTH) initialize_directions = WEST|NORTH|SOUTH if(SOUTH) initialize_directions = SOUTH|EAST|NORTH if(EAST) initialize_directions = EAST|WEST|NORTH if(WEST) initialize_directions = WEST|SOUTH|EAST obj/machinery/atmospherics/trinary/mixer/m_mixer/initialize() ..() if(node1 && node2 && node3) return var/node1_connect = turn(dir, -180) var/node2_connect = turn(dir, 90) var/node3_connect = dir for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect)) if(target.initialize_directions & get_dir(target,src)) node1 = target break for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect)) if(target.initialize_directions & get_dir(target,src)) node2 = target break for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect)) if(target.initialize_directions & get_dir(target,src)) node3 = target break update_icon() update_underlays()