diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm
index c8ceb5c0786..b23a8579d8c 100644
--- a/code/ZAS/FEA_system.dm
+++ b/code/ZAS/FEA_system.dm
@@ -107,6 +107,8 @@ datum
var/failed_ticks = 0 //How many ticks have runtimed?
var/next_stat_check = 10
+ var/tick_progress = 0
+
/* process()
//Call this to process air movements for a cycle
@@ -168,6 +170,7 @@ datum
proc/tick()
. = 1 //Set the default return value, for runtime detection.
+ tick_progress = 0
if(current_cycle >= next_stat_check)
var/zone/z = pick(zones)
@@ -175,24 +178,33 @@ datum
log_file << "\"\The [get_area(pick(z.contents))]\",[z.air.oxygen],[z.air.nitrogen],[z.air.carbon_dioxide],[z.air.toxins],[z.air.temperature],[z.air.group_multiplier * z.air.volume]"
next_stat_check = current_cycle + (rand(5,7)*60)
+ tick_progress = 1
+
if(tiles_to_update.len) //If there are tiles to update, do so.
for(var/turf/simulated/T in tiles_to_update)
var/output = T.update_air_properties()
if(. && T && !output)
. = 0 //If a runtime occured, make sure we can sense it.
log_admin("ZASALERT: Either a null turf in list/tiles_to_update, or unable run turf/simualted/update_air_properties()")
+ alerted = 1
tiles_to_update = list()
+ tick_progress = 2
+
if(connections_to_check.len)
for(var/connection/C in connections_to_check)
C.CheckPassSanity()
connections_to_check = list()
+ tick_progress = 3
+
if(tiles_to_reconsider_zones.len)
for(var/turf/simulated/T in tiles_to_reconsider_zones)
if(!T.zone)
new /zone(T)
+ tick_progress = 4
+
for(var/zone/Z in zones)
if(Z.last_update < current_cycle)
var/output = Z.process()
@@ -201,9 +213,15 @@ datum
if(. && Z && !output)
. = 0
log_admin("ZASALERT: Either a null zone in list/zones, or unable run zone/process()")
+ alerted = 1
+
+ tick_progress = 5
for(var/obj/fire/F in active_hotspots)
var/output = F.process()
if(. && F && !output)
. = 0
- log_admin("ZASALERT: Either a null fire in list/active_hotspots, or unable run obj/fire/process()")
\ No newline at end of file
+ log_admin("ZASALERT: Either a null fire in list/active_hotspots, or unable run obj/fire/process()")
+ alerted = 1
+
+ tick_progress = 6
\ No newline at end of file
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index 1e566039ee4..e4ea3053d3c 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -176,6 +176,7 @@ datum/controller/game_controller
air_master.current_cycle++
var/success = air_master.tick() //Changed so that a runtime does not crash the ticker.
if(!success) //Runtimed.
+ log_admin("ZASALERT: air_system/tick() failed with progress: [air_master.tick_progress]")
air_master.failed_ticks++
if(air_master.failed_ticks > 20)
world << "RUNTIMES IN ATMOS TICKER. Killing air simulation!"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 1cfd0530a18..f1c4b8356db 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -767,7 +767,7 @@
kill_air = 1
usr << "Disabled air processing."
// feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- log_admin("[key_name(usr)] used 'kill air'.")
+ log_admin("[key_name(usr)] used 'kill air' (toggle), kill_air: [kill_air].")
message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1)
/client/proc/show_verbs()