From 6f890fbe98f75634bcc577e8ed40bf6e266b0554 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Sat, 10 Dec 2022 10:22:16 +1000 Subject: [PATCH] Merge pull request #14178 from Poojawa/fancy-AFGs Fixes #14118 --- code/game/machinery/atm_ret_field.dm | 51 ++++++++++++++++------------ 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm index bcf78539a7..603e6615be 100644 --- a/code/game/machinery/atm_ret_field.dm +++ b/code/game/machinery/atm_ret_field.dm @@ -14,11 +14,11 @@ var/isactive = FALSE var/wasactive = FALSE //controls automatic reboot after power-loss var/alwaysactive = FALSE //for a special subtype - + //how long it takes us to reboot if we're shut down by an EMP var/reboot_delay_min = 50 var/reboot_delay_max = 75 - + var/hatch_open = FALSE var/wires_intact = TRUE var/list/areas_added @@ -98,26 +98,30 @@ /obj/machinery/atmospheric_field_generator/power_change() var/oldstat ..() - if(!(stat & NOPOWER)) - ispowered = 1 + if(!(stat & (BROKEN|NOPOWER|EMPED))) + ispowered = TRUE update_icon() if(alwaysactive || wasactive) //reboot our field if we were on or are supposed to be always-on generate_field() - if(stat != oldstat && isactive && (stat & NOPOWER)) - ispowered = 0 + if(stat != oldstat && isactive && (stat & (BROKEN|NOPOWER|EMPED))) + ispowered = FALSE disable_field() update_icon() /obj/machinery/atmospheric_field_generator/emp_act() - . = ..() - disable_field() //shutting dowwwwwwn - if(alwaysactive || wasactive) //reboot after a short delay if we were online before + if(!(stat & EMPED)) + stat |= EMPED + disable_field() //shutting dowwwwwwn spawn(rand(reboot_delay_min,reboot_delay_max)) - generate_field() + stat &= ~EMPED + if(alwaysactive || wasactive) //reboot after a short delay if we were online before + generate_field() + ..() /obj/machinery/atmospheric_field_generator/ex_act(severity) switch(severity) if(1) + stat |= BROKEN //ensures that always on generators are set as broken prior to being deleted, thus, off. disable_field() qdel(src) return @@ -134,23 +138,26 @@ if(!ispowered || hatch_open || !wires_intact || isactive) //if it's not powered, the hatch is open, the wires are busted, or it's already on, don't do anything return else - isactive = 1 + isactive = TRUE icon_state = "arfg_on" new field_type (src.loc) src.visible_message("The ARF-G crackles to life!","You hear an ARF-G coming online!") update_use_power(USE_POWER_ACTIVE) return - + /obj/machinery/atmospheric_field_generator/proc/disable_field() if(isactive) - icon_state = "arfg_off" - for(var/obj/structure/atmospheric_retention_field/F in loc) - qdel(F) - src.visible_message("The ARF-G shuts down with a low hum.","You hear an ARF-G powering down.") - update_use_power(USE_POWER_IDLE) - isactive = 0 + if(alwaysactive == TRUE && !(stat & (BROKEN|NOPOWER|EMPED))) //If we're not damaged, don't turn off if we're always on. + return + else + icon_state = "arfg_off" + for(var/obj/structure/atmospheric_retention_field/F in loc) + qdel(F) + src.visible_message("The ARF-G shuts down with a low hum.","You hear an ARF-G powering down.") + update_use_power(USE_POWER_IDLE) + isactive = FALSE return - + /obj/machinery/atmospheric_field_generator/Initialize() . = ..() //Delete ourselves if we find extra mapped in arfgs @@ -158,7 +165,7 @@ if(F != src) log_debug("Duplicate ARFGS at [x],[y],[z]") return INITIALIZE_HINT_QDEL - + var/area/A = get_area(src) ASSERT(istype(A)) @@ -202,11 +209,11 @@ for(var/i = 1 to 4) var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1)) add_overlay(I) - + return /obj/structure/atmospheric_retention_field/Initialize() - . = ..() + . = ..() update_nearby_tiles() //Force ZAS update update_connections(1) update_icon()