//States for airlock_control #define ACCESS_STATE_INTERNAL -1 #define ACCESS_STATE_LOCKED 0 #define ACCESS_STATE_EXTERNAL 1 datum/computer/file/embedded_program/access_controller var/id_tag var/exterior_door_tag var/interior_door_tag state = ACCESS_STATE_LOCKED var/target_state = ACCESS_STATE_LOCKED receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return if(receive_tag==exterior_door_tag) if(signal.data["door_status"] == "closed") if(signal.data["lock_status"] == "locked") memory["exterior_status"] = "locked" else memory["exterior_status"] = "closed" else memory["exterior_status"] = "open" else if(receive_tag==interior_door_tag) if(signal.data["door_status"] == "closed") if(signal.data["lock_status"] == "locked") memory["interior_status"] = "locked" else memory["interior_status"] = "closed" else memory["interior_status"] = "open" else if(receive_tag==id_tag) switch(signal.data["command"]) if("cycle_interior") target_state = ACCESS_STATE_INTERNAL if("cycle_exterior") target_state = ACCESS_STATE_EXTERNAL if("cycle") if(state < ACCESS_STATE_LOCKED) target_state = ACCESS_STATE_EXTERNAL else target_state = ACCESS_STATE_INTERNAL receive_user_command(command) switch(command) if("cycle_closed") target_state = ACCESS_STATE_LOCKED if("cycle_exterior") target_state = ACCESS_STATE_EXTERNAL if("cycle_interior") target_state = ACCESS_STATE_INTERNAL process() switch(state) if(ACCESS_STATE_INTERNAL) // state -1 if(target_state > state) if(memory["interior_status"] == "locked") state = ACCESS_STATE_LOCKED else var/datum/signal/signal = new signal.data["tag"] = interior_door_tag if(memory["interior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) if(ACCESS_STATE_LOCKED) if(target_state < state) if(memory["exterior_status"] != "locked") var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag if(memory["exterior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) else if(memory["interior_status"] == "closed" || memory["interior_status"] == "open") state = ACCESS_STATE_INTERNAL else var/datum/signal/signal = new signal.data["tag"] = interior_door_tag signal.data["command"] = "unlock" post_signal(signal) else if(target_state > state) if(memory["interior_status"] != "locked") var/datum/signal/signal = new signal.data["tag"] = interior_door_tag if(memory["interior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) else if(memory["exterior_status"] == "closed" || memory["exterior_status"] == "open") state = ACCESS_STATE_EXTERNAL else var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag signal.data["command"] = "unlock" post_signal(signal) else if(memory["interior_status"] != "locked") var/datum/signal/signal = new signal.data["tag"] = interior_door_tag if(memory["interior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) else if(memory["exterior_status"] != "locked") var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag if(memory["exterior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) if(ACCESS_STATE_EXTERNAL) //state 1 if(target_state < state) if(memory["exterior_status"] == "locked") state = ACCESS_STATE_LOCKED else var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag if(memory["exterior_status"] == "closed") signal.data["command"] = "lock" else signal.data["command"] = "secure_close" post_signal(signal) return 1 obj/machinery/embedded_controller/radio/access_controller icon = 'airlock_machines.dmi' icon_state = "access_control_standby" name = "Access Console" density = 0 frequency = 1449 // Setup parameters only var/id_tag var/exterior_door_tag var/interior_door_tag initialize() ..() var/datum/computer/file/embedded_program/access_controller/new_prog = new new_prog.id_tag = id_tag new_prog.exterior_door_tag = exterior_door_tag new_prog.interior_door_tag = interior_door_tag new_prog.master = src program = new_prog update_icon() if(on && program) if(program.memory["processing"]) icon_state = "access_control_process" else icon_state = "access_control_standby" else icon_state = "access_control_off" return_text() var/state_options = null var/state = 0 var/exterior_status = "----" var/interior_status = "----" if(program) state = program.state exterior_status = program.memory["exterior_status"] interior_status = program.memory["interior_status"] switch(state) if(ACCESS_STATE_INTERNAL) state_options = {"Lock Interior Airlock
Cycle to Exterior Airlock
"} if(ACCESS_STATE_LOCKED) state_options = {"Unlock Interior Airlock
Unlock Exterior Airlock
"} if(ACCESS_STATE_EXTERNAL) state_options = {"Cycle to Interior Airlock
Lock Exterior Airlock
"} var/output = {"Access Control Console
[state_options]
Exterior Door: [exterior_status]
Interior Door: [interior_status]
"} return output