diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 960bc9c3b50..c929e279d6b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -30,6 +30,9 @@ var/electrified_until = 0 // World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. var/main_power_lost_until = 0 //World time when main power is restored. var/backup_power_lost_until = -1 //World time when backup power is restored. + var/electrified_timer = null + var/main_power_timer = null + var/backup_power_timer = null var/spawnPowerRestoreRunning = 0 var/welded = null var/locked = 0 @@ -208,30 +211,17 @@ desc = "And they said I was crazy." icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" - var/last_event = 0 + var/event_step = 20 -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time +/obj/machinery/door/airlock/uranium/New() ..() + addtimer(src, "radiate", event_step) /obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) - return + if(prob(50)) + for(var/mob/living/L in range (3,src)) + L.apply_effect(15,IRRADIATE,0) + addtimer(src, "radiate", event_step) /obj/machinery/door/airlock/plasma name = "plasma airlock" @@ -338,6 +328,15 @@ About the new airlock wires panel: /obj/machinery/door/airlock/Destroy() qdel(wires) wires = null + if(main_power_timer) + deltimer(main_power_timer) + main_power_timer = null + if(backup_power_timer) + deltimer(backup_power_timer) + backup_power_timer = null + if(electrified_timer) + deltimer(electrified_timer) + electrified_timer = null return ..() /obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite @@ -399,10 +398,13 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/loseMainPower() main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + if(main_power_lost_until > 0) + main_power_timer = addtimer(src, "regainMainPower", SecondsToTicks(60), 1) // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running if(backup_power_lost_until == -1 && !backupPowerCablesCut()) backup_power_lost_until = world.time + SecondsToTicks(10) + backup_power_timer = addtimer(src, "regainBackupPower", SecondsToTicks(10), 1) // Disable electricity if required if(electrified_until && isAllPowerLoss()) @@ -410,12 +412,16 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/loseBackupPower() backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + if(backup_power_lost_until > 0) + backup_power_timer = addtimer(src, "regainBackupPower", SecondsToTicks(60), 1) // Disable electricity if required if(electrified_until && isAllPowerLoss()) electrify(0) /obj/machinery/door/airlock/proc/regainMainPower() + main_power_timer = null + if(!mainPowerCablesCut()) main_power_lost_until = 0 // If backup power is currently active then disable, otherwise let it count down and disable itself later @@ -424,22 +430,28 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/proc/regainBackupPower() + backup_power_timer = null + if(!backupPowerCablesCut()) // Restore backup power only if main power is offline, otherwise permanently disable backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 update_icon() /obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + if(electrified_timer) + deltimer(electrified_timer) + electrified_timer = null + var/message = "" - if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) + if(isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 + electrified_until = -1 else if(duration && !arePowerSystemsOn()) message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 + electrified_until = 0 else if(!duration && electrified_until != 0) message = "The door is now un-electrified." - src.electrified_until = 0 + electrified_until = 0 else if(duration) //electrify door for the given duration seconds if(usr) shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") @@ -447,7 +459,8 @@ About the new airlock wires panel: else shockedby += text("\[[time_stamp()]\] - EMP)") message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + electrified_timer = addtimer(src, "electrify", SecondsToTicks(duration), 1, 0) if(feedback && message) usr << message @@ -686,23 +699,23 @@ About the new airlock wires panel: usr << text("The electrification wire is cut - Door permanently electrified.") else if(!activate && electrified_until != 0) usr << "The door is now un-electrified." - src.electrified_until = 0 + electrify(0) else if(activate) //electrify door for 30 seconds shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") usr << "The door is now electrified for thirty seconds." - src.electrified_until = world.time + SecondsToTicks(30) + electrify(30) if("electrify_permanently") if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) usr << text("The electrification wire is cut - Cannot electrify the door.") else if(!activate && electrified_until != 0) usr << "The door is now un-electrified." - src.electrified_until = 0 + electrify(0) else if(activate) shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") usr << "The door is now electrified." - electrified_until = -1 + electrify(-1) if("open") if(src.welded) usr << text("The airlock has been welded shut!") diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 81ea94c6e12..e9e1d03831f 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -9,10 +9,11 @@ obj/machinery/door/airlock var/cur_command = null //the command the door is currently attempting to complete obj/machinery/door/airlock/process() - ..() - if (arePowerSystemsOn()) + if(arePowerSystemsOn() && cur_command) spawn() execute_current_command() + else + return PROCESS_KILL obj/machinery/door/airlock/receive_signal(datum/signal/signal) if (!arePowerSystemsOn()) return //no power @@ -33,8 +34,11 @@ obj/machinery/door/airlock/proc/execute_current_command() return do_command(cur_command) - if (command_completed(cur_command)) + if(command_completed(cur_command)) cur_command = null + else + if(!(src in machines)) + addAtProcessing() obj/machinery/door/airlock/proc/do_command(var/command) switch(command) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index b150723c704..378ea22c6da 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -65,7 +65,6 @@ // if it's less than 0, open door, reset timer // update the door_timer window and the icon /obj/machinery/door_timer/process() - if(stat & (NOPOWER|BROKEN)) return if(timing) @@ -73,22 +72,20 @@ // (no seriously there's gotta be a better way to do this) var/timeleft = timeleft() if(timeleft > 1e5) - src.releasetime = 0 + releasetime = 0 - if(world.timeofday > src.releasetime) - Radio.autosay("Timer has expired. Releasing prisoner.", src.name, "Security", list(src.z)) + if(world.timeofday > releasetime) + Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z)) timer_end() // open doors, reset timer, clear status screen timing = 0 + . = PROCESS_KILL src.updateUsrDialog() src.update_icon() - else timer_end() - - return - + return PROCESS_KILL // has the door power situation changed, if so update icon. /obj/machinery/door_timer/power_change() @@ -106,6 +103,8 @@ // Set releasetime releasetime = world.timeofday + timetoset + if(!(src in machines)) + addAtProcessing() for(var/obj/machinery/door/window/brigdoor/door in targets) if(door.density) continue diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b6fd5a66e1c..113a4f0be9e 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -142,7 +142,7 @@ FIRE ALARM alarm() time = 0 timing = 0 - processing_objects.Remove(src) + processing_objects -= src updateDialog() last_process = world.timeofday @@ -244,9 +244,14 @@ FIRE ALARM else if(href_list["alarm"]) alarm() else if(href_list["time"]) + var/oldTiming = timing timing = text2num(href_list["time"]) last_process = world.timeofday - processing_objects.Add(src) + if(oldTiming != timing) + if(timing) + processing_objects += src + else + processing_objects -= src else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) time += tp