From 6b7801c4af182520d4381a373df1402c63bc46e2 Mon Sep 17 00:00:00 2001 From: "rastaf.zero@gmail.com" Date: Sat, 8 Jan 2011 22:16:27 +0000 Subject: [PATCH] Singularity now wont leave floor under eaten walls. Cryo wont spit out beaker. Fixed message "You don't have the dexterity to do this" for machinery. PIPES: - Heat exchange pipes are constructable now. - Insulated pipes also were added to pipe dispenser; - And meters too; - Easy pipe rotating in hands; - bent pipes actually looks bent under construction (may be glitches, please report); - pipes now wont cover wires; - pipes unwrenching now possible; - large vent pumps now uses power as equipment, not environment - pumps now uses power; Air alarm improvements: - all alarms in area controls all environment machines in area; - machines initializes itself automatically and without interloping with existing ones; - air alarms wont duplicates it air monitoring and can clear itself; Some other typos and small issues were fixed. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@816 316c924e-a436-60f5-8080-3fe189b3f50e --- .../components/binary_devices/pump.dm | 69 +- code/ATMOSPHERICS/components/filter.dm | 2 + .../components/portables_connector.dm | 26 + .../components/unary/vent_pump.dm | 84 ++- .../components/unary/vent_scrubber.dm | 53 +- code/ATMOSPHERICS/components/valve.dm | 36 +- code/ATMOSPHERICS/init_S_V_A.dm | 92 --- code/ATMOSPHERICS/pipes.dm | 193 +++--- code/defines/obj/machinery.dm | 3 +- code/game/area/areas.dm | 4 + code/game/machinery/alarm.dm | 82 ++- code/game/machinery/atmo_control.dm | 8 +- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/computer/computer.dm | 20 +- code/game/machinery/cryo.dm | 66 +- code/game/machinery/pipe/construction.dm | 618 ++++++++++-------- code/game/machinery/pipe/pipe_dispenser.dm | 41 +- code/game/machinery/processor.dm | 4 +- code/game/machinery/singularity.dm | 7 +- code/game/master_controller.dm | 4 +- code/game/objects/items/blueprints.dm | 5 +- code/game/objects/stacks/stack.dm | 4 +- code/game/objects/tank.dm | 4 +- code/modules/power/apc.dm | 4 +- icons/obj/atmospherics/red_pipe.dmi | Bin 1042 -> 3950 bytes icons/obj/pipe-item.dmi | Bin 12646 -> 10824 bytes icons/obj/pipes.dmi | Bin 78186 -> 80851 bytes icons/obj/pipes/heat.dmi | Bin 1749 -> 1568 bytes icons/obj/pipes/junction.dmi | Bin 619 -> 833 bytes maps/tgstation.2.0.0.dmm | 134 ++-- tgstation.dme | 2 - 31 files changed, 886 insertions(+), 681 deletions(-) delete mode 100644 code/ATMOSPHERICS/init_S_V_A.dm diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 81ccfce0f6d..96e0e970364 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -38,18 +38,19 @@ obj/machinery/atmospherics/binary/pump icon_state = "exposed_2_off" else icon_state = "exposed_3_off" - on = 0 - return process() ..() + if(stat & (NOPOWER|BROKEN)) + return if(!on) return 0 + use_power(5) var/output_starting_pressure = air2.return_pressure() - if(output_starting_pressure >= target_pressure) + if( (target_pressure - output_starting_pressure) < 0.01) //No need to pump gas if target is already reached! return 1 @@ -68,6 +69,7 @@ obj/machinery/atmospherics/binary/pump if(network2) network2.update = 1 + use_power(round(air2.volume/12)) return 1 //Radio remote control @@ -95,6 +97,22 @@ obj/machinery/atmospherics/binary/pump radio_connection.post_signal(src, signal) return 1 + interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + - + - + - + - + [round(target_pressure,0.1)]kPa + + + + + + + + + "} + + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") var/frequency = 0 var/id = null @@ -138,19 +156,7 @@ obj/machinery/atmospherics/binary/pump user << "\red Access denied." return usr.machine = src - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - - - - - - - [round(target_pressure,0.1)]kPa - + - + - + - "} - - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + interact(user) return Topic(href,href_list) @@ -158,6 +164,37 @@ obj/machinery/atmospherics/binary/pump on = !on if(href_list["out_press"]) src.target_pressure = max(0, min(4500, src.target_pressure + text2num(href_list["out_press"]))) + usr.machine = src src.update_icon() src.updateUsrDialog() return + + power_change() + ..() + update_icon() + + attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/filter.dm b/code/ATMOSPHERICS/components/filter.dm index e744247e0e9..0d389aa82eb 100644 --- a/code/ATMOSPHERICS/components/filter.dm +++ b/code/ATMOSPHERICS/components/filter.dm @@ -347,6 +347,7 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE Nitrous Oxide
Nothing

