Skip to content

Commit

Permalink
Merge pull request #18 from out-of-phaze/lighthouse-feature/phoronlocks
Browse files Browse the repository at this point in the history
Port phoronlocks from Virgo/CitRP
  • Loading branch information
ProbablyCarl authored Jun 1, 2023
2 parents bb141f9 + 3a024cc commit 48acbcd
Show file tree
Hide file tree
Showing 5 changed files with 447 additions and 10 deletions.
7 changes: 4 additions & 3 deletions code/game/machinery/atmoalter/scrubber.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@

power_rating = 7500 //7500 W ~ 10 HP
power_losses = 150
var/power_efficiency = 1 /// Modifies power consumption. 0.25 -> uses only 25% the power, 1.25 -> uses 125% the power

var/minrate = 0
var/maxrate = 10 * ONE_ATMOSPHERE

var/list/scrubbing_gas

/obj/machinery/portable_atmospherics/powered/scrubber/Initialize()
. = ..()
if(!scrubbing_gas)
scrubbing_gas = list()
scrubbing_gas = list(/decl/material/solid/phoron)
for(var/g in decls_repository.get_decl_paths_of_subtype(/decl/material/gas))
if(g != /decl/material/gas/oxygen && g != /decl/material/gas/nitrogen)
scrubbing_gas += g
. = ..()

/obj/machinery/portable_atmospherics/powered/scrubber/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
Expand Down Expand Up @@ -69,7 +70,7 @@

var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles

power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating)
power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating) * power_efficiency

if (power_draw < 0)
last_flow_rate = 0
Expand Down
26 changes: 19 additions & 7 deletions code/game/machinery/embedded_controller/airlock_program.dm
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,13 @@
var/receive_tag = signal.data["tag"]
if(!receive_tag) return

if(receive_tag==tag_chamber_sensor)
if(signal.data["pressure"])
memory["chamber_sensor_pressure"] = text2num(signal.data["pressure"])
if(receive_tag==tag_chamber_sensor && ("pressure" in signal.data))
memory["chamber_sensor_pressure"] = text2num(signal.data["pressure"])

else if(receive_tag==tag_exterior_sensor)
else if(receive_tag==tag_exterior_sensor && ("pressure" in signal.data))
memory["external_sensor_pressure"] = text2num(signal.data["pressure"])

else if(receive_tag==tag_interior_sensor)
else if(receive_tag==tag_interior_sensor && ("pressure" in signal.data))
memory["internal_sensor_pressure"] = text2num(signal.data["pressure"])

else if(receive_tag==tag_exterior_door)
Expand Down Expand Up @@ -136,26 +135,38 @@
else
receive_user_command("cycle_int")

#define SIDE_EXTERIOR "exterior"
#define SIDE_INTERIOR "interior"
/datum/computer/file/embedded_program/airlock/proc/is_side_safe(side)
switch(side)
if(SIDE_EXTERIOR)
return IsInRange(memory["external_sensor_pressure"], memory["chamber_sensor_pressure"] - SENSOR_TOLERANCE, memory["chamber_sensor_pressure"] + SENSOR_TOLERANCE)
if(SIDE_INTERIOR)
return IsInRange(memory["internal_sensor_pressure"], memory["chamber_sensor_pressure"] - SENSOR_TOLERANCE, memory["chamber_sensor_pressure"] + SENSOR_TOLERANCE)
return FALSE // side does not exist, cannot be safe

/datum/computer/file/embedded_program/airlock/receive_user_command(command)
var/shutdown_pump = 0
. = TRUE
switch(command)
if("cycle_ext")
//If airlock is already cycled in this direction, just toggle the doors.
if(!memory["purge"] && IsInRange(memory["external_sensor_pressure"], memory["chamber_sensor_pressure"] - SENSOR_TOLERANCE, memory["chamber_sensor_pressure"] + SENSOR_TOLERANCE))
if(!memory["purge"] && is_side_safe(SIDE_EXTERIOR))
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "toggle")
//only respond to these commands if the airlock isn't already doing something
//prevents the controller from getting confused and doing strange things
else if(state == target_state)
begin_cycle_out()

if("cycle_int")
if(!memory["purge"] && IsInRange(memory["internal_sensor_pressure"], memory["chamber_sensor_pressure"] - SENSOR_TOLERANCE, memory["chamber_sensor_pressure"] + SENSOR_TOLERANCE))
if(!memory["purge"] && is_side_safe(SIDE_INTERIOR))
toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "toggle")
else if(state == target_state)
begin_cycle_in()

#undef SIDE_EXTERIOR
#undef SIDE_INTERIOR

if("cycle_ext_door")
cycleDoors(TARGET_OUTOPEN)

Expand Down Expand Up @@ -426,6 +437,7 @@ send an additional command to open the door again.


#undef STATE_IDLE
#undef STATE_PREPARE
#undef STATE_DEPRESSURIZE
#undef STATE_PRESSURIZE

Expand Down
Loading

0 comments on commit 48acbcd

Please sign in to comment.