diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index d4de419ad0..6fc2b923dd 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -199,7 +199,7 @@ total_unfilterable_moles += source.gas[g] var/ratio = source.gas[g]/source.total_moles //converts the specific power per mole of pure gas to specific power per mole of input gas mix - total_specific_power = specific_power_gas[g]*ratio + total_specific_power += specific_power_gas[g]*ratio //Figure out how much of each gas to filter if (isnull(total_transfer_moles)) @@ -272,7 +272,7 @@ total_unfilterable_moles += source.gas[g] var/ratio = source.gas[g]/source.total_moles //converts the specific power per mole of pure gas to specific power per mole of input gas mix - total_specific_power = specific_power_gas[g]*ratio + total_specific_power += specific_power_gas[g]*ratio //Figure out how much of each gas to filter if (isnull(total_transfer_moles)) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 086df507b9..1899ee9dfd 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 4674d52251..a372f139e8 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -178,10 +178,10 @@ 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 diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e07d5aaf20..e5e05aa718 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -214,7 +214,7 @@ var/obj/screen/robot_inventory if(!r.robot_modules_background) return - var/display_rows = round((r.module.modules.len) / 8) +1 //+1 because round() returns floor of number + var/display_rows = -round(-(r.module.modules.len) / 8) r.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" r.client.screen += r.robot_modules_background diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 8cb3abb998..fabf499dc9 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -109,10 +109,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 +126,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 +136,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"] @@ -188,12 +182,12 @@ 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 +195,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"]) - - - 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") + 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["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 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 90edc04c0c..22efc50b69 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -148,7 +148,7 @@ if(temp && !temp.is_usable()) user << "You try to move your [temp.name], but cannot!" return - + src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc S.remove_from_storage(src) @@ -162,8 +162,6 @@ return user.next_move = max(user.next_move+2,world.time + 2) user.put_in_active_hand(src) - if(src.loc == user) - src.pickup(user) return /obj/item/attack_ai(mob/user as mob) @@ -604,4 +602,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/pwr_drain() - return 0 // Process Kill \ No newline at end of file + return 0 // Process Kill