Desirable output pressure: + - - - - @@ -354,6 +355,7 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE + + + + + "} /* user << browse("[src.name] control[dat]","window=atmo_filter") diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index e35368ad69a..7065b256053 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -127,3 +127,29 @@ return null + + attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (connected_device) + user << "\red You cannot unwrench this [src], dettach [connected_device] first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index eb338e199b0..b7501df5efc 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -6,14 +6,9 @@ desc = "Has a valve and pump attached to it" level = 1 - - high_volume - name = "Large Air Vent" - - New() - ..() - - air_contents.volume = 1000 + var/channel = ENVIRON + var/area_uid + var/id = null var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing @@ -28,6 +23,26 @@ var/welded = 0 // Added for aliens -- TLE + var/frequency = 1439 + var/datum/radio_frequency/radio_connection + + + New() + var/area/A = get_area(loc) + if (A.master) + A = A.master + area_uid = A.uid + ..() + if (!id) + id = "\ref[src]" + + high_volume + name = "Large Air Vent" + New() + ..() + channel = EQUIP + air_contents.volume = 1000 + update_icon() if(on && !(stat & (NOPOWER|BROKEN))) if(pump_direction) @@ -38,6 +53,7 @@ icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" return + process() ..() if(stat & (NOPOWER|BROKEN)) @@ -45,9 +61,10 @@ if (!node) on = 0 broadcast_status() - if(!on) return 0 + + use_power(5, channel) if(welded) return 0 @@ -67,8 +84,8 @@ var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - use_power(10, ENVIRON) + + use_power(round(air_contents.volume/12), channel) loc.assume_air(removed) if(network) @@ -76,7 +93,6 @@ else //external -> internal var/pressure_delta = 10000 - if(pressure_checks&1) pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) if(pressure_checks&2) @@ -89,7 +105,9 @@ var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) if (isnull(removed)) //in space return - use_power(10, ENVIRON) + + + use_power(round(air_contents.volume/12), channel) air_contents.merge(removed) if(network) @@ -114,21 +132,20 @@ signal.transmission_method = 1 //radio signal signal.source = src - signal.data["tag"] = id + signal.data["area"] = src.area_uid + signal.data["tag"] = src.id signal.data["device"] = "AVP" signal.data["power"] = on?("on"):("off") signal.data["direction"] = pump_direction?("release"):("siphon") signal.data["checks"] = pressure_checks signal.data["internal"] = internal_pressure_bound signal.data["external"] = external_pressure_bound + signal.data["timestamp"] = air_master.current_cycle radio_connection.post_signal(src, signal) return 1 - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection initialize() ..() @@ -137,7 +154,7 @@ update_icon() receive_signal(datum/signal/signal) - if(signal.data["tag"] && (signal.data["tag"] != id)) + if(!signal.data["tag"] || (signal.data["tag"] != id)) return 0 switch(signal.data["command"]) @@ -185,6 +202,9 @@ external_pressure_bound = number + if("init") + name = signal.data["parameter"] + if(signal.data["tag"]) spawn(2) broadcast_status() @@ -225,8 +245,34 @@ usr << "It seems welded shut." power_change() - if(powered(ENVIRON)) + if(powered(channel)) stat &= ~NOPOWER else stat |= NOPOWER update_icon() + + attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 03317e68bb9..cc35c9ded67 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -20,6 +20,16 @@ var/volume_rate = 120 var/panic = 0 //is this scrubber panicked? + var/area_uid + + New() + var/area/A = get_area(loc) + if (A.master) + A = A.master + area_uid = A.uid + id_tag = "\ref[src]" + ..() + update_icon() if(node && on && !(stat & (NOPOWER|BROKEN))) if(scrubbing) @@ -42,6 +52,8 @@ var/datum/signal/signal = new signal.transmission_method = 1 //radio signal + signal.source = src + signal.data["area"] = area_uid signal.data["tag"] = id_tag signal.data["device"] = "AScr" signal.data["timestamp"] = air_master.current_cycle @@ -57,8 +69,8 @@ initialize() ..() - set_frequency(frequency) - update_icon() + if (frequency) + set_frequency(frequency) process() @@ -82,7 +94,8 @@ var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) if (isnull(removed)) //in space return - use_power(30, ENVIRON) + var/power = (scrub_Toxins+scrub_CO2+scrub_N2O)*volume_rate/12 + use_power(round(power+5), ENVIRON) //Filter it var/datum/gas_mixture/filtered_out = new filtered_out.temperature = removed.temperature @@ -112,7 +125,9 @@ network.update = 1 else //Just siphoning all air - use_power(volume_rate/12, ENVIRON) + if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + return + use_power(round(volume_rate/12)+5, ENVIRON) var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) @@ -137,7 +152,7 @@ */ receive_signal(datum/signal/signal) - if(signal.data["tag"] && (signal.data["tag"] != id_tag)) + if(!signal.data["tag"] || (signal.data["tag"] != id_tag)) return ..() switch(signal.data["command"]) @@ -160,6 +175,8 @@ else scrubbing = 1 volume_rate = initial(volume_rate) + if("init") + name = signal.data["parameter"] if(signal.data["tag"]) spawn(2) broadcast_status() @@ -172,3 +189,29 @@ else stat |= NOPOWER update_icon() + + attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index b15e00491b2..2769ef46791 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -150,19 +150,19 @@ obj/machinery/atmospherics/valve for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) connect_directions &= ~direction - node1 = target break - break + if(node1) + break for(var/direction in cardinal) if(direction&connect_directions) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) - node2 = target break - break + if(node1) + break build_network() if(!network_node1 && node1) @@ -258,4 +258,30 @@ obj/machinery/atmospherics/valve if(open) close() else - open() \ No newline at end of file + open() + + attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (istype(src, /obj/machinery/atmospherics/valve/digital)) + user << "\red You cannot unwrench this [src], it's too complicated." + return 1 + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/init_S_V_A.dm b/code/ATMOSPHERICS/init_S_V_A.dm deleted file mode 100644 index f5ecd07ce74..00000000000 --- a/code/ATMOSPHERICS/init_S_V_A.dm +++ /dev/null @@ -1,92 +0,0 @@ -datum/controller/game_controller - proc/find_air_alarms() - var/list/processed_areas = list() - for(var/area/A in world) - if(A in processed_areas) continue - processed_areas += connect_area_atmos_machinery(A) - return - - -/proc/connect_area_atmos_machinery(var/area/A) - var/area/M = A.master //we want to search master area, not only L(number) one - - var/uniq_id = md5(M.name)//hash works like a charm - var/list/alarms = list() - var/list/scrubbers = list() - var/list/vents = list() - var/list/processed_areas = list() - var/i = 0 //used in id_tag and name generation - - if(M.related && M.related.len)//if has relatives - for(var/area/Rel in M.related)//check all relatives - if(Rel == M) continue //same parent area. - processed_areas += Rel - if(Rel.contents && Rel.contents.len) - for(var/obj/machinery/O in Rel.contents) - switch(O.type) - if(/obj/machinery/alarm) - alarms += O - if(/obj/machinery/atmospherics/unary/vent_scrubber) - if(O:id_tag) continue - scrubbers += O - if(/obj/machinery/atmospherics/unary/vent_pump) - if(O:id) continue - vents += O - else continue -/* - for(var/obj/machinery/alarm/Al in Rel.contents)//find air alarms in area, append to list - alarms += Al - for(var/obj/machinery/atmospherics/unary/vent_scrubber/V in Rel.contents)//find scrubbers in area, append to list - if(V.id_tag) continue//already connected to air alarm - scrubbers += V - for(var/obj/machinery/atmospherics/unary/vent_pump/P in Rel.contents) - if(P.id) continue - vents += P -*/ - - if(!alarms.len || (!scrubbers.len && !vents.len)) return - - i = 0 - if(scrubbers.len) //if scrubbers found in area - for(var/obj/machinery/atmospherics/unary/vent_scrubber/Sc in scrubbers)//iterate over found scrubbers -// if(Sc.id_tag) continue - var/dist = 127 //max value returned by get_dist - var/obj/machinery/alarm/target_alarm = null - for(var/obj/machinery/alarm/Al in alarms)//iterate over found alarms - var/temp_dist = get_dist(Sc.loc, Al.loc)//if distance between current scrubber and current alarm < previous distance, set this alarm as target to connect to - if(temp_dist maximum_pressure) - del(src) + burst() else if(pressure_difference > fatigue_pressure) + //TODO: leak to turf, doing pfshhhhh if(prob(5)) - del(src) + burst() else return 1 + proc/burst() + src.visible_message("\red \bold [src] bursts!"); + playsound(src.loc, 'bang.ogg', 25, 1) + del(src) + Del() if(node1) node1.disconnect(src) @@ -163,6 +169,8 @@ obj/machinery/atmospherics/pipe return list(node1, node2) update_icon() + if(dir==3) dir = 1 + else if(dir==12) dir = 4 if(node1&&node2) var/C = "" switch(color) @@ -173,49 +181,30 @@ obj/machinery/atmospherics/pipe if ("yellow") C = "-y" icon_state = "intact[C][invisibility ? "-f" : "" ]" - var/node1_direction = get_dir(src, node1) - var/node2_direction = get_dir(src, node2) + //var/node1_direction = get_dir(src, node1) + //var/node2_direction = get_dir(src, node2) - dir = node1_direction|node2_direction - if(dir==3) dir = 1 - else if(dir==12) dir = 4 + //dir = node1_direction|node2_direction else - icon_state = "exposed[invisibility ? "-f" : "" ]" + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" - if(node1) - dir = get_dir(src,node1) - - else if(node2) - dir = get_dir(src,node2) - - else + if(!node1&&!node2) del(src) initialize() var/connect_directions = initialize_directions - -/* switch(dir) - if(NORTH) - connect_directions = NORTH|SOUTH - if(SOUTH) - connect_directions = NORTH|SOUTH - if(EAST) - connect_directions = EAST|WEST - if(WEST) - connect_directions = EAST|WEST - else - connect_directions = dir -*/ for(var/direction in cardinal) if(direction&connect_directions) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node1 = target + connect_directions &= ~direction break - - connect_directions &= ~direction - break + if (node1) + break for(var/direction in cardinal) @@ -223,13 +212,14 @@ obj/machinery/atmospherics/pipe for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node2 = target + connect_directions &= ~direction break - - connect_directions &= ~direction - break + if(node2) + break var/turf/T = src.loc // hide if turf is not intact hide(T.intact) + update_icon() //update_icon() disconnect(obj/machinery/atmospherics/reference) @@ -260,47 +250,69 @@ obj/machinery/atmospherics/pipe level = 2 - simple/junction + simple/heat_exchanging/junction icon = 'junction.dmi' icon_state = "intact" level = 2 - - update_icon() - if(istype(node1, /obj/machinery/atmospherics/pipe/simple/heat_exchanging)) - dir = get_dir(src, node1) - - if(node2) - icon_state = "intact" - else - icon_state = "exposed" - - else if(istype(node2, /obj/machinery/atmospherics/pipe/simple/heat_exchanging)) - dir = get_dir(src, node2) - - if(node1) - icon_state = "intact" - else - icon_state = "exposed" - - else - icon_state = "exposed" - - simple/heat_exchanging - icon = 'heat.dmi' - icon_state = "3" - level = 2 - - minimum_temperature_difference = 20 - thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT + minimum_temperature_difference = 300 + thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT update_icon() if(node1&&node2) icon_state = "intact" + else + var/have_node1 = node1?1:0 + var/have_node2 = node2?1:0 + icon_state = "exposed[have_node1][have_node2]" + if(!node1&&!node2) + del(src) - var/node1_direction = get_dir(src, node1) - var/node2_direction = get_dir(src, node2) + initialize() + if(!node1) + for(var/obj/machinery/atmospherics/pipe/simple/target in get_step(src,initialize_directions)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + if(!node2) + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,initialize_directions_he)) + if(target.initialize_directions_he & get_dir(target,src)) + node2 = target + break + + update_icon() + + simple/heat_exchanging + icon = 'heat.dmi' + icon_state = "intact" + level = 2 + var/initialize_directions_he + + minimum_temperature_difference = 20 + thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT + + initialize() + var/connect_directions = initialize_directions_he + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,direction)) + if(target.initialize_directions_he & get_dir(target,src)) + node1 = target + connect_directions &= ~direction + break + if (node1) + break + + for(var/direction in cardinal) + if(direction&connect_directions) + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,direction)) + if(target.initialize_directions_he & get_dir(target,src)) + node2 = target + connect_directions &= ~direction + break + if (node2) + break + update_icon() - icon_state = "[node1_direction|node2_direction]" tank icon = 'pipe_tank.dmi' @@ -426,6 +438,7 @@ obj/machinery/atmospherics/pipe icon_state = "exposed" initialize() + var/connect_direction = dir for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) @@ -665,10 +678,10 @@ obj/machinery/atmospherics/pipe for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node1 = target + connect_directions &= ~direction break - - connect_directions &= ~direction - break + if (node1) + break for(var/direction in cardinal) @@ -676,10 +689,10 @@ obj/machinery/atmospherics/pipe for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node2 = target + connect_directions &= ~direction break - - connect_directions &= ~direction - break + if (node2) + break for(var/direction in cardinal) @@ -687,11 +700,39 @@ obj/machinery/atmospherics/pipe for(var/obj/machinery/atmospherics/target in get_step(src,direction)) if(target.initialize_directions & get_dir(target,src)) node3 = target + connect_directions &= ~direction break - - connect_directions &= ~direction - break + if (node3) + break var/turf/T = src.loc // hide if turf is not intact hide(T.intact) //update_icon() + update_icon() + +obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (istype(W, /obj/machinery/atmospherics/pipe/tank)) + return ..() + if (istype(W, /obj/machinery/atmospherics/pipe/vent)) + return ..() + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + var/turf/T = src.loc + if (level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + 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, '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/weapon/pipe(loc, make_from=src) + del(src) \ No newline at end of file diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index 2bae2c70ad2..c29fbc25917 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -10,7 +10,6 @@ anchored = 1.0 var/skipprocess = 0 //Experimenting var/alarm_frequency = "1437" - var/alarm_zone = null /obj/machinery/autolathe name = "Autolathe" @@ -20,7 +19,7 @@ var/g_amount = 0.0 var/operating = 0.0 var/opened = 0.0 - var/temp = null + //var/temp = null anchored = 1.0 var/list/L = list() var/list/LL = list() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0dcb2954fbf..3dc15976f3b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,8 +1,12 @@ // === +/area/ + var/global/global_uid = 0 + var/uid /area/New() src.icon = 'alert.dmi' + uid = ++global_uid spawn(1) //world.log << "New: [src] [tag]" var/sd_created = findtext(tag,"sd_L") diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index e8d096cd395..6dda692c475 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -6,25 +6,23 @@ var/list/sensor_information = list() var/list/vent_information = list() var/datum/radio_frequency/radio_connection - var/alarm_area //Currently unused. Maybe do something if emmaged or hacked...Like change the area to security, syphon air out, ..., profit. + //var/alarm_area //Currently unused. Maybe do something if emmaged or hacked...Like change the area to security, syphon air out, ..., profit. var/locked = 1 var/panic = 0 //is this alarm panicked? var/device = null + var/area_uid req_access = list(access_atmospherics) attack_hand(mob/user) - if(!(istype(usr, /mob/living/silicon) || istype(usr, /mob/living/carbon/human))) - user << "\red You don't have the dexterity to do this." - return - if(stat & (NOPOWER|BROKEN)) + . = ..() + if (.) return //Following is no longer needed, as all human/silicon mobs will be able to view air info. /*else if(!(istype(usr, /mob/living/silicon)) && locked) user << "\red You must unlock the Air Alarm interface first" return*/ - src.add_fingerprint(user) user << browse(return_text(),"window=air_alarm") user.machine = src @@ -33,23 +31,44 @@ receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return - + if(stat & (NOPOWER|BROKEN)) + return + if(!signal || signal.encryption) + return var/id_tag = signal.data["tag"] - if(!id_tag || (!sensors.Find(id_tag) && !vents.Find(id_tag))) return + if (!id_tag) + return + if (!signal.data["area"] || signal.data["area"] != area_uid) + return + if((!sensors.Find(id_tag) && !vents.Find(id_tag))) + register_env_machine(id_tag, signal.data["device"]) if(signal.data["device"] == "AScr") sensor_information[id_tag] = signal.data else if(signal.data["device"] == "AVP") vent_information[id_tag] = signal.data proc + register_env_machine(var/m_id, var/device_type) + var/area/A = get_area(loc) + var/new_name + if (device_type=="AVP") + new_name = "[A.name] Vent Pump #[vent_information.len+1]" + vents[m_id] = new_name + else if (device_type=="AScr") + new_name = "[A.name] Air Scrubber #[sensor_information.len+1]" + sensors[m_id] = new_name + else + return + spawn (10) + send_signal(m_id, "init", new_name ) + set_frequency(new_frequency) radio_controller.remove_object(src, "[frequency]") frequency = new_frequency radio_connection = radio_controller.add_object(src, "[frequency]") - send_signal(var/target, var/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise + send_signal(var/target, var/command, var/parameter = null)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise if(!radio_connection) return 0 @@ -59,6 +78,8 @@ signal.data["tag"] = target signal.data["command"] = command + if (parameter) + signal.data["parameter"] = parameter radio_connection.post_signal(src, signal) // world << text("Signal [] Broadcasted to []", command, target) @@ -67,9 +88,9 @@ return_text() if(!(istype(usr, /mob/living/silicon)) && locked) - return "[alarm_zone] Air Alarm[return_status()]
(Swipe ID card to unlock interface)" + return "[src][return_status()]
(Swipe ID card to unlock interface)" else - return "[alarm_zone] Air Alarm[return_status()]
[return_controls()]" + return "[src][return_status()]
[return_controls()]" return_status() var/turf/location = src.loc @@ -182,7 +203,7 @@ "} output += "TOGGLE PANIC SYPHON IN AREA" - output += "
Reinitialize atmospheric machinery in area" + //output += "
Reinitialize atmospheric machinery in area" else var/sensor_data if(src.device == "Scrubbers") @@ -200,6 +221,8 @@ sensor_part += "Dea":"red'>A")]ctivate panic syphon
" if(data["panic"]) sensor_part += "PANIC SYPHON ACTIVATED" + if (data["timestamp"]+3 < air_master.current_cycle) + sensor_part += "[long_name] not responding.
" sensor_part += "
" else sensor_part = "[long_name] can not be found!

