#define CLOSING 1 #define OPENING 2 #define CYCLE 3 #define CYCLE_EXTERIOR 4 #define CYCLE_INTERIOR 5 /obj/machinery/doorButtons power_channel = ENVIRON use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/idSelf /obj/machinery/doorButtons/attackby(obj/O, mob/user) return attack_hand(user) /obj/machinery/doorButtons/proc/findObjsByTag() return /obj/machinery/doorButtons/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD /obj/machinery/doorButtons/LateInitialize() findObjsByTag() /obj/machinery/doorButtons/emag_act(mob/user) . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED req_access = list() req_one_access = list() playsound(src, "sparks", 100, 1) to_chat(user, "You short out the access controller.") return TRUE /obj/machinery/doorButtons/proc/removeMe() /obj/machinery/doorButtons/access_button icon = 'icons/obj/airlock_machines.dmi' icon_state = "access_button_standby" name = "access button" desc = "A button used for the explicit purpose of opening an airlock." var/idDoor var/obj/machinery/door/airlock/door var/obj/machinery/doorButtons/airlock_controller/controller var/busy /obj/machinery/doorButtons/access_button/findObjsByTag() for(var/obj/machinery/doorButtons/airlock_controller/A in GLOB.machines) if(A.idSelf == idSelf) controller = A break for(var/obj/machinery/door/airlock/I in GLOB.machines) if(I.id_tag == idDoor) door = I break /obj/machinery/doorButtons/access_button/interact(mob/user) if(busy) return if(!allowed(user)) to_chat(user, "Access denied.") return if(controller && !controller.busy && door) if(controller.stat & NOPOWER) return busy = TRUE update_icon() if(door.density) if(!controller.exteriorAirlock || !controller.interiorAirlock) controller.onlyOpen(door) else if(controller.exteriorAirlock.density && controller.interiorAirlock.density) controller.onlyOpen(door) else controller.cycleClose(door) else controller.onlyClose(door) sleep(20) busy = FALSE update_icon() /obj/machinery/doorButtons/access_button/update_icon_state() if(stat & NOPOWER) icon_state = "access_button_off" else if(busy) icon_state = "access_button_cycle" else icon_state = "access_button_standby" /obj/machinery/doorButtons/access_button/power_change() ..() update_icon() /obj/machinery/doorButtons/access_button/removeMe(obj/O) if(O == door) door = null /obj/machinery/doorButtons/airlock_controller icon = 'icons/obj/airlock_machines.dmi' icon_state = "access_control_standby" name = "access console" desc = "A small console that can cycle opening between two airlocks." var/obj/machinery/door/airlock/interiorAirlock var/obj/machinery/door/airlock/exteriorAirlock var/idInterior var/idExterior var/busy var/lostPower /obj/machinery/doorButtons/airlock_controller/removeMe(obj/O) if(O == interiorAirlock) interiorAirlock = null else if(O == exteriorAirlock) exteriorAirlock = null /obj/machinery/doorButtons/airlock_controller/Destroy() for(var/obj/machinery/doorButtons/access_button/A in GLOB.machines) if(A.controller == src) A.controller = null return ..() /obj/machinery/doorButtons/airlock_controller/Topic(href, href_list) if(..()) return if(busy) return if(!allowed(usr)) to_chat(usr, "Access denied.") return switch(href_list["command"]) if("close_exterior") onlyClose(exteriorAirlock) if("close_interior") onlyClose(interiorAirlock) if("cycle_exterior") cycleClose(exteriorAirlock) if("cycle_interior") cycleClose(interiorAirlock) if("open_exterior") onlyOpen(exteriorAirlock) if("open_interior") onlyOpen(interiorAirlock) /obj/machinery/doorButtons/airlock_controller/proc/onlyOpen(obj/machinery/door/airlock/A) if(A) busy = CLOSING update_icon() openDoor(A) /obj/machinery/doorButtons/airlock_controller/proc/onlyClose(obj/machinery/door/airlock/A) if(A) busy = CLOSING closeDoor(A) /obj/machinery/doorButtons/airlock_controller/proc/closeDoor(obj/machinery/door/airlock/A) set waitfor = FALSE if(A.density) goIdle() return 0 update_icon() A.unbolt() . = 1 if(A && A.close()) if(stat & NOPOWER || lostPower || !A || QDELETED(A)) goIdle(1) return A.bolt() if(busy == CLOSING) goIdle(1) else goIdle(1) /obj/machinery/doorButtons/airlock_controller/proc/cycleClose(obj/machinery/door/airlock/A) if(!A || !exteriorAirlock || !interiorAirlock) return if(exteriorAirlock.density == interiorAirlock.density || !A.density) return busy = CYCLE update_icon() if(A == interiorAirlock) if(closeDoor(exteriorAirlock)) busy = CYCLE_INTERIOR else if(closeDoor(interiorAirlock)) busy = CYCLE_EXTERIOR /obj/machinery/doorButtons/airlock_controller/proc/cycleOpen(obj/machinery/door/airlock/A) if(!A) goIdle(1) if(A == exteriorAirlock) if(interiorAirlock) if(!interiorAirlock.density || !interiorAirlock.locked) return else if(exteriorAirlock) if(!exteriorAirlock.density || !exteriorAirlock.locked) return if(busy != OPENING) busy = OPENING openDoor(A) /obj/machinery/doorButtons/airlock_controller/proc/openDoor(obj/machinery/door/airlock/A) if(exteriorAirlock && interiorAirlock && (!exteriorAirlock.density || !interiorAirlock.density)) goIdle(1) return A.unbolt() spawn() if(A && A.open()) if(stat | (NOPOWER) && !lostPower && A && !QDELETED(A)) A.bolt() goIdle(1) /obj/machinery/doorButtons/airlock_controller/proc/goIdle(update) lostPower = 0 busy = FALSE if(update) update_icon() updateUsrDialog() /obj/machinery/doorButtons/airlock_controller/process() if(stat & NOPOWER) return if(busy == CYCLE_EXTERIOR) cycleOpen(exteriorAirlock) else if(busy == CYCLE_INTERIOR) cycleOpen(interiorAirlock) /obj/machinery/doorButtons/airlock_controller/power_change() ..() if(stat & NOPOWER) lostPower = 1 else if(!busy) lostPower = 0 update_icon() /obj/machinery/doorButtons/airlock_controller/findObjsByTag() for(var/obj/machinery/door/airlock/A in GLOB.machines) if(A.id_tag == idInterior) interiorAirlock = A else if(A.id_tag == idExterior) exteriorAirlock = A /obj/machinery/doorButtons/airlock_controller/update_icon_state() if(stat & NOPOWER) icon_state = "access_control_off" return if(busy || lostPower) icon_state = "access_control_process" else icon_state = "access_control_standby" /obj/machinery/doorButtons/airlock_controller/ui_interact(mob/user) var/datum/browser/popup = new(user, "computer", name) popup.set_content(returnText()) popup.open() /obj/machinery/doorButtons/airlock_controller/proc/returnText() var/output if(!exteriorAirlock && !interiorAirlock) return "ERROR ERROR ERROR ERROR" if(lostPower) output = "Initializing..." else if(!exteriorAirlock || !interiorAirlock) if(!exteriorAirlock) if(interiorAirlock.density) output = "Open Interior Airlock
" else output = "Close Interior Airlock
" else if(exteriorAirlock.density) output = "Open Exterior Airlock
" else output = "Close Exterior Airlock
" else if(exteriorAirlock.density) if(interiorAirlock.density) output = {"Open Exterior Airlock
Open Interior Airlock
"} else output = {"Cycle to Exterior Airlock
Close Interior Airlock
"} else if(interiorAirlock.density) output = {"Close Exterior Airlock
Cycle to Interior Airlock
"} else output = {"Close Exterior Airlock
Close Interior Airlock
"} output = {"Access Control Console
[output]
"} if(exteriorAirlock) output += "Exterior Door: [exteriorAirlock.density ? "closed" : "open"]
" if(interiorAirlock) output += "Interior Door: [interiorAirlock.density ? "closed" : "open"]
" return output #undef CLOSING #undef OPENING #undef CYCLE #undef CYCLE_EXTERIOR #undef CYCLE_INTERIOR