From f2bd8f138b7f521240f07562e8c40c738537dbc2 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Wed, 13 May 2020 11:09:12 -0400 Subject: [PATCH] Make intercom power change stateful --- code/datums/observation/power_change.dm | 21 +++++++ .../objects/items/devices/radio/intercom.dm | 62 ++++++++----------- vorestation.dme | 1 + 3 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 code/datums/observation/power_change.dm diff --git a/code/datums/observation/power_change.dm b/code/datums/observation/power_change.dm new file mode 100644 index 00000000000..4581dab84ac --- /dev/null +++ b/code/datums/observation/power_change.dm @@ -0,0 +1,21 @@ +// Observer Pattern Implementation: Area Power Change +// Registration type: /area +// +// Raised when: An /area has a power change (the APC powers up/down or some channels are enabled/disabled) +// +// Arguments that the called proc should expect: +// /area: The area experiencing the power change + +GLOBAL_DATUM_INIT(apc_event, /decl/observ/area_power_change, new) + +/decl/observ/area_power_change + name = "Area Power Change" + expected_type = /area + +/******************** +* Movement Handling * +********************/ + +/area/power_change() + . = ..() + GLOB.apc_event.raise_event(src) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8c26e874d2b..df39eeaf024 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -11,9 +11,20 @@ flags = NOBLOODY var/circuit = /obj/item/weapon/circuitboard/intercom var/number = 0 - var/last_tick //used to delay the powercheck var/wiresexposed = 0 +/obj/item/device/radio/intercom/Initialize() + . = ..() + var/area/A = get_area(src) + if(A) + GLOB.apc_event.register(A, src, /obj/update_icon) + +/obj/item/device/radio/intercom/Destroy() + var/area/A = get_area(src) + if(A) + GLOB.apc_event.unregister(A, src, /obj/update_icon) + return ..() + /obj/item/device/radio/intercom/custom name = "station intercom (Custom)" broadcasting = 0 @@ -60,7 +71,6 @@ /obj/item/device/radio/intercom/New() ..() - START_PROCESSING(SSobj, src) circuit = new circuit(src) /obj/item/device/radio/intercom/department/medbay/New() @@ -103,10 +113,6 @@ ..() internal_channels[num2text(RAID_FREQ)] = list(access_syndicate) -/obj/item/device/radio/intercom/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - /obj/item/device/radio/intercom/attack_ai(mob/user as mob) src.add_fingerprint(user) spawn (0) @@ -123,15 +129,8 @@ wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") playsound(src, W.usesound, 50, 1) - if(wiresexposed) - if(!on) - icon_state = "intercom-p_open" - else - icon_state = "intercom_open" - else - icon_state = "intercom" - return - if(wiresexposed && W.is_wirecutter()) + update_icon() + else if(wiresexposed && W.is_wirecutter()) user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") playsound(src, W.usesound, 50, 1) new/obj/item/stack/cable_coil(get_turf(src), 5) @@ -149,7 +148,6 @@ qdel(src) else src.attack_hand(user) - return /obj/item/device/radio/intercom/receive_range(freq, level) if (!on) @@ -166,29 +164,21 @@ return canhear_range -/obj/item/device/radio/intercom/process() - if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0)) - last_tick = world.timeofday +/obj/item/device/radio/intercom/update_icon() + var/area/A = get_area(src) + on = A?.powered(EQUIP) - if(!src.loc) - on = 0 + if(!on) + if(wiresexposed) + icon_state = "intercom-p_open" else - var/area/A = get_area(src) - if(!A) - on = 0 - else - on = A.powered(EQUIP) // set "on" to the power status + icon_state = "intercom-p" + else + if(wiresexposed) + icon_state = "intercom_open" + else + icon_state = initial(icon_state) - if(!on) - if(wiresexposed) - icon_state = "intercom-p_open" - else - icon_state = "intercom-p" - else - if(wiresexposed) - icon_state = "intercom_open" - else - icon_state = initial(icon_state) //VOREStation Add Start /obj/item/device/radio/intercom/AICtrlClick(var/mob/user) ToggleBroadcast() diff --git a/vorestation.dme b/vorestation.dme index 489d0deb3f8..1b814ea4229 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -347,6 +347,7 @@ #include "code\datums\observation\logged_in.dm" #include "code\datums\observation\moved.dm" #include "code\datums\observation\observation.dm" +#include "code\datums\observation\power_change.dm" #include "code\datums\observation\shuttle_added.dm" #include "code\datums\observation\shuttle_moved.dm" #include "code\datums\observation\stat_set.dm"