" @@ -217,14 +240,16 @@ if(data) sensor_part += {"Operating: [data["power"]]
- Pressure checks: [data["checks"]?"on":"off"]
-
"} + Pressure checks: [data["checks"]?"on":"off"]
"} + if (data["timestamp"]+3 < air_master.current_cycle) + sensor_part += "[long_name] not responding.
" + sensor_part += "
" else sensor_part = "[long_name] can not be found!
" sensor_data += sensor_part else - sensor_data = "No scrubbers connected.
" + sensor_data = "No vents connected.
" output = {"[sensor_data]Main menu
"} @@ -293,9 +318,9 @@ for(var/P in vents) send_signal(P, "power_off") panic = !panic - if(href_list["reinit_atmos_machinery"]) +/* if(href_list["reinit_atmos_machinery"]) var/A = get_area(loc) - connect_area_atmos_machinery(A) + connect_area_atmos_machinery(A)*/ spawn(5) @@ -306,13 +331,12 @@ /obj/machinery/alarm/New() ..() - - if(!alarm_zone) - var/area/A = get_area(loc) - if(A.name) - alarm_zone = A.name - else - alarm_zone = "Unregistered" + var/area/A = get_area(loc) + if (A.master) + A = A.master + area_uid = A.uid + if (name == "alarm") + name = "[A.name] Air Alarm" /obj/machinery/alarm/process() if (src.skipprocess) @@ -404,16 +428,19 @@ if(!frequency) return + var/area/A = get_area(loc) var/datum/signal/alert_signal = new alert_signal.source = src alert_signal.transmission_method = 1 - alert_signal.data["zone"] = alarm_zone + alert_signal.data["zone"] = A.name alert_signal.data["type"] = "Atmospheric" if(alert_level==0) alert_signal.data["alert"] = "severe" - else + else if (alert_level==1) alert_signal.data["alert"] = "minor" + else if (alert_level==0) + alert_signal.data["alert"] = "clear" frequency.post_signal(src, alert_signal) @@ -432,6 +459,7 @@ if(src.allowed(usr)) locked = !locked user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface." + src.updateUsrDialog() else user << "\red Access denied." return diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 6692f2b8fdc..50a16090a02 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -491,12 +491,14 @@ Rate: [volume_rate] L/sec
"} if(!zone || !severity) return + minor_alarms -= zone + priority_alarms -= zone if(severity=="severe") - priority_alarms -= zone priority_alarms += zone - else - minor_alarms -= zone + else if (severity=="minor") minor_alarms += zone + else /*"clear"*/ + //do nothing proc set_frequency(new_frequency) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index f18d2f26d4f..f2a73a52e0f 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -178,7 +178,7 @@ Release Pressure: - Close
"} - user << browse(output_text, "window=canister;size=600x300") + user << browse("[src][output_text]", "window=canister;size=600x300") onclose(user, "canister") return diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 593581903f9..821db91891f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -12,10 +12,11 @@ Pod/Blast Doors computer return 1 if(usr.restrained() || usr.lying || usr.stat) return 1 - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - if (!istype(usr, /mob/living/silicon)) - usr << "\red You don't have the dexterity to do this!" - return 1 + if ( ! (istype(usr, /mob/living/carbon/human) || \ + istype(usr, /mob/living/silicon) || \ + istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) + usr << "\red You don't have the dexterity to do this!" + return 1 if ((!in_range(src, usr) || !istype(src.loc, /turf)) && !istype(usr, /mob/living/silicon)) return 1 src.add_fingerprint(usr) @@ -28,14 +29,15 @@ Pod/Blast Doors computer return src.attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN|MAINT)) return 1 if(user.lying || user.stat) return 1 - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - if (!istype(user, /mob/living/silicon)) - usr << "\red You don't have the dexterity to do this!" - return 1 + if ( ! (istype(usr, /mob/living/carbon/human) || \ + istype(usr, /mob/living/silicon) || \ + istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) + usr << "\red You don't have the dexterity to do this!" + return 1 if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon)) return 1 if (ishuman(user)) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6373e77cc7b..4987faacb37 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -93,12 +93,12 @@ Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
Oxygen deprivation: [round(src.occupant.oxyloss,0.1)]
Brute damage: [round(src.occupant.bruteloss,0.1)]
Fire damage: [round(src.occupant.fireloss,0.1)]
Toxin damage: [round(src.occupant.toxloss,0.1)]
Body temperature: [src.occupant.bodytemperature]" : "None"]
"} - + user.machine = src user << browse(dat, "window=cryo") onclose(user, "cryo") Topic(href, href_list) - if (( usr.machine==src && ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + if ((get_dist(src, usr) <= 1) || istype(usr, /mob/living/silicon/ai)) if(href_list["start"]) src.on = !src.on build_icon() @@ -113,33 +113,19 @@ attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(src.beaker) - user << "A beaker is already loaded into the machine." + user << "\red A beaker is already loaded into the machine." return src.beaker = G user.drop_item() G.loc = src - user.visible_message("[user] adds a beaker to \the [src]!", "You add a beaker to the [src]!") + user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") else if(istype(G, /obj/item/weapon/grab)) if(!ismob(G:affecting)) return - if (src.occupant) - user << "\blue The cryo cell is already occupied!" - return - if (G:affecting.abiotic()) - user << "Subject may not have abiotic items on." - return var/mob/M = G:affecting - if (M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - src.occupant = M - for(var/obj/O in src) - O.loc = src.loc - src.add_fingerprint(user) - build_icon() - del(G) + if(put_mob(M)) + del(G) src.updateUsrDialog() return @@ -224,6 +210,26 @@ src.occupant = null build_icon() return + put_mob(mob/M as mob) + if (src.occupant) + usr << "\red The cryo cell is already occupied!" + return + if (M.abiotic()) + usr << "\red Subject may not have abiotic items on." + return + if(!src.node) + usr << "\red The cell is not corrrectly connected to its pipe network!" + return + if (M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.pulling = null + M.loc = src + src.occupant = M + M.metabslow = 1 + src.add_fingerprint(usr) + build_icon() + return 1 verb move_eject() @@ -240,25 +246,7 @@ set src in oview(1) if (usr.stat != 0 || stat & (NOPOWER|BROKEN)) return - if (src.occupant) - usr << "\blue The cell is already occupied!" - return - if (usr.abiotic()) - usr << "Subject may not have abiotic items on." - return - if(!src.node) - usr << "The cell is not corrrectly connected to its pipe network!" - return - usr.pulling = null - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - usr.metabslow = 1 - src.occupant = usr - /*for(var/obj/O in src) - O.loc = src.loc*/ - src.add_fingerprint(usr) - build_icon() + put_mob(usr) return diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 60dd958b329..2cbfd8cefa9 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -2,38 +2,111 @@ Buildable pipes Buildable meters */ +#define PIPE_SIMPLE_STRAIGHT 0 +#define PIPE_SIMPLE_BENT 1 +#define PIPE_HE_STRAIGHT 2 +#define PIPE_HE_BENT 3 +#define PIPE_CONNECTOR 4 +#define PIPE_MANIFOLD 5 +#define PIPE_JUNCTION 6 +#define PIPE_UVENT 7 +#define PIPE_MVALVE 8 +#define PIPE_PUMP 9 +#define PIPE_SCRUBBER 10 +#define PIPE_INSULATED_STRAIGHT 11 +#define PIPE_INSULATED_BENT 12 /obj/item/weapon/pipe name = "pipe" desc = "A pipe" var/pipe_type = 0 - var/pipe_dir = 0 + //var/pipe_dir = 0 + var/pipename icon = 'pipe-item.dmi' - icon_state = "straight" + icon_state = "simple" item_state = "buildpipe" flags = TABLEPASS|FPRINT w_class = 4 level = 2 - -/obj/item/weapon/pipe/New() + //TODO: список номер_типа -> тип +/obj/item/weapon/pipe/New(var/loc, var/pipe_type as num, var/dir as num, var/obj/machinery/atmospherics/make_from = null) ..() + if (make_from) + src.dir = make_from.dir + src.pipename = make_from.name + var/is_bent + if (make_from.initialize_directions in list(NORTH|SOUTH, WEST|EAST)) + is_bent = 0 + else + is_bent = 1 + if (istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction)) + src.pipe_type = PIPE_JUNCTION + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging)) + src.pipe_type = PIPE_HE_STRAIGHT + is_bent + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple)) + src.pipe_type = PIPE_SIMPLE_STRAIGHT + is_bent + else if(istype(make_from, /obj/machinery/atmospherics/portables_connector)) + src.pipe_type = PIPE_CONNECTOR + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold)) + src.pipe_type = PIPE_MANIFOLD + else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump)) + src.pipe_type = PIPE_UVENT + else if(istype(make_from, /obj/machinery/atmospherics/valve)) + src.pipe_type = PIPE_MVALVE + else if(istype(make_from, /obj/machinery/atmospherics/binary/pump)) + src.pipe_type = PIPE_PUMP + else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_scrubber)) + src.pipe_type = PIPE_SCRUBBER + else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/insulated)) + src.pipe_type = PIPE_INSULATED_STRAIGHT + is_bent + if (is_bent) + src.dir = make_from.initialize_directions //workaround. Bent pipes with one node==null have cardinal direction. - rastaf0 + else + src.pipe_type = pipe_type + src.dir = dir + //src.pipe_dir = get_pipe_dir() update() //update the name and icon of the pipe item depending on the type /obj/item/weapon/pipe/proc/update() - var/list/nlist = list("pipe", "bent pipe", "h/e pipe", "bent h/e pipe", "connector", "manifold", "junction", "uvent", "mvalve", "pump", "scrubber") + var/list/nlist = list( \ + "pipe", \ + "bent pipe", \ + "h/e pipe", \ + "bent h/e pipe", \ + "connector", \ + "manifold", \ + "junction", \ + "uvent", \ + "mvalve", \ + "pump", \ + "scrubber", \ + "insulated pipe", \ + "bent insulated pipe", \ + ) name = nlist[pipe_type+1] + " fitting" + var/list/islist = list( \ + "simple", \ + "simple", \ + "he", \ + "he", \ + "connector", \ + "manifold", \ + "junction", \ + "uvent", \ + "mvalve", \ + "pump", \ + "scrubber", \ + "insulated", \ + "insulated", \ + ) + icon_state = islist[pipe_type + 1] updateicon() //update the icon of the item /obj/item/weapon/pipe/proc/updateicon() - - var/list/islist = list("straight", "bend", "he-straight", "he-bend", "connector", "manifold", "junction", "uvent", "mvalve", "pump", "scrubber") - - icon_state = islist[pipe_type + 1] - if(invisibility) // true if placed under floor icon -= rgb(0,0,0,128) // fade the icon else @@ -60,318 +133,274 @@ Buildable meters if ( usr.stat || usr.restrained() ) return - switch(pipe_type) - if(0) - if(icon_state == "straight") - pipe_dir = 12 - icon_state = "straight12" - else if (icon_state == "straight12") - pipe_dir = 3 - icon_state = "straight" - if(1) - if(icon_state == "bend9") - icon_state = "bend" - pipe_dir = 10 - else if(icon_state == "bend") - icon_state = "bend6" - pipe_dir = 6 - else if(icon_state == "bend6") - icon_state = "bend5" - pipe_dir = 5 - else if(icon_state == "bend5") - icon_state = "bend9" - pipe_dir = 9 - - if(2) - if(icon_state == "he-straight") - icon_state = "he-straight12" - pipe_dir = 12 - else if(icon_state == "he-straight12") - icon_state = "he-straight" - pipe_dir = 3 - - if(3) - if(icon_state == "he-bend") - icon_state = "he-bend9" - pipe_dir = 9 - else if(icon_state == "he-bend6") - icon_state = "he-bend" - pipe_dir = 10 - else if(icon_state == "he-bend5") - icon_state = "he-bend6" - pipe_dir = 6 - else if(icon_state == "he-bend9") - icon_state = "he-bend5" - pipe_dir = 5 - - if(4,7,5,6,7,8,9,10) - src.dir = turn(src.dir, -90) + src.dir = turn(src.dir, -90) + //src.pipe_dir = get_pipe_dir() return -// returns the p_dir from the pipe item type and dir +/obj/item/weapon/pipe/Move() + var/dir = src.dir + ..() + src.dir = dir + return -/obj/item/weapon/pipe/proc/get_pdir() +// returns all pipe's endpoints +/obj/item/weapon/pipe/proc/get_pipe_dir() + if (!dir) + return 0 var/flip = turn(dir, 180) var/cw = turn(dir, -90) var/acw = turn(dir, 90) switch(pipe_type) - if(0) - if(pipe_dir == 0) - pipe_dir = 3 - return pipe_dir - if(1) - if(pipe_dir == 0) - pipe_dir = 10 - return pipe_dir - if(2,3) - return 0 - if(4,7,10) + if( PIPE_SIMPLE_STRAIGHT, \ + PIPE_INSULATED_STRAIGHT, \ + PIPE_HE_STRAIGHT, \ + PIPE_JUNCTION ,\ + PIPE_PUMP ,\ + PIPE_MVALVE \ + ) + return dir|flip + if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT) + return dir //dir|acw + if(PIPE_CONNECTOR,PIPE_UVENT,PIPE_SCRUBBER) return dir - if(5) - return dir|cw|acw - if(6) + if(PIPE_MANIFOLD) + return flip|cw|acw + return 0 + +/obj/item/weapon/pipe/proc/get_pdir() //endpoints for regular pipes + + var/flip = turn(dir, 180) +// var/cw = turn(dir, -90) +// var/acw = turn(dir, 90) + + if (!(pipe_type in list(PIPE_HE_STRAIGHT, PIPE_HE_BENT, PIPE_JUNCTION))) + return get_pipe_dir() + switch(pipe_type) + if(PIPE_HE_STRAIGHT,PIPE_HE_BENT) + return 0 + if(PIPE_JUNCTION) return flip return 0 // return the h_dir (heat-exchange pipes) from the type and the dir -/obj/item/weapon/pipe/proc/get_hdir() +/obj/item/weapon/pipe/proc/get_hdir() //endpoints for h/e pipes // var/flip = turn(dir, 180) // var/cw = turn(dir, -90) switch(pipe_type) - if(0,1,4,5,7,10) - return 0 - if(2) - if(pipe_dir == 0) - pipe_dir = 3 - return pipe_dir - if(3) - if(pipe_dir == 0) - pipe_dir = 10 - return pipe_dir - if(6) + if(PIPE_HE_STRAIGHT) + return get_pipe_dir() + if(PIPE_HE_BENT) + return get_pipe_dir() + if(PIPE_JUNCTION) return dir + else + return 0 - return 0 +/obj/item/weapon/pipe/attack_self(mob/user as mob) + return rotate() /obj/item/weapon/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) //* - if (istype(W, /obj/item/weapon/wrench)) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!isturf(src.loc)) + return 1 + var/pipe_dir = get_pipe_dir() - var/pipedir = src.get_pdir()|src.get_hdir() // all possible pipe dirs including h/e# + for(var/obj/machinery/atmospherics/M in src.loc) + if(M.initialize_directions & pipe_dir) // matches at least one direction on either type of pipe + user << "\red There is already a pipe at that location." + return 1 + // no conflicts found - for(var/obj/machinery/atmospherics/M in src.loc) - if( (M.initialize_directions & pipedir) || (M.initialize_directions & pipedir) ) // matches at least one direction on either type of pipe - user << "There is already a pipe at that location." - return - playsound(src.loc, 'Ratchet.ogg', 50, 1) + var/pipefailtext = "\red There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - // no conflicts found + switch(pipe_type) + if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) + var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) + P.dir = src.dir + P.initialize_directions = pipe_dir + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() - // 0 1 2 3 4 5 6 7 8 9 10 - //"pipe", "bent pipe", "h/e pipe", "bent h/e pipe", "connector", "manifold", "junction", "vent", "valve", "pump", "filter inlet" + if(PIPE_HE_STRAIGHT, PIPE_HE_BENT) + var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc ) + P.dir = src.dir + P.initialize_directions = 0 + P.initialize_directions_he = pipe_dir + //var/turf/T = P.loc + //P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() + + if(PIPE_CONNECTOR) // connector + var/obj/machinery/atmospherics/portables_connector/C = new( src.loc ) + C.dir = dir + C.initialize_directions = pipe_dir + if (pipename) + C.name = pipename + C.initialize() + C.build_network() + if (C.node) + C.node.initialize() + C.node.build_network() + if(PIPE_MANIFOLD) //manifold + var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc ) + M.dir = dir + M.initialize_directions = pipe_dir + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() - switch(pipe_type) - if(0) // straight pipe - var/obj/machinery/atmospherics/pipe/simple/P = new /obj/machinery/atmospherics/pipe/simple( src.loc ) - switch (icon_state) - if("straight") - P.dir = NORTH - P.initialize_directions = NORTH|SOUTH - if("straight12") - P.dir = EAST - P.initialize_directions = EAST|WEST - var/turf/T = P.loc - switch (T.intact) - if(1) P.level = 2 - if(0) P.level = 1 - P.initialize() - if (P) - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2:initialize() - P.node2.build_network() - else - usr << "There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - return - - if(1) // bent pipe - var/obj/machinery/atmospherics/pipe/simple/P = new /obj/machinery/atmospherics/pipe/simple( src.loc ) - switch (icon_state) - if("bend") - P.dir = SOUTHWEST - P.initialize_directions = SOUTH|WEST - if("bend6") - P.dir = SOUTHEAST - P.initialize_directions = SOUTH|EAST - if("bend5") - P.dir = NORTHEAST - P.initialize_directions = NORTH|EAST - if("bend9") - P.dir = NORTHWEST - P.initialize_directions = NORTH|WEST - var/turf/T = P.loc - switch (T.intact) - if(1) P.level = 2 - if(0) P.level = 1 - P.initialize() - if (P) - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2:initialize() - P.node2.build_network() - else - usr << "There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - return - + if(PIPE_JUNCTION) + var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) + P.dir = src.dir + P.initialize_directions = src.get_pdir() + P.initialize_directions_he = src.get_hdir() + //var/turf/T = P.loc + //P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << "There's nothing to connect this junction to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() /* - if(2,3) // straight or bent h/e pipe - P = new/obj/machinery/pipes/heat_exch( src.loc ) - P.h_dir = get_hdir() - P.icon_state = get_hdir() - P.level = 2 - P.update() - - var/list/dirs = P.get_dirs() + if(6) //junctions + var/obj/machinery/junction/J = new( src.loc ) + J.dir = dir + J.p_dir = src.get_pdir() + J.h_dir = src.get_hdir() + J.level = 2 */ - - if(4) // connector - var/obj/machinery/atmospherics/portables_connector/C = new( src.loc ) - C.dir = dir - C.initialize_directions = dir -/* var/turf/T = C.loc - switch (T.intact) - if(1) V.level = 2 - if(0) V.level = 1*/ - C.initialize() - C.build_network() - if (C.node) - C.node.initialize() - C.node.build_network() + if(PIPE_UVENT) //unary vent + var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc ) + V.dir = dir + V.initialize_directions = pipe_dir + if (pipename) + V.name = pipename + V.initialize() + V.build_network() + if (V.node) + V.node.initialize() + V.node.build_network() - if(5) //manifold - var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc ) - M.dir = dir - M.New() - var/turf/T = M.loc - switch (T.intact) - if(1) M.level = 2 - if(0) M.level = 1 - M.initialize() - if (M) - M.build_network() - if (M.node1) - M.node1.initialize() - M.node1.build_network() - if (M.node2) - M.node2.initialize() - M.node2.build_network() - if (M.node3) - M.node3.initialize() - M.node3.build_network() - else - usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - return -/* - if(6) //junctions - var/obj/machinery/junction/J = new( src.loc ) - J.dir = dir - J.p_dir = src.get_pdir() - J.h_dir = src.get_hdir() - J.level = 2 -*/ - if(7) //unary vent - var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc ) - V.dir = dir - V.initialize_directions = dir -/* var/turf/T = V.loc - switch (T.intact) - if(1) V.level = 2 - if(0) V.level = 1*/ - V.initialize() - V.build_network() - if (V.node) - V.node.initialize() - V.node.build_network() - - - if(8) //manual valve - var/obj/machinery/atmospherics/valve/V = new( src.loc) - V.dir = dir - switch(dir) - if(NORTH) - V.initialize_directions = NORTH|SOUTH - if(SOUTH) - V.initialize_directions = NORTH|SOUTH - if(EAST) - V.initialize_directions = EAST|WEST - if(WEST) - V.initialize_directions = EAST|WEST -/* var/turf/T = V.loc - switch (T.intact) - if(1) V.level = 2 - if(0) V.level = 1*/ - V.initialize() - V.build_network() - if (V.node1) + if(PIPE_MVALVE) //manual valve + var/obj/machinery/atmospherics/valve/V = new( src.loc) + V.dir = dir + V.initialize_directions = pipe_dir + if (pipename) + V.name = pipename + V.initialize() + V.build_network() + if (V.node1) // world << "[V.node1.name] is connected to valve, forcing it to update its nodes." - V.node1.initialize() - V.node1.build_network() - if (V.node2) + V.node1.initialize() + V.node1.build_network() + if (V.node2) // world << "[V.node2.name] is connected to valve, forcing it to update its nodes." - V.node2.initialize() - V.node2.build_network() + V.node2.initialize() + V.node2.build_network() - if(9) //gas pump - var/obj/machinery/atmospherics/binary/pump/P = new(src.loc) - P.dir = dir - P.New() -/* var/turf/T = P.loc - switch (T.intact) - if(1) P.level = 2 - if(0) P.level = 1*/ - P.initialize() - P.build_network() - if (P.node1) - P.node1.initialize() - P.node1.build_network() - if (P.node2) - P.node2.initialize() - P.node2.build_network() + if(PIPE_PUMP) //gas pump + var/obj/machinery/atmospherics/binary/pump/P = new(src.loc) + P.dir = dir + P.initialize_directions = pipe_dir + if (pipename) + P.name = pipename + P.initialize() + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() - if(10) //scrubber - var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc) - S.dir = dir - S.initialize_directions = dir -/* var/turf/T = S.loc - switch (T.intact) - if(1) V.level = 2 - if(0) V.level = 1*/ - S.initialize() - S.build_network() - if (S.node) - S.node.initialize() - S.node.build_network() + if(PIPE_SCRUBBER) //scrubber + var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc) + S.dir = dir + S.initialize_directions = pipe_dir + if (pipename) + S.name = pipename + S.initialize() + S.build_network() + if (S.node) + S.node.initialize() + S.node.build_network() + if(PIPE_INSULATED_STRAIGHT, PIPE_INSULATED_BENT) + var/obj/machinery/atmospherics/pipe/simple/insulated/P = new( src.loc ) + P.dir = src.dir + P.initialize_directions = pipe_dir + var/turf/T = P.loc + P.level = T.intact ? 2 : 1 + P.initialize() + if (!P) + usr << pipefailtext + return 1 + P.build_network() + if (P.node1) + P.node1.initialize() + P.node1.build_network() + if (P.node2) + P.node2.initialize() + P.node2.build_network() - - - user << "You have fastened the pipe" - del(src) // remove the pipe item + playsound(src.loc, 'Ratchet.ogg', 50, 1) + user.visible_message( \ + "[user] fastens the pipe.", \ + "\blue You have fastened the pipe.", \ + "You hear ratchet.") + del(src) // remove the pipe item return //TODO: DEFERRED @@ -391,13 +420,26 @@ Buildable meters /obj/item/weapon/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (istype(W, /obj/item/weapon/wrench)) - if(locate(/obj/machinery/atmospherics/pipe, src.loc)) - new/obj/machinery/meter( src.loc ) - playsound(src.loc, 'Ratchet.ogg', 50, 1) - user << "You have fastened the meter to the pipe" - del(src) - else - user << "You need to fasten it to a pipe" - return + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) + user << "\red You need to fasten it to a pipe" + return 1 + new/obj/machinery/meter( src.loc ) + playsound(src.loc, 'Ratchet.ogg', 50, 1) + user << "\blue You have fastened the meter to the pipe" + del(src) +#undef PIPE_SIMPLE_STRAIGHT +#undef PIPE_SIMPLE_BENT +#undef PIPE_HE_STRAIGHT +#undef PIPE_HE_BENT +#undef PIPE_CONNECTOR +#undef PIPE_MANIFOLD +#undef PIPE_JUNCTION +#undef PIPE_UVENT +#undef PIPE_MVALVE +#undef PIPE_PUMP +#undef PIPE_SCRUBBER +#undef PIPE_INSULATED_STRAIGHT +#undef PIPE_INSULATED_BENT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 564d4c7820f..4ce7cb87d68 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -11,19 +11,28 @@ /obj/machinery/pipedispenser/attack_hand(user as mob) if(..()) return - var/dat = {" -Pipe
-
Bent Pipe
-
Connector
-
Manifold
-
Unary Vent
-
Manual Valve
-
Gas Pump
-
Scrubber
"} +Regular pipes:
+
Pipe
+Bent Pipe
+Connector
+Manifold
+Unary Vent
+Manual Valve
+Gas Pump
+Scrubber
+Meter
+Heat exchange:
+Pipe
+Bent Pipe
+Junction
+Insulated pipes:
+Pipe
+Bent Pipe
+"} - user << browse("Pipe Dispenser[dat]", "window=pipedispenser") + user << browse("[src][dat]", "window=pipedispenser") onclose(user, "pipedispenser") return @@ -34,13 +43,15 @@ src.add_fingerprint(usr) if(href_list["make"]) var/p_type = text2num(href_list["make"]) - var/obj/item/weapon/pipe/P = new /obj/item/weapon/pipe(src.loc) - P.pipe_type = p_type + var/p_dir = text2num(href_list["dir"]) + var/obj/item/weapon/pipe/P = new (usr.loc, pipe_type=p_type, dir=p_dir) P.update() + if(href_list["makemeter"]) + new /obj/item/weapon/pipe_meter(usr.loc) - for(var/mob/M in viewers(1, src)) +/* for(var/mob/M in viewers(1, src)) if ((M.client && M.machine == src)) - src.attack_hand(M) + src.attack_hand(M)*/ return /obj/machinery/pipedispenser/New() @@ -67,7 +78,7 @@ Trunk
"} - user << browse("Disposal Pipe Dispenser[dat]", "window=pipedispenser") + user << browse("[src][dat]", "window=pipedispenser") return // 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk diff --git a/code/game/machinery/processor.dm b/code/game/machinery/processor.dm index ca1b9b06bf7..fc99311783c 100644 --- a/code/game/machinery/processor.dm +++ b/code/game/machinery/processor.dm @@ -115,14 +115,14 @@ src.processing = 1 user.visible_message("\blue [user] turns on \a [src].", \ "You turn on \a [src].", \ - "You hear food processor") + "You hear a food processor") playsound(src.loc, 'blender.ogg', 50, 1) use_power(50) sleep(P.time) P.process(src.loc, O) src.processing = 0 src.visible_message("\blue \the [src] finished processing.", \ - "You hear food processor stop") + "You hear food processor stops") diff --git a/code/game/machinery/singularity.dm b/code/game/machinery/singularity.dm index f3d44c320e4..7d68e9cf9d2 100644 --- a/code/game/machinery/singularity.dm +++ b/code/game/machinery/singularity.dm @@ -217,11 +217,14 @@ However people seem to like it for some reason. if(isturf(A,/turf/simulated/floor/engine)) //here was a bug. But now it's a feature. -rasta0 return*/ - if(istype(A,/turf/simulated/floor)) +/* if(istype(A,/turf/simulated/floor)) A:ReplaceWithSpace() gain = 2 else - A:ReplaceWithFloor() + A:ReplaceWithFloor()*/ + A:ReplaceWithSpace() // + gain = 2 + src.energy += gain /////////////////////////////////////////////Controls which "event" is called diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 0a298a68cc3..2b628aa85f6 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -46,10 +46,10 @@ datum/controller/game_controller for(var/obj/machinery/atmospherics/machine in world) machine.build_network() - world << "\red \b Initializing atmos machinery" + /*world << "\red \b Initializing atmos machinery" sleep(-1) - find_air_alarms() + find_air_alarms()*/ world << "\red \b Initializations complete." diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 727609f4f3f..b308d2dc04b 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -158,12 +158,11 @@ move an amendment to the drawing.

/obj/item/blueprints/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle) - for(var/area/RA in A.related) - for(var/obj/machinery/alarm/M in RA) - M.alarm_zone = title if (!oldtitle) // or dd_replacetext goes to infinite loop return for(var/area/RA in A.related) + for(var/obj/machinery/alarm/M in RA) + M.name = dd_replacetext(M.name,oldtitle,title) for(var/obj/machinery/power/apc/M in RA) M.name = dd_replacetext(M.name,oldtitle,title) for(var/obj/machinery/atmospherics/unary/vent_scrubber/M in RA) diff --git a/code/game/objects/stacks/stack.dm b/code/game/objects/stacks/stack.dm index 766ce6ad3ac..ba8d7c06d1b 100644 --- a/code/game/objects/stacks/stack.dm +++ b/code/game/objects/stacks/stack.dm @@ -71,11 +71,11 @@ else to_transfer = min(src.amount, S.max_amount-S.amount) S.amount+=to_transfer + if (S && usr.machine==S) + spawn(0) S.interact(usr) src.use(to_transfer) if (src && usr.machine==src) spawn(0) src.interact(usr) - if (S && usr.machine==S) - spawn(0) S.interact(usr) else return ..() /obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj) diff --git a/code/game/objects/tank.dm b/code/game/objects/tank.dm index 589ef13ddbe..380e0821afe 100644 --- a/code/game/objects/tank.dm +++ b/code/game/objects/tank.dm @@ -225,7 +225,7 @@ if (istype(src.loc, /obj/item/assembly)) icon = src.loc if (!in_range(src, usr)) - if (icon == src) usr << "\blue It's a \icon[icon][src]! If you want any more information you'll need to get closer." + if (icon == src) usr << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer." return var/celsius_temperature = src.air_contents.temperature-T0C @@ -244,7 +244,7 @@ else descriptive = "furiously hot" - usr << text("\blue The \icon[][src] feels []", icon, descriptive) + usr << text("\blue \The \icon[][src] feels []", icon, descriptive) return diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f72b118622c..02444afe54f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -449,7 +449,7 @@ cell.updateicon() src.cell = null - user.visible_message("\red [user.name] remove the power cell from [src.name]!", "You remove the power cell.") + user.visible_message("\red [user.name] removes the power cell from [src.name]!", "You remove the power cell.") //user << "You remove the power cell." charging = 0 src.updateicon() @@ -457,6 +457,7 @@ else if(stat & (BROKEN|MAINT)) return // do APC interaction + user.machine = src src.interact(user) @@ -478,7 +479,6 @@ user << browse(null, "window=apc") return if(wiresexposed && (!istype(user, /mob/living/silicon))) - user.machine = src var/t1 = text("[area.name] APC wiresAccess Panel
\n") var/list/apcwires = list( "Orange" = 1, diff --git a/icons/obj/atmospherics/red_pipe.dmi b/icons/obj/atmospherics/red_pipe.dmi index a93eb8ad47e17e894597c1d383a5b1364aff9fc2..ff9d9e8a59a28810e5baec599686d5ef2651dcd0 100644 GIT binary patch literal 3950 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 literal 1042 zcmeAS@N?(olHy`uVBq!ia0y~yU{(OK6*$;{?)J5LwKkcv5P@80gc zZ6&}EptYlRrtMM&Z`LKt3sX-W_uAq2Ke%zeeU;jjE@89}K@;6z5 zL2*oxk&%I6*2D%N`>clp14BcaiUI?JgRzhR1H%GIP7Vf!3q33>3=A1=OiT<6Cdx?4 z|4ff%_`y=V_O*=R){f7wBo5?0i|Q{va!Kjj>g1TfHnn8g+N`VBD)&17{dv6Vk;wjK z-sfw-|Eu3ycGj@n-@z^Z!d>f$UqbS4PJXy?%BCr0rIYqC{Zz2kd0}*S_kc9QnKE~wc)0w@`QUr8_pQ{_)C31cRuCM-#c~R9{sW1zUSLrkgK!G z7$?nr_vg;N*RLj@D(u(z|Nqwv(f!l*SamGfF@H&#xWdeT|0DiHefdApSMai;CZ{ED z#kG~@!AFWbyqx^}|6F_;P`_^aqzU2Dc8r~Gm{h8l9KHJ1P)`3??8fY%H$nTvY>yxL z@%-t7x{0w3DZl>LeyR8Rd8I)zKbZTyVgF{mb&Q41 z4JNTM%%7ILT`rk!?=`U@Vvp^?d%vRZvS$7NYB;&Fx$LAXa6u(U^q}cp`ge2&_|p5cmKY+bbtFEV0xH~l&m1BFoqeJ+?ap9 m>kHMj05MTg9*%^1CO>{>|Lc!uxc&iCGlQqApUXO@geCxvh3+2! diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index acd3d2b85581e54b02a154cc2fd65cdeba7a7874..d973bd0df6d1479ac25d31414fa397c23f1c6ffe 100644 GIT binary patch literal 10824 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 DEztzm literal 12646 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 diff --git a/icons/obj/pipes/heat.dmi b/icons/obj/pipes/heat.dmi index 48f0f3bb99ea13a2cad98de3977ca2ceed8a290a..2de846ce67c16d1798c38b3343321aeb4107a8c0 100644 GIT binary patch delta 1543 zcmV+i2Kf2a4WJBAiBL{Q4GJ0x0000DNk~Le0002M0002M1Oos70HE@5Gynhq5>QN3 zMZmzo0000~R8&`3V*da$z`($5(>03#0004WQchCfFEbuAQ zO(Li;wW1)uI5ox4fLN6VhPYHJE4cc(fPD=B=?zBa%=O~F000FmNkl*IbsqK#uBy&{mHe5?FOg=Job;s zwZ{Rz-$j=Om@8)Y!R=;%tz!20sC_hpd0TD!^ZEI_!LmvY%wI*uMM~sjG+2b>Fk20X08I>p;;{Ow3ft&7P<^=);SWpO0Sq3?$_fmI zHBcXZ-o0q=EjgI0D6|?tiv|5}fIfi1yeQ~@Q5PKv(9(h0CZE9#5Cc@k!EpU>0T+E0 zfC)sw#=X0VNXoW~KGY%ao?P`U~XU}EaNk+lQZ$n0XYJxPeLfUIDr$2Es`1_D$# zI-ijU008DS^5-?Lta%*ZJjo$$p27k$Gs90No9zssy39$iKmeaxn$0RnB}`YUii`4vmG!4=891~2I#?g4`QKCvBN^FbSb)@n`zbcV1(Nivi@r@%$N z4TlwX8XzCT8Y`_)Z5(JByawnhfmLGaDr0Ei!8XWIy$1L?59-{+IGNBmm}=tyk5pKx zXGVH;B zE;<{4YBhj=VZa-p4sdk65CMF@i+&Y=4Lmc9K&&C6J%mX_dAWXw@_B6>#pEXj*!OyQD?>{wVoaLAHPh58}N z=k4)}xhc2%TH*5b!yM)F`u}2fy&{f@`XSbUF{r_RRH_g7lZE@fSX4hmSCOS)0ZJ7P zLj>e@R6j)H;OYK1eTp@jK80YE=K+j{zz%@;@xd4X%4>wKguCm9hBNqO8qBh5p24@JkjfQv2#fU@ctx9vVIT*Jf)9#79dh!_AB2DojHZ<=ZBuLk~J zqkb3WAG$SgcT2UsF#nJk2MtC}%x-`>z}L?oRP*^!0IHoX^6(kWVh&t}+rt2d`}ll+ zfO|gR+5oADR02Q&PT;oP$3?(YOf3PR5G`=q9^b|AR8}y~0IWY4et)P|Kcq6VVFqyh zK`OT#)?fka4^r9jD1%`ALGJybtmxGGAz7geG6>cmq-(4(4TALtnJRINL9qUy_WU2W zsr5sqQXggD*B|7cHH>JWJ{)R5e1E8a&cLrfNZDvSsP?}B>HtTsKWI6FU+1D~vOEg# z|LySl0Nd#R-d7SiPqcW$rb_^#^1w2GsQj tWIH{vx&i6{N9R2ez}XBAPj3IE{RLw7IJejh<1_#O002ovPDHLkV1oZ%&vXC) delta 1726 zcmV;v20{6t4Al)KiBL{Q4GJ0x0000DNk~Le0004?0000W2nGNE095g;H2?qrf{{=y ze=06XEJ;#QV zn?!_vh)`rkj6nuOC^98NjU^Fka4Aq$aP@OhaPjrz0szz6e}D&Xy&V7m1`bI?K~#90 z?VUT0+%OD=z{*D3rDl^nGm`tNz;o`n1*#*4n$YSUcgm;AfAne{lnZ8+cEENF>V-Wq6i> zc)MPP+x7DQ^mePZ!Kb=EKi&>Ce+YBi$Xa{X*V6ji>-cR6HaNHI#re!MO~zU~%=7Hj zFWk4*4(qz!J$GdNiyNS2Sw!=vGnE)F!y{1#{DGG;L@tkKUDpAA5~Ni=c(#AE8DXw= zmSx#+Ki6t6SO1t+URVj!G?{sxH!#Scz24o4eE{M?cCpJjkJfA*o{4t#li z-$Gjnxzl4%0f0!L4n50{4Iwr}oP&_|FZFnE8NUDc`LHdtr2dd6{>b@egnK-PQLF!! z=Cd0$$}JF^VX z?Rpt-g=5z#(AiV$?^~y*e+m|VWU1kSbdK`5(!tBX`GO(h9E7-kU3pQD%vG0?`hR}B zIhT6qgrG!!IY{Uqw{OgN+^(0X=UJ+MA5@3E^^fVPfAI2C^1^*m^L?UYptt@x5MP4Z z+ZrlJw&cb& z3-ozBIPL>wYMC#F8vfXfuotdfPpR!6(oAW52FFDbo-N7)-hW2@=XyOYps~N!`u{fm z+FVA68*u})rx*~Pe`)xZH;OKvXDqy-_52bTfvyJ9~n^^2v`SP*V|Nsox; zlbbJR42PDbbqwfi`p@ZG*Rw735A@K#%ezTQ%Xz1`0ebcrP;90_JNxtFEm(${^53qP z2Ll-MOhS3(;v4WOu^*tO{xlZkn-FjU`C-ptp69LfAA*(We?PZhLotY2jhsRMIq%7h z!R4gWE#58lFX8;Jd>9A-rFnoL-ECeAdS=ep$4Y5y}8@0 zHU<%T?^*Pp3RhdZ@aeo%|FvJ(c0?y&`x=4H&|CJ64l z0lF3r<>Jh%et z<6jFeJqJVAz5zPp<2(lwT5pCYb<(+yCD5Jw@{a#+*x6hBahe7c#pJwM^e_-t!i*6jpjeZch&jI+B+(I!1 zN~`qHf#8Xw3Zwhch7V+vy{5@XY1w4mHZrl<_gZm2 zDW?CDfAdl;peq8k;4?pPFVt>F(7(6=+FJ}L1oeno)D7?Sp&pMU60sj&8TL%7Mrva{ zK3eHNr7udxLrnizhrRWHy|R|1{@&ja^e=9Jj?jpJ&m*cq+T)3Fr2dnjMf*wjfy)DN z8HAE@#`G__>&=)xZO@rUXvbO)^dHhGisB_Uf5RWgahvCP!_W2nDIjIvr~y(GB?vVz zAtaY%mHi>U1g9v9k_z{^ETu159uUVlpgkd7f9d?s&e_{vs{Zg_Lg5-bva_}S5y>(@ zbZ>v``e;bkUpoJ@bN2R^s6P$B<0Zbcwf_;(7?7eUPm61lgK`|y04a*1C?fm?n)S5y U5VY?iJpcdz07*qoM6N<$ftBR99GH{{R5Mz`!ctw{QRe00DGTPE!Ct=GbNc004uLP-A~XC@{pX zAhn_(zc@9;(14&(P?ZLTxKt`Dxca$(Jp%w?aXTZS;U!%F00K)%L_t(&f$dpsa)Tfc zg=zDj#P$Hu=>ZDUd$g1B{#U7@gpXawt~isJ_?$Eos*fiu?qe0gLUw22(Ws^wK1$F5 z2-MaIKJ2mSTX;}{qX(o;2+n`qc*Lhk9-0P6wtdP1fi z!0-nWtq0KS3GP;sy>Q+ih&VUSV}R_&bN)akyLo}v1M>dhx`BUf!!ZB~^8P@c5(VfO z6#M}`2FMUo>j`Kau>1iQiJW=@x)wO~1aviW>ItBkPEf!z5Zv7#AP-U2&U;Zh-?5_( zXoZr4%=-eK0_1%G1Ni#_t^)ABfR3bAzEFYB&I^>p{(w(VtzexosF{V8;-EsnDr=!? eHSX9k;2%FV%v}(+^pctY0000i delta 532 zcmV+v0_*+32I~Y+iBL{Q4GJ0x0000DNk~Le0003X0000W1Oos706^Nf2LJ#75>QN3 zMZmzo0000nF)>tBR99GH{{R4=%Bms&0004WQchCCs;=sK*ei9gr2LYhYM-DUHVI$e z&`rjdHzee9g71DiZfG}upA$S?LQg{{Glb-Av*24Ob}1Q;KkoH4VW>53qnL(JUl~I? z`MZ_7tz|(Aov}a#YdbY~g*YN1@4S$JBEg{<8@J)lcu{_*XBXg|84^%@%5@O5w2R@; zti$L_F^~NR2`CoS2HP|Ki3S!cQpuZOK6?nmQaK7n4a!=EVyY5CHPHaNMrv^ zB4SSkf3TBJiIi{9!aO2AZ>-ETEAxn$$KJv`B0jTn!PHDE