diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index f74d2285..fe0f0308 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -120,14 +120,14 @@ if(pressure_delta > 0.5) if(pump_direction) //internal -> external if (node1 && (environment.temperature || air1.temperature)) - var/transfer_moles = calculate_transfer_moles(air1, environment) + var/transfer_moles = calculate_transfer_moles(air1, environment, pressure_delta) power_draw = pump_gas(src, air1, environment, transfer_moles, power_rating) if(power_draw >= 0 && network1) network1.update = 1 else //external -> internal if (node2 && (environment.temperature || air2.temperature)) - var/transfer_moles = calculate_transfer_moles(environment, air2, (network2)? network2.volume : 0) + var/transfer_moles = calculate_transfer_moles(environment, air2, pressure_delta, (network2)? network2.volume : 0) //limit flow rate from turfs transfer_moles = min(transfer_moles, environment.total_moles*air2.volume/environment.volume) //group_multiplier gets divided out here diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 9f1b492e..ecb2eebe 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -26,6 +26,7 @@ var/area_uid var/id_tag = null + var/hibernate = 0 //Do we even process? var/pump_direction = 1 //0 = siphoning, 1 = releasing var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND @@ -88,7 +89,7 @@ /obj/machinery/atmospherics/unary/vent_pump/engine name = "Engine Core Vent" power_channel = ENVIRON - power_rating = 15000 //15 kW ~ 20 HP + power_rating = 30000 //15 kW ~ 20 HP /obj/machinery/atmospherics/unary/vent_pump/engine/New() ..() @@ -150,8 +151,8 @@ /obj/machinery/atmospherics/unary/vent_pump/process() ..() - last_power_draw = 0 - last_flow_rate = 0 + if (hibernate) + return 1 if (!node) use_power = 0 @@ -168,15 +169,26 @@ if((environment.temperature || air_contents.temperature) && pressure_delta > 0.5) if(pump_direction) //internal -> external - var/transfer_moles = calculate_transfer_moles(air_contents, environment) + var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) else //external -> internal - var/transfer_moles = calculate_transfer_moles(environment, air_contents, (network)? network.volume : 0) + var/transfer_moles = calculate_transfer_moles(environment, air_contents, pressure_delta, (network)? network.volume : 0) //limit flow rate from turfs transfer_moles = min(transfer_moles, environment.total_moles*air_contents.volume/environment.volume) //group_multiplier gets divided out here power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) + else + //If we're in an area that is fucking ideal, and we don't have to do anything, chances are we won't next tick either so why redo these calculations? + //JESUS FUCK. THERE ARE LITERALLY 250 OF YOU MOTHERFUCKERS ON ZLEVEL ONE AND YOU DO THIS SHIT EVERY TICK WHEN VERY OFTEN THERE IS NO REASON TO + + if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL && controller_iteration > 10) //99% of all vents + //Fucking hibernate because you ain't doing shit. + hibernate = 1 + spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly + hibernate = 0 + + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) @@ -238,54 +250,41 @@ initial_loc.air_vent_names[id_tag] = new_name src.name = new_name initial_loc.air_vent_info[id_tag] = signal.data - radio_connection.post_signal(src, signal, radio_filter_out) - return 1 - - /obj/machinery/atmospherics/unary/vent_pump/initialize() ..() - //some vents work his own spesial way radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null if(frequency) set_frequency(frequency) - /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return + hibernate = 0 //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return 0 - if(signal.data["purge"] != null) pressure_checks &= ~1 pump_direction = 0 - if(signal.data["stabalize"] != null) pressure_checks |= 1 pump_direction = 1 - if(signal.data["power"] != null) use_power = text2num(signal.data["power"]) - if(signal.data["power_toggle"] != null) use_power = !use_power - if(signal.data["checks"] != null) if (signal.data["checks"] == "default") pressure_checks = pressure_checks_default else pressure_checks = text2num(signal.data["checks"]) - if(signal.data["checks_toggle"] != null) pressure_checks = (pressure_checks?0:3) - if(signal.data["direction"] != null) pump_direction = text2num(signal.data["direction"]) - if(signal.data["set_internal_pressure"] != null) if (signal.data["set_internal_pressure"] == "default") internal_pressure_bound = internal_pressure_bound_default @@ -295,7 +294,6 @@ text2num(signal.data["set_internal_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["set_external_pressure"] != null) if (signal.data["set_external_pressure"] == "default") external_pressure_bound = external_pressure_bound_default @@ -305,32 +303,25 @@ text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["adjust_internal_pressure"] != null) internal_pressure_bound = between( 0, internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["adjust_external_pressure"] != null) - - external_pressure_bound = between( 0, external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["init"] != null) name = signal.data["init"] return - if(signal.data["status"] != null) spawn(2) broadcast_status() return //do not update_icon - //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") spawn(2) broadcast_status() @@ -368,13 +359,11 @@ user << "You are too far away to read the gauge." if(welded) user << "It seems welded shut." - /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat ..() if(old_stat != stat) update_icon() - /obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (!istype(W, /obj/item/weapon/wrench)) return ..() @@ -400,14 +389,12 @@ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) del(src) - /obj/machinery/atmospherics/unary/vent_pump/Del() if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag ..() return - /* Alt-click to vent crawl - Monkeys, aliens, slimes and mice. This is a little buggy but somehow that just seems to plague ventcrawl. diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 8cb3abb9..f85f09a5 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -22,6 +22,8 @@ var/state = STATE_IDLE var/target_state = TARGET_NONE + var/waiting_ticks = 0 + var/waiting_ticks_target = 2 // By default, we wait for two ticks before actually signalling the pump to do it's thing. This is to ensure ZAS registers the doors have closed, and we don't leak air. /datum/computer/file/embedded_program/airlock/New(var/obj/machinery/embedded_controller/M) ..(M) @@ -109,10 +111,14 @@ var/shutdown_pump = 0 switch(command) if("cycle_ext") - begin_cycle_out() + //only respond to these commands if the airlock isn't already doing something + //prevents the controller from getting confused and doing strange things + if(state == target_state) + begin_cycle_out() if("cycle_int") - begin_cycle_in() + if(state == target_state) + begin_cycle_in() if("cycle_ext_door") cycleDoors(TARGET_OUTOPEN) @@ -122,14 +128,6 @@ if("abort") stop_cycling() - /* - //dont do this. If the airlock can't get enough air to pressurize the person inside is stuck - state = STATE_PRESSURIZE - target_state = TARGET_NONE - memory["target_pressure"] = ONE_ATMOSPHERE - signalPump(tag_airpump, 1, 1, memory["target_pressure"]) - process() - */ if("force_ext") toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "toggle") @@ -140,11 +138,9 @@ if("purge") memory["purge"] = !memory["purge"] if(memory["purge"]) - toggleDoor(memory["exterior_status"], tag_exterior_door, 1, "close") - toggleDoor(memory["interior_status"], tag_interior_door, 1, "close") - state = STATE_DEPRESSURIZE + close_doors() + state = STATE_PREPARE target_state = TARGET_NONE - signalPump(tag_airpump, 1, 0, 0) if("secure") memory["secure"] = !memory["secure"] @@ -184,16 +180,21 @@ switch(state) if(STATE_PREPARE) if (check_doors_secured()) + if(waiting_ticks < waiting_ticks_target) + waiting_ticks++ + return + else + waiting_ticks = 0 var/chamber_pressure = memory["chamber_sensor_pressure"] var/target_pressure = memory["target_pressure"] if(memory["purge"]) + //purge apparently means clearing the airlock chamber to vacuum (then refilling, handled later) target_pressure = 0 + state = STATE_DEPRESSURIZE + signalPump(tag_airpump, 1, 0, 0) //send a signal to start depressurizing - if(memory["purge"]) - target_pressure = 0 - - if(chamber_pressure <= target_pressure) + else if(chamber_pressure <= target_pressure) state = STATE_PRESSURIZE signalPump(tag_airpump, 1, 1, target_pressure) //send a signal to start pressurizing @@ -201,40 +202,37 @@ state = STATE_DEPRESSURIZE signalPump(tag_airpump, 1, 0, target_pressure) //send a signal to start depressurizing - //Check for vacuum - this is set after the pumps so the pumps are aiming for 0 - if(!memory["target_pressure"]) - memory["target_pressure"] = ONE_ATMOSPHERE * 0.05 + //Make sure the airlock isn't aiming for pure vacuum - an impossibility + memory["target_pressure"] = max(target_pressure, ONE_ATMOSPHERE * 0.05) if(STATE_PRESSURIZE) if(memory["chamber_sensor_pressure"] >= memory["target_pressure"] * 0.95) - cycleDoors(target_state) - - state = STATE_IDLE - target_state = TARGET_NONE - + //not done until the pump has reported that it's off if(memory["pump_status"] != "off") signalPump(tag_airpump, 0) //send a signal to stop pumping + else + cycleDoors(target_state) + state = STATE_IDLE + target_state = TARGET_NONE if(STATE_DEPRESSURIZE) - if(memory["purge"]) - if(memory["chamber_sensor_pressure"] <= ONE_ATMOSPHERE * 0.05) - state = STATE_PRESSURIZE - signalPump(tag_airpump, 1, 1, memory["target_pressure"]) + if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05) + if(memory["purge"]) + memory["purge"] = 0 + memory["target_pressure"] = memory["internal_sensor_pressure"] + state = STATE_PREPARE + target_state = TARGET_NONE - - else if(memory["chamber_sensor_pressure"] <= memory["target_pressure"] * 1.05) - cycleDoors(target_state) - - state = STATE_IDLE - target_state = TARGET_NONE - - //send a signal to stop pumping - if(memory["pump_status"] != "off") + else if(memory["pump_status"] != "off") signalPump(tag_airpump, 0) + else + cycleDoors(target_state) + state = STATE_IDLE + target_state = TARGET_NONE - memory["processing"] = state != target_state + memory["processing"] = (state != target_state) return 1 @@ -321,7 +319,6 @@ datum/computer/file/embedded_program/airlock/proc/signal_mech_sensor(var/command /*---------------------------------------------------------- toggleDoor() - Sends a radio command to a door to either open or close. If the command is 'toggle' the door will be sent a command that reverses it's current state. diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 6bd1f103..52ac4436 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -3,7 +3,7 @@ /obj/item/weapon/storage/box/swabs name = "box of swab kits" desc = "Sterilized equipment within. Do not contaminate." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" storage_slots=14 can_hold = list("/obj/item/weapon/forensics/swab") @@ -29,7 +29,7 @@ /obj/item/weapon/forensics/swab name = "swab kit" desc = "A sterilized cotton swab and vial used to take forensic samples." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "swab" flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON w_class = 1.0 @@ -132,7 +132,7 @@ /obj/item/weapon/storage/briefcase/crimekit name = "Crime Scene Kit" desc = "A stainless steel-plated carrycase for all your forensic needs. Feels heavy." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "case" item_state = "case" storage_slots=14 @@ -156,7 +156,7 @@ /obj/item/weapon/forensics/slide name = "microscope slide" desc = "A pair of thin glass panes used in the examination of samples beneath a microscope." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "slide" flags = FPRINT | TABLEPASS | CONDUCT | NOBLUDGEON w_class = 1.0 @@ -219,7 +219,7 @@ /obj/machinery/microscope name = "high powered electron microscope" desc = "A highly advanced microscope capable of zooming up to 3000x." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "microscope" anchored = 1 var/obj/item/weapon/forensics/sample = null @@ -367,7 +367,7 @@ /obj/item/weapon/forensics/powder name = "fingerprint powder" desc = "A jar containing aluminum powder and a specialized brush." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "dust" var/list/complete_prints = list() var/stored = list() @@ -432,7 +432,7 @@ /obj/item/weapon/forensics/fiberkit name = "Fiber Collection Kit" desc = "A magnifying glass and tweezers. Used to lift suit fibers." - icon = 'forensics.dmi' + icon = 'icons/obj/forensics.dmi' icon_state = "m_glass" var/list/fibers_complete = list() var/stored = list()