diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 26b1d2d44aa..4b10bee2a2b 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -198,6 +198,8 @@ // /area signals +///from base of area/proc/power_change(): () +#define COMSIG_AREA_POWER_CHANGE "area_power_change" ///from base of area/Entered(): (atom/movable/M) #define COMSIG_AREA_ENTERED "area_entered" ///from base of area/Exited(): (atom/movable/M) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 990e2f1694d..aec3ea58f01 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -420,11 +420,15 @@ /area/space/powered(chan) //Nope.avi return 0 -// called when power status changes - +/** + * Called when the area power status changes + * + * Updates the area icon, calls power change on all machines in the area, and sends the `COMSIG_AREA_POWER_CHANGE` signal. + */ /area/proc/power_change() for(var/obj/machinery/M in src) // for each machine in the area M.power_change() // reverify power status (to update icons etc.) + SEND_SIGNAL(src, COMSIG_AREA_POWER_CHANGE) updateicon() /area/proc/usage(var/chan) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index f9ba60ab380..d1d4e900543 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -6,9 +6,7 @@ w_class = WEIGHT_CLASS_BULKY canhear_range = 2 flags = CONDUCT - var/number = 0 var/circuitry_installed = 1 - var/last_tick //used to delay the powercheck var/buildstage = 0 dog_fashion = null @@ -50,7 +48,7 @@ . = ..() buildstage = building if(buildstage) - START_PROCESSING(SSobj, src) + update_operating_status() else if(direction) setDir(direction) @@ -103,20 +101,17 @@ ) /obj/item/radio/intercom/Destroy() - STOP_PROCESSING(SSobj, src) GLOB.global_intercoms.Remove(src) return ..() /obj/item/radio/intercom/attack_ai(mob/user) add_hiddenprint(user) add_fingerprint(user) - spawn(0) - attack_self(user) + attack_self(user) /obj/item/radio/intercom/attack_hand(mob/user) add_fingerprint(user) - spawn(0) - attack_self(user) + attack_self(user) /obj/item/radio/intercom/receive_range(freq, level) if(!is_listening()) @@ -132,7 +127,7 @@ return canhear_range -/obj/item/radio/intercom/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/radio/intercom/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/tape_roll)) //eww return else if(iscoil(W) && buildstage == 1) @@ -182,7 +177,7 @@ buildstage = 3 to_chat(user, "You secure the electronics!") update_icon() - START_PROCESSING(SSobj, src) + update_operating_status() for(var/i, i<= 5, i++) wires.on_cut(i, 1) @@ -198,7 +193,7 @@ b_stat = 1 buildstage = 1 update_icon() - STOP_PROCESSING(SSobj, src) + update_operating_status(FALSE) /obj/item/radio/intercom/welder_act(mob/user, obj/item/I) if(buildstage != 0) @@ -218,20 +213,30 @@ return icon_state = "intercom[!on?"-p":""][b_stat ? "-open":""]" -/obj/item/radio/intercom/process() - if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0)) - last_tick = world.timeofday +/obj/item/radio/intercom/proc/update_operating_status(on = TRUE) + var/area/current_area = get_area(src) + if(!current_area) + return + if(on) + RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, .proc/AreaPowerCheck) + else + UnregisterSignal(current_area, COMSIG_AREA_POWER_CHANGE) - - if(!src.loc) - on = 0 - else - var/area/A = get_area(src) - if(!A) - on = 0 - else - on = A.powered(EQUIP) // set "on" to the power status - update_icon() +/** + * Proc called whenever the intercom's area loses or gains power. Responsible for setting the `on` variable and calling `update_icon()`. + * + * Normally called after the intercom's area recieves the `COMSIG_AREA_POWER_CHANGE` signal, but it can also be called directly. + * Arguments: + * + * source - the area that just had a power change. + */ +/obj/item/radio/intercom/proc/AreaPowerCheck(datum/source) + var/area/current_area = get_area(src) + if(!current_area) + on = FALSE + else + on = current_area.powered(EQUIP) // set "on" to the equipment power status of our area. + update_icon() /obj/item/intercom_electronics name = "intercom electronics"