diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 494d0f575e8..76cbe02ae0f 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -92,3 +92,18 @@ GLOBAL_LIST_EMPTY(frozen_atom_list) // A list of admin-frozen atoms. else message_admins("[key_name_admin(admin)] [frozen ? "froze" : "unfroze"] an empty [name]") log_admin("[key_name(admin)] [frozen ? "froze" : "unfroze"] an empty [name]") + +/obj/machinery/atmospherics/supermatter_crystal/admin_Freeze(client/admin) + var/obj/effect/overlay/adminoverlay/freeze_overlay = new + if(processes) + radio.autosay("Alert: Unknown intervention has frozen causality around the crystal. It is not progressing in local timespace.", name, "Engineering", list(z)) + GLOB.frozen_atom_list += src + processes = FALSE + add_overlay(freeze_overlay) + else + radio.autosay("Alert: Unknown intervention has ceased around the crystal. It has returned to the regular flow of time.", name, "Engineering", list(z)) + GLOB.frozen_atom_list -= src + processes = TRUE + cut_overlay(freeze_overlay) + message_admins("[key_name_admin(admin)] [processes ? "unfroze" : "froze"] a supermatter crystal") + log_admin("[key_name(admin)] [processes ? "unfroze" : "froze"] a supermatter crystal") diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 35b58a6e265..81c73c673f6 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -212,6 +212,8 @@ SSair.atmos_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src + if(!processes) + GLOB.frozen_atom_list -= src QDEL_NULL(countdown) QDEL_NULL(soundloop) return ..() @@ -290,6 +292,11 @@ SEND_SOUND(M, sound('sound/machines/engine_alert2.ogg')) // then send them the sound file radio.autosay(speaking, name, null, list(z)) for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10) + if(!processes) // Stop exploding if you're frozen by an admin, damn you + cut_overlay(causality_field, TRUE) + final_countdown = FALSE + damage = explosion_point - 1 // One point below exploding, so it will re-start the countdown once unfrozen + return if(damage < explosion_point) // Cutting it a bit close there engineers radio.autosay("[safe_alert] Failsafe has been disengaged.", name, null, list(z)) cut_overlay(causality_field, TRUE)