From 41b2e512dfdcf917effb39dff496c0b6c2289d1a Mon Sep 17 00:00:00 2001
From: Zonespace <41448081+Zonespace27@users.noreply.github.com>
Date: Thu, 9 Nov 2023 05:28:39 -0800
Subject: [PATCH] Componentizes power cells (#4855)
# About the pull request
Creates a new, flexible component for power cells. Eventually, anything
powered will use a cell component instead of holding a ref to a
`/obj/item/cell` or having a `charge` variable.
Converts NVGs over to the new system as an example, the rest will come
in time.
Minor rework of how `emp_act()` works
# Explain why it's good for the game
Cells are one of the most obvious things to be componentized, and
componentizing them allows cells to be added to new objects in a very
easy manner.
# Testing Photographs and Procedure
Screenshots & Videos
Works
---
.../dcs/signals/atom/signals_atom.dm | 3 +
.../dcs/signals/atom/signals_cell.dm | 26 +++
code/datums/components/cell.dm | 202 ++++++++++++++++++
code/game/atoms.dm | 6 +-
code/game/machinery/atmoalter/scrubber.dm | 4 +-
code/game/machinery/bots/bots.dm | 1 +
code/game/machinery/bots/mulebot.dm | 2 +-
code/game/machinery/camera/camera.dm | 5 +-
code/game/machinery/camera/presets.dm | 9 +-
code/game/machinery/cell_charger.dm | 2 +-
code/game/machinery/computer/arcade.dm | 4 +-
.../game/machinery/computer/camera_console.dm | 4 +-
code/game/machinery/computer/computer.dm | 5 +-
code/game/machinery/computer/medical.dm | 4 +-
code/game/machinery/computer/security.dm | 4 +-
code/game/machinery/computer/skills.dm | 3 +-
code/game/machinery/deployable.dm | 1 +
code/game/machinery/doors/door.dm | 2 +-
code/game/machinery/fire_alarm.dm | 5 +-
code/game/machinery/flasher.dm | 3 +-
code/game/machinery/igniter.dm | 3 +-
code/game/machinery/lightswitch.dm | 3 +-
code/game/machinery/machinery.dm | 2 +-
code/game/machinery/medical_pod/sleeper.dm | 3 +-
code/game/machinery/recharger.dm | 10 +-
code/game/machinery/rechargestation.dm | 3 +-
code/game/machinery/spaceheater.dm | 3 +-
code/game/machinery/status_display.dm | 3 +-
.../machinery/telecomms/telecomunications.dm | 2 +-
.../items/circuitboards/robot_modules.dm | 3 +-
code/game/objects/items/devices/flash.dm | 2 +-
.../objects/items/devices/portable_vendor.dm | 1 +
.../game/objects/items/devices/radio/radio.dm | 2 +-
code/game/objects/items/explosives/mine.dm | 1 +
code/game/objects/items/implants/implant.dm | 4 +
.../items/implants/implantneurostim.dm | 1 +
code/game/objects/items/props/helmetgarb.dm | 81 ++++---
code/game/objects/items/storage/storage.dm | 1 +
code/game/objects/items/weapons/stunbaton.dm | 2 +-
.../closets/secure/secure_closets.dm | 2 +-
.../crates_lockers/secure_crates.dm | 2 +-
code/modules/clothing/clothing.dm | 2 +-
code/modules/clothing/clothing_accessories.dm | 2 +-
code/modules/clothing/glasses/thermal.dm | 2 +-
code/modules/clothing/suits/armor.dm | 2 +-
code/modules/clothing/suits/storage.dm | 2 +-
code/modules/clothing/under/ties.dm | 2 +-
.../modules/cm_marines/NonLethalRestraints.dm | 1 +
code/modules/cm_preds/falcon.dm | 1 +
code/modules/cm_preds/yaut_bracers.dm | 1 +
code/modules/defenses/defenses.dm | 1 +
code/modules/defenses/sentry_computer.dm | 1 +
code/modules/mob/living/brain/MMI.dm | 2 +-
code/modules/mob/living/brain/life.dm | 14 --
.../mob/living/carbon/human/human_defense.dm | 2 +-
code/modules/mob/living/living_defense.dm | 2 +-
code/modules/mob/living/silicon/ai/ai.dm | 2 +-
code/modules/mob/living/silicon/silicon.dm | 2 +-
.../simple_animal/hostile/retaliate/drone.dm | 1 +
code/modules/organs/limbs.dm | 1 +
code/modules/power/apc.dm | 2 +-
code/modules/power/cell.dm | 2 +-
code/modules/power/smes.dm | 2 +-
code/modules/projectiles/gun.dm | 1 +
code/modules/projectiles/guns/energy.dm | 2 +-
.../interior/interactable/vehicle_locker.dm | 2 +-
code/modules/vehicles/vehicle.dm | 1 +
colonialmarines.dme | 2 +
68 files changed, 348 insertions(+), 138 deletions(-)
create mode 100644 code/__DEFINES/dcs/signals/atom/signals_cell.dm
create mode 100644 code/datums/components/cell.dm
diff --git a/code/__DEFINES/dcs/signals/atom/signals_atom.dm b/code/__DEFINES/dcs/signals/atom/signals_atom.dm
index cac9861d09cb..d9bd1202c159 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_atom.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_atom.dm
@@ -51,3 +51,6 @@
/// Called when an atom is mouse dropped on another atom, from /client/MouseDrop: (atom/dropped_onto)
#define COMSIG_ATOM_DROP_ON "atom_drop_on"
+
+/// Called when an atom has emp_act called on it, from /atom/emp_act: (severity)
+#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
diff --git a/code/__DEFINES/dcs/signals/atom/signals_cell.dm b/code/__DEFINES/dcs/signals/atom/signals_cell.dm
new file mode 100644
index 000000000000..75e13d8bfdfc
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/atom/signals_cell.dm
@@ -0,0 +1,26 @@
+/// (charge_amount)
+#define COMSIG_CELL_USE_CHARGE "cell_use_charge"
+ #define COMPONENT_CELL_NO_USE_CHARGE (1<<0)
+
+/// (charge_amount)
+#define COMSIG_CELL_ADD_CHARGE "cell_add_charge"
+
+#define COMSIG_CELL_START_TICK_DRAIN "cell_start_tick_drain"
+
+#define COMSIG_CELL_STOP_TICK_DRAIN "cell_stop_tick_drain"
+
+/// (mob/living/user)
+#define COMSIG_CELL_TRY_RECHARGING "cell_try_recharging"
+ #define COMPONENT_CELL_NO_RECHARGE (1<<0)
+
+#define COMSIG_CELL_OUT_OF_CHARGE "cell_out_of_charge"
+
+/// (charge_amount)
+#define COMSIG_CELL_CHECK_CHARGE "cell_check_charge"
+ #define COMPONENT_CELL_CHARGE_INSUFFICIENT (1<<0)
+
+#define COMSIG_CELL_TRY_INSERT_CELL "cell_try_insert_cell"
+ #define COMPONENT_CANCEL_CELL_INSERT (1<<0)
+
+/// (mob/living/user)
+#define COMSIG_CELL_REMOVE_CELL "cell_remove_cell"
diff --git a/code/datums/components/cell.dm b/code/datums/components/cell.dm
new file mode 100644
index 000000000000..81ef3733e2e2
--- /dev/null
+++ b/code/datums/components/cell.dm
@@ -0,0 +1,202 @@
+#define UNLIMITED_CHARGE -1
+#define UNLIMITED_DISTANCE -1
+
+/datum/component/cell
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+ /// Maximum charge of the power cell, set to -1 for infinite charge
+ var/max_charge = 10000
+ /// Initial max charge of the power cell
+ var/initial_max_charge
+ /// Current charge of power cell
+ var/charge = 10000
+ /// If the component can be recharged by hitting its parent with a cell
+ var/hit_charge = FALSE
+ /// The maximum amount that can be recharged per tick when using a cell to recharge this component
+ var/max_recharge_tick = 400
+ /// If draining charge on process(), how much to drain per process call
+ var/charge_drain = 10
+ /// If the parent should show cell charge on examine
+ var/display_charge = TRUE
+ /// From how many tiles at the highest someone can examine the parent to see the charge
+ var/charge_examine_range = 1
+ /// If the component requires a cell to be inserted to work instead of having an integrated one
+ var/cell_insert = FALSE
+ /// Ref to an inserted cell. Should only be null if cell_insert is false
+ var/obj/item/cell/inserted_cell
+
+
+/datum/component/cell/Initialize(
+ max_charge = 10000,
+ hit_charge = FALSE,
+ max_recharge_tick = 400,
+ charge_drain = 10,
+ display_charge = TRUE,
+ charge_examine_range = 1,
+ cell_insert = FALSE,
+ )
+
+ . = ..()
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.max_charge = max_charge
+ charge = max_charge
+ src.hit_charge = hit_charge
+ src.max_recharge_tick = max_recharge_tick
+ src.charge_drain = charge_drain
+ src.display_charge = display_charge
+ src.charge_examine_range = charge_examine_range
+ src.cell_insert = cell_insert
+
+/datum/component/cell/Destroy(force, silent)
+ QDEL_NULL(inserted_cell)
+ return ..()
+
+
+/datum/component/cell/RegisterWithParent()
+ ..()
+ RegisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_ITEM_ATTACKED), PROC_REF(on_object_hit))
+ RegisterSignal(parent, COMSIG_CELL_ADD_CHARGE, PROC_REF(add_charge))
+ RegisterSignal(parent, COMSIG_CELL_USE_CHARGE, PROC_REF(use_charge))
+ RegisterSignal(parent, COMSIG_CELL_CHECK_CHARGE, PROC_REF(has_charge))
+ RegisterSignal(parent, COMSIG_CELL_START_TICK_DRAIN, PROC_REF(start_drain))
+ RegisterSignal(parent, COMSIG_CELL_STOP_TICK_DRAIN, PROC_REF(stop_drain))
+ RegisterSignal(parent, COMSIG_CELL_REMOVE_CELL, PROC_REF(remove_cell))
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp))
+
+/datum/component/cell/process()
+ use_charge(null, charge_drain)
+
+/datum/component/cell/proc/on_emp(datum/source, severity)
+ SIGNAL_HANDLER
+
+ use_charge(null, round(max_charge / severity))
+
+/datum/component/cell/proc/start_drain(datum/source)
+ SIGNAL_HANDLER
+
+ START_PROCESSING(SSobj, src)
+
+/datum/component/cell/proc/stop_drain(datum/source)
+ SIGNAL_HANDLER
+
+ STOP_PROCESSING(SSobj, src)
+
+/datum/component/cell/proc/on_examine(datum/source, mob/examiner, list/examine_text)
+ SIGNAL_HANDLER
+
+ if(!display_charge)
+ return
+
+ if((charge_examine_range != UNLIMITED_DISTANCE) && get_dist(examiner, parent) > charge_examine_range)
+ return
+
+ examine_text += "A small gauge in the corner reads \"Power: [round(100 * charge / max_charge)]%\"."
+
+/datum/component/cell/proc/on_object_hit(datum/source, obj/item/cell/attack_obj, mob/living/attacker, params)
+ SIGNAL_HANDLER
+
+ if(!hit_charge || !istype(attack_obj))
+ return
+
+ if(!cell_insert)
+ INVOKE_ASYNC(src, PROC_REF(charge_from_cell), attack_obj, attacker)
+
+ else
+ insert_cell(attack_obj, attacker)
+
+ return COMPONENT_NO_AFTERATTACK|COMPONENT_CANCEL_ITEM_ATTACK
+
+/datum/component/cell/proc/insert_cell(obj/item/cell/power_cell, mob/living/user)
+ if(inserted_cell)
+ to_chat(user, SPAN_WARNING("There's already a power cell in [parent]!"))
+ return
+
+ if(SEND_SIGNAL(parent, COMSIG_CELL_TRY_INSERT_CELL) & COMPONENT_CANCEL_CELL_INSERT)
+ return
+
+ power_cell.drop_to_floor(user)
+ power_cell.forceMove(parent)
+ inserted_cell = power_cell
+ charge = power_cell.charge
+ max_charge = power_cell.maxcharge
+
+/datum/component/cell/proc/remove_cell(mob/living/user)
+ SIGNAL_HANDLER
+
+ user.put_in_hands(inserted_cell, TRUE)
+ to_chat(user, SPAN_NOTICE("You remove [inserted_cell] from [parent]."))
+ inserted_cell = null
+ max_charge = initial_max_charge
+ charge = 0
+
+/datum/component/cell/proc/charge_from_cell(obj/item/cell/power_cell, mob/living/user)
+ if(max_charge == UNLIMITED_CHARGE)
+ to_chat(user, SPAN_WARNING("[parent] doesn't need more power."))
+ return
+
+ while(charge < max_charge)
+ if(SEND_SIGNAL(parent, COMSIG_CELL_TRY_RECHARGING, user) & COMPONENT_CELL_NO_RECHARGE)
+ return
+
+ if(power_cell.charge <= 0)
+ to_chat(user, SPAN_WARNING("[power_cell] is completely dry."))
+ return
+
+ if(!do_after(user, 1 SECONDS, (INTERRUPT_ALL & (~INTERRUPT_MOVED)), BUSY_ICON_BUILD, power_cell, INTERRUPT_DIFF_LOC))
+ to_chat(user, SPAN_WARNING("You were interrupted."))
+ return
+
+ if(power_cell.charge <= 0)
+ return
+
+ var/to_transfer = min(max_recharge_tick, power_cell.charge, (max_charge - charge))
+ if(power_cell.use(to_transfer))
+ add_charge(null, to_transfer)
+ to_chat(user, "You transfer some power between [power_cell] and [parent]. The gauge now reads: [round(100 * charge / max_charge)]%.")
+
+/datum/component/cell/proc/add_charge(datum/source, charge_add = 0)
+ SIGNAL_HANDLER
+
+ if(max_charge == UNLIMITED_CHARGE)
+ return
+
+ if(!charge_add)
+ return
+
+ charge = clamp(charge + charge_add, 0, max_charge)
+
+/datum/component/cell/proc/use_charge(datum/source, charge_use = 0)
+ SIGNAL_HANDLER
+
+ if(max_charge == UNLIMITED_CHARGE)
+ return
+
+ if(!charge_use)
+ return
+
+ if(!charge)
+ return COMPONENT_CELL_NO_USE_CHARGE
+
+ charge = clamp(charge - charge_use, 0, max_charge)
+
+ if(!charge)
+ on_charge_empty()
+ return
+
+/datum/component/cell/proc/has_charge(datum/source, charge_amount = 0)
+ SIGNAL_HANDLER
+
+ if(!charge)
+ return COMPONENT_CELL_CHARGE_INSUFFICIENT
+
+ if(charge < charge_amount)
+ return COMPONENT_CELL_CHARGE_INSUFFICIENT
+
+/datum/component/cell/proc/on_charge_empty()
+ stop_drain()
+ SEND_SIGNAL(parent, COMSIG_CELL_OUT_OF_CHARGE)
+
+#undef UNLIMITED_CHARGE
+#undef UNLIMITED_DISTANCE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 283efdc50a22..44494bea83a0 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -205,7 +205,9 @@ directive is properly returned.
return
/atom/proc/emp_act(severity)
- return
+ SHOULD_CALL_PARENT(TRUE)
+
+ SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
@@ -245,8 +247,8 @@ directive is properly returned.
if(!examine_strings)
log_debug("Attempted to create an examine block with no strings! Atom : [src], user : [user]")
return
- to_chat(user, examine_block(examine_strings.Join("\n")))
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, examine_strings)
+ to_chat(user, examine_block(examine_strings.Join("\n")))
/atom/proc/get_examine_text(mob/user)
. = list()
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 0af38cacd75e..1c240fb05dfb 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -18,16 +18,14 @@
PF.flags_can_pass_all = PASS_OVER|PASS_AROUND|PASS_UNDER
/obj/structure/machinery/portable_atmospherics/powered/scrubber/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
if(prob(50/severity))
on = !on
update_icon()
- ..(severity)
-
/obj/structure/machinery/portable_atmospherics/powered/scrubber/update_icon()
src.overlays = 0
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 116753093fe5..912a6070328a 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -114,6 +114,7 @@
/obj/structure/machinery/bot/emp_act(severity)
+ . = ..()
var/was_on = on
stat |= EMPED
new /obj/effect/overlay/temp/emp_sparks (loc)
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index d82591994e7b..b88f8249566b 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -916,11 +916,11 @@
post_signal_multiple(control_freq, kv)
/obj/structure/machinery/bot/mulebot/emp_act(severity)
+ . = ..()
if (cell)
cell.emp_act(severity)
if(load)
load.emp_act(severity)
- ..()
/obj/structure/machinery/bot/mulebot/explode()
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index d416c561fcd3..3b2a91eea314 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -35,6 +35,9 @@
var/colony_camera_mapload = TRUE
+ /// If this camera should have innate EMP-proofing
+ var/emp_proof = FALSE
+
/obj/structure/machinery/camera/Initialize(mapload, ...)
. = ..()
WireColorToFlag = randomCameraWires()
@@ -72,6 +75,7 @@
if(WEST) pixel_x = 27
/obj/structure/machinery/camera/emp_act(severity)
+ . = ..()
if(!isEmpProof())
if(prob(100/severity))
icon_state = "[initial(icon_state)]emp"
@@ -89,7 +93,6 @@
if(can_use())
cameranet.addCamera(src)
kick_viewers()
- ..()
/obj/structure/machinery/camera/ex_act(severity)
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index a8735cbc06a8..e5ab520cbee8 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -30,6 +30,7 @@
network = list(CAMERA_NET_LASER_TARGETS)
unslashable = TRUE
unacidable = TRUE
+ emp_proof = TRUE
/obj/structure/machinery/camera/laser_cam/Initialize(mapload, laser_name)
. = ..()
@@ -37,8 +38,6 @@
var/area/A = get_area(src)
c_tag = "[laser_name] ([A.name])"
-/obj/structure/machinery/camera/laser_cam/emp_act(severity)
- return //immune to EMPs, just in case
/obj/structure/machinery/camera/laser_cam/ex_act()
return
@@ -125,9 +124,7 @@
invisibility = 101 //fuck you init()
colony_camera_mapload = FALSE
-
-/obj/structure/machinery/camera/autoname/lz_camera/emp_act(severity)
- return //immune to EMPs, just in case
+ emp_proof = TRUE
/obj/structure/machinery/camera/autoname/lz_camera/ex_act()
return
@@ -137,7 +134,7 @@
/obj/structure/machinery/camera/proc/isEmpProof()
var/O = locate(/obj/item/stack/sheet/mineral/osmium) in assembly.upgrades
- return O
+ return O || emp_proof
/obj/structure/machinery/camera/proc/isXRay()
var/obj/item/stock_parts/scanning_module/O = locate(/obj/item/stock_parts/scanning_module) in assembly.upgrades
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index fcd8c65e93ca..eb7a501fa078 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -80,11 +80,11 @@
return
/obj/structure/machinery/cell_charger/emp_act(severity)
+ . = ..()
if(inoperable())
return
if(charging)
charging.emp_act(severity)
- ..(severity)
/obj/structure/machinery/cell_charger/process()
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 8d35dd1b6aff..1ac5a06738d5 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -165,8 +165,8 @@
return
/obj/structure/machinery/computer/arcade/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
var/empprize = null
var/num_of_prizes = 0
@@ -178,5 +178,3 @@
for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
empprize = pickweight(prizes)
new empprize(src.loc)
-
- ..(severity)
diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm
index 281c548227b0..0fd487e2ef7c 100644
--- a/code/game/machinery/computer/camera_console.dm
+++ b/code/game/machinery/computer/camera_console.dm
@@ -354,8 +354,8 @@
exproof = TRUE
colony_camera_mapload = FALSE
-/obj/structure/machinery/computer/cameras/mortar/emp_act(severity)
- return FALSE
+/obj/structure/machinery/computer/cameras/mortar/set_broken()
+ return
/obj/structure/machinery/computer/cameras/dropship
name = "abstract dropship camera computer"
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 304b24a14f04..c33517796271 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -31,8 +31,9 @@
return 1
/obj/structure/machinery/computer/emp_act(severity)
- if(prob(20/severity)) set_broken()
- ..()
+ . = ..()
+ if(prob(20/severity))
+ set_broken()
/obj/structure/machinery/computer/ex_act(severity)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index fe85599018ae..53efad3da877 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -483,8 +483,8 @@
return
/obj/structure/machinery/computer/med_data/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
for(var/datum/data/record/R as anything in GLOB.data_core.medical)
@@ -509,8 +509,6 @@
qdel(R)
continue
- ..(severity)
-
/obj/structure/machinery/computer/med_data/laptop
name = "Medical Laptop"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 857118937910..2d9a4a1dbea4 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -524,8 +524,8 @@ What a mess.*/
return selection.fields["img"]
/obj/structure/machinery/computer/secure_data/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
for(var/datum/data/record/R in GLOB.data_core.security)
@@ -550,8 +550,6 @@ What a mess.*/
qdel(R)
continue
- ..(severity)
-
/obj/structure/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/structures/machinery/computer.dmi'
icon_state = "messyfiles"
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index a20d344b53a9..60b5aa232940 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -347,8 +347,8 @@ What a mess.*/
return
/obj/structure/machinery/computer/skills/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
for(var/datum/data/record/R in GLOB.data_core.security)
@@ -373,4 +373,3 @@ What a mess.*/
qdel(R)
continue
- ..(severity)
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 99996bea8978..687882d9d7ae 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -65,6 +65,7 @@
return
/obj/structure/machinery/deployable/barrier/emp_act(severity)
+ . = ..()
if(inoperable())
return
if(prob(50/severity))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 578ef368f5d9..642d91d53395 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -144,6 +144,7 @@
return 1
/obj/structure/machinery/door/emp_act(severity)
+ . = ..()
if(prob(20/severity) && (istype(src,/obj/structure/machinery/door/airlock) || istype(src,/obj/structure/machinery/door/window)) )
open()
if(prob(40/severity))
@@ -151,7 +152,6 @@
secondsElectrified = -1
spawn(30 SECONDS)
secondsElectrified = 0
- ..()
/obj/structure/machinery/door/ex_act(severity)
diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm
index fe1f80646c4f..dd7e0ee70150 100644
--- a/code/game/machinery/fire_alarm.dm
+++ b/code/game/machinery/fire_alarm.dm
@@ -63,8 +63,9 @@ FIRE ALARM
return src.alarm()
/obj/structure/machinery/firealarm/emp_act(severity)
- if(prob(50/severity)) alarm()
- ..()
+ . = ..()
+ if(prob(50/severity))
+ alarm()
/obj/structure/machinery/firealarm/attackby(obj/item/held_object as obj, mob/user as mob)
src.add_fingerprint(user)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 75d0de56dec0..cd59862a2e13 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -84,12 +84,11 @@
/obj/structure/machinery/flasher/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
if(prob(75/severity))
flash()
- ..(severity)
/obj/structure/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj)
if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 33f75c50e341..d5a0505fca17 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -105,11 +105,10 @@
return 1
/obj/structure/machinery/sparker/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
ignite()
- ..(severity)
/obj/structure/machinery/ignition_switch/attack_remote(mob/user as mob)
return attack_hand(user)
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 66eb0386713f..de61830c2501 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -62,8 +62,7 @@
updateicon()
/obj/structure/machinery/light_switch/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
power_change()
- ..(severity)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4ce295aa9965..66bf08afba8e 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -175,10 +175,10 @@ Class Procs:
. += SPAN_WARNING("[msg]")
/obj/structure/machinery/emp_act(severity)
+ . = ..()
if(use_power && stat == 0)
use_power(7500/severity)
new /obj/effect/overlay/temp/emp_sparks (loc)
- ..()
/obj/structure/machinery/ex_act(severity)
diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm
index 35d9a44863d2..bf2abe246c35 100644
--- a/code/game/machinery/medical_pod/sleeper.dm
+++ b/code/game/machinery/medical_pod/sleeper.dm
@@ -332,14 +332,13 @@
/obj/structure/machinery/medical_pod/sleeper/emp_act(severity)
+ . = ..()
if(filtering)
toggle_filter()
if(inoperable())
- ..(severity)
return
if(occupant)
go_out()
- ..()
/obj/structure/machinery/medical_pod/sleeper/proc/toggle_filter()
if(!occupant)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index c75360e07568..72e311c6d8ff 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -218,20 +218,14 @@
update_icon()
/obj/structure/machinery/recharger/emp_act(severity)
+ . = ..()
if(inoperable() || !anchored)
- ..(severity)
return
-/*
- if(istype(charging, /obj/item/weapon/gun/energy))
- var/obj/item/weapon/gun/energy/E = charging
- if(E.power_supply)
- E.power_supply.emp_act(severity)
-*/
+
if(istype(charging, /obj/item/weapon/baton))
var/obj/item/weapon/baton/B = charging
if(B.bcell)
B.bcell.charge = 0
- ..(severity)
/obj/structure/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
src.overlays = 0
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 644402128852..56b782cd77a4 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -109,13 +109,12 @@
return
/obj/structure/machinery/recharge_station/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
if(occupant)
occupant.emp_act(severity)
go_out()
- ..(severity)
/obj/structure/machinery/recharge_station/update_icon()
..()
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index aa51201ae18b..dd45ad597800 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -40,12 +40,11 @@
/obj/structure/machinery/space_heater/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
if(cell)
cell.emp_act(severity)
- ..(severity)
/obj/structure/machinery/space_heater/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/cell))
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index c56f8da36150..79ead6321502 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -188,11 +188,10 @@
var/emotion = "Neutral"
/obj/structure/machinery/ai_status_display/emp_act(severity)
+ . = ..()
if(inoperable())
- ..(severity)
return
set_picture("ai_bsod")
- ..(severity)
/obj/structure/machinery/ai_status_display/proc/update()
if(mode==0) //Blank
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 255d70f45870..8b8b12dfd170 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -93,13 +93,13 @@ GLOBAL_LIST_EMPTY_TYPED(telecomms_list, /obj/structure/machinery/telecomms)
update_state()
/obj/structure/machinery/telecomms/emp_act(severity)
+ . = ..()
if(prob(100/severity))
if(!(stat & EMPED))
stat |= EMPED
var/duration = (300 * 10)/severity
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
stat &= ~EMPED
- ..()
/*
The receiver idles and receives messages from subspace-compatible radio equipment;
diff --git a/code/game/objects/items/circuitboards/robot_modules.dm b/code/game/objects/items/circuitboards/robot_modules.dm
index 2e5185353852..04fcff10fa2b 100644
--- a/code/game/objects/items/circuitboards/robot_modules.dm
+++ b/code/game/objects/items/circuitboards/robot_modules.dm
@@ -9,13 +9,12 @@
var/list/stacktypes
/obj/item/circuitboard/robot_module/emp_act(severity)
+ . = ..()
if(modules)
for(var/obj/O in modules)
O.emp_act(severity)
if(emag)
emag.emp_act(severity)
- ..()
- return
/obj/item/circuitboard/robot_module/Initialize()
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 0a7709aa6101..33a93ed18db5 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -155,6 +155,7 @@
do_flash(user = user, aoe = TRUE)
/obj/item/device/flash/emp_act(severity)
+ . = ..()
if(broken) return
switch(flashes_stored)
if(0 to 5)
@@ -168,7 +169,6 @@
if(M.flash_eyes())
M.apply_effect(10, WEAKEN)
M.visible_message(SPAN_DISARM("[M] is blinded by \the [src]!"))
- ..()
/obj/item/device/flash/synthetic
name = "synthetic flash"
diff --git a/code/game/objects/items/devices/portable_vendor.dm b/code/game/objects/items/devices/portable_vendor.dm
index 65e2128a02c0..29e1d06018ae 100644
--- a/code/game/objects/items/devices/portable_vendor.dm
+++ b/code/game/objects/items/devices/portable_vendor.dm
@@ -210,6 +210,7 @@
s.start()
/obj/item/device/portable_vendor/emp_act(severity)
+ . = ..()
if (broken)
return
if (prob(40*severity))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 2092ffa108c6..c503edc8f94f 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -425,11 +425,11 @@
else return
/obj/item/device/radio/emp_act(severity)
+ . = ..()
broadcasting = FALSE
listening = FALSE
for (var/ch_name in channels)
channels[ch_name] = 0
- ..()
///////////////////////////////
//////////Borg Radios//////////
diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm
index 742a5f314c4a..57dd23bf4e96 100644
--- a/code/game/objects/items/explosives/mine.dm
+++ b/code/game/objects/items/explosives/mine.dm
@@ -42,6 +42,7 @@
prime() //We don't care about how strong the explosion was.
/obj/item/explosive/mine/emp_act()
+ . = ..()
prime() //Same here. Don't care about the effect strength.
diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm
index d39b7e675452..e7ebe0391fae 100644
--- a/code/game/objects/items/implants/implant.dm
+++ b/code/game/objects/items/implants/implant.dm
@@ -82,6 +82,7 @@ Implant Specifics:
"}
return dat
/obj/item/implant/tracking/emp_act(severity)
+ . = ..()
if (malfunction) //no, dawg, you can't malfunction while you are malfunctioning
return
malfunction = MALFUNCTION_TEMPORARY
@@ -216,6 +217,7 @@ Implant Specifics:
"}
return 1
/obj/item/implant/explosive/emp_act(severity)
+ . = ..()
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
@@ -307,6 +309,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
return
/obj/item/implant/chem/emp_act(severity)
+ . = ..()
if (malfunction)
return
malfunction = MALFUNCTION_TEMPORARY
@@ -432,6 +435,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
STOP_PROCESSING(SSobj, src)
/obj/item/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this
+ . = ..()
if (malfunction) //so I'm just going to add a meltdown chance here
return
malfunction = MALFUNCTION_TEMPORARY
diff --git a/code/game/objects/items/implants/implantneurostim.dm b/code/game/objects/items/implants/implantneurostim.dm
index a46cc31a2ca4..544cf70147e2 100644
--- a/code/game/objects/items/implants/implantneurostim.dm
+++ b/code/game/objects/items/implants/implantneurostim.dm
@@ -105,6 +105,7 @@
/obj/item/implant/neurostim/emp_act(severity)
+ . = ..()
if (malfunction)
return
if (prob(80))
diff --git a/code/game/objects/items/props/helmetgarb.dm b/code/game/objects/items/props/helmetgarb.dm
index 72c49a0ea15a..52d1ae616a93 100644
--- a/code/game/objects/items/props/helmetgarb.dm
+++ b/code/game/objects/items/props/helmetgarb.dm
@@ -99,10 +99,8 @@
var/nvg_maxhealth = 125
var/nvg_health = 125
- var/nvg_maxcharge = 2500
- var/nvg_charge = 2500
- var/nvg_drain = 8 // has a 5 minute duration but byond may give it a couple of irl time due to lag
- var/infinite_charge = FALSE
+ /// How much charge the cell should have at most. -1 is infinite
+ var/cell_max_charge = 2500
var/activated = FALSE
var/nightvision = FALSE
@@ -117,6 +115,13 @@
var/mob/living/attached_mob
var/lighting_alpha = 100
+/obj/item/prop/helmetgarb/helmet_nvg/Initialize(mapload, ...)
+ . = ..()
+ if(shape != NVG_SHAPE_COSMETIC)
+ AddComponent(/datum/component/cell, cell_max_charge, TRUE, charge_drain = 8)
+ RegisterSignal(src, COMSIG_CELL_TRY_RECHARGING, PROC_REF(cell_try_recharge))
+ RegisterSignal(src, COMSIG_CELL_OUT_OF_CHARGE, PROC_REF(on_power_out))
+
/obj/item/prop/helmetgarb/helmet_nvg/on_enter_storage(obj/item/storage/internal/S)
..()
@@ -139,42 +144,30 @@
/obj/item/prop/helmetgarb/helmet_nvg/attackby(obj/item/A as obj, mob/user as mob)
- if(istype(A,/obj/item/cell))
- recharge(A, user)
-
if(HAS_TRAIT(A, TRAIT_TOOL_SCREWDRIVER))
repair(user)
else
..()
-/obj/item/prop/helmetgarb/helmet_nvg/proc/recharge(obj/item/cell/C, mob/user as mob)
+/obj/item/prop/helmetgarb/helmet_nvg/proc/cell_try_recharge(datum/source, mob/living/user)
+ SIGNAL_HANDLER
+
if(user.action_busy)
- return
+ return COMPONENT_CELL_NO_RECHARGE
+
if(src != user.get_inactive_hand())
- to_chat(user, SPAN_WARNING("You need to hold \the [src] in hand in order to recharge them."))
- return
+ to_chat(user, SPAN_WARNING("You need to hold [src] in hand in order to recharge them."))
+ return COMPONENT_CELL_NO_RECHARGE
+
if(shape == NVG_SHAPE_COSMETIC)
- to_chat(user, SPAN_WARNING("There is no connector for the power cell inside \the [src]."))
- return
+ to_chat(user, SPAN_WARNING("There is no connector for the power cell inside [src]."))
+ return COMPONENT_CELL_NO_RECHARGE
+
if(shape == NVG_SHAPE_BROKEN)
- to_chat(user, SPAN_WARNING("You need to repair \the [src] first."))
- return
- if(nvg_charge == nvg_maxcharge)
- to_chat(user, SPAN_WARNING("\The [src] are already fully charged."))
- return
+ to_chat(user, SPAN_WARNING("You need to repair [src] first."))
+ return COMPONENT_CELL_NO_RECHARGE
- while(nvg_charge < nvg_maxcharge)
- if(C.charge <= 0)
- to_chat(user, SPAN_WARNING("\The [C] is completely dry."))
- break
- if(!do_after(user, 1 SECONDS, (INTERRUPT_ALL & (~INTERRUPT_MOVED)), BUSY_ICON_BUILD, C, INTERRUPT_DIFF_LOC))
- to_chat(user, SPAN_WARNING("You were interrupted."))
- break
- var/to_transfer = min(400, C.charge, (nvg_maxcharge - nvg_charge))
- if(C.use(to_transfer))
- nvg_charge += to_transfer
- to_chat(user, "You transfer some power between \the [C] and \the [src]. The gauge now reads: [round(100.0*nvg_charge/nvg_maxcharge) ]%.")
/obj/item/prop/helmetgarb/helmet_nvg/proc/repair(mob/user as mob)
if(user.action_busy)
@@ -202,7 +195,6 @@
to_chat(user, "You successfully patch \the [src].")
nvg_maxhealth = 65
nvg_health = 65
- nvg_drain = initial(nvg_drain) * 2
return
else if(nvg_health == nvg_maxhealth)
@@ -244,9 +236,6 @@
else if(nvg_health_procent >= 0)
. += "They are falling apart."
- if (get_dist(user, src) <= 1 && (shape == NVG_SHAPE_FINE || shape == NVG_SHAPE_PATCHED))
- . += "A small gauge in the corner reads: Power: [round(100.0*nvg_charge/nvg_maxcharge) ]%."
-
/obj/item/prop/helmetgarb/helmet_nvg/on_exit_storage(obj/item/storage/S)
remove_attached_item()
return ..()
@@ -296,7 +285,7 @@
if(attached_mob != user && slot == WEAR_HEAD)
set_attached_mob(user)
- if(slot == WEAR_HEAD && !nightvision && activated && nvg_charge > 0 && shape > NVG_SHAPE_BROKEN)
+ if(slot == WEAR_HEAD && !nightvision && activated && !SEND_SIGNAL(src, COMSIG_CELL_CHECK_CHARGE) && shape > NVG_SHAPE_BROKEN)
enable_nvg(user)
else
remove_nvg()
@@ -319,7 +308,7 @@
attached_item.update_icon()
activation.update_button_icon()
- START_PROCESSING(SSobj, src)
+ SEND_SIGNAL(src, COMSIG_CELL_START_TICK_DRAIN)
/obj/item/prop/helmetgarb/helmet_nvg/proc/update_sight(mob/M)
@@ -353,20 +342,15 @@
attached_mob.update_sight()
- STOP_PROCESSING(SSobj, src)
+ SEND_SIGNAL(src, COMSIG_CELL_STOP_TICK_DRAIN)
/obj/item/prop/helmetgarb/helmet_nvg/process(delta_time)
- if(nvg_charge > 0 && !infinite_charge)
- nvg_charge = max(0, nvg_charge - nvg_drain * delta_time)
-
if(!attached_mob)
return PROCESS_KILL
- if(!activated || !attached_item || nvg_charge <= 0 || attached_mob.is_dead())
- if(activated && !attached_mob.is_dead())
- to_chat(attached_mob, SPAN_WARNING("\The [src] emit a low power warning and immediately shut down!"))
- remove_nvg()
+ if(!activated || !attached_item || attached_mob.is_dead())
+ on_power_out()
return
if(!attached_item.has_garb_overlay())
@@ -375,6 +359,13 @@
return
+/obj/item/prop/helmetgarb/helmet_nvg/proc/on_power_out(datum/source)
+ SIGNAL_HANDLER
+
+ if(activated && !attached_mob.is_dead())
+ to_chat(attached_mob, SPAN_WARNING("[src] emit a low power warning and immediately shut down!"))
+ remove_nvg()
+
/obj/item/prop/helmetgarb/helmet_nvg/ui_action_click(mob/owner, obj/item/holder)
toggle_nods(owner)
@@ -410,7 +401,7 @@
if(activated)
to_chat(user, SPAN_NOTICE("You flip the goggles down."))
icon_state = active_icon_state
- if(nvg_charge > 0 && user.head == attached_item && shape > NVG_SHAPE_BROKEN)
+ if(!SEND_SIGNAL(src, COMSIG_CELL_CHECK_CHARGE) && user.head == attached_item && shape > NVG_SHAPE_BROKEN)
enable_nvg(user)
else
icon_state = active_icon_state
@@ -462,7 +453,7 @@
/obj/item/prop/helmetgarb/helmet_nvg/marsoc //for Marine Raiders
name = "\improper Tactical M3 night vision goggles"
desc = "With an integrated self-recharging battery, nothing can stop you. Put them on your helmet and press the button and it's go-time."
- infinite_charge = TRUE
+ cell_max_charge = -1
#undef NVG_SHAPE_COSMETIC
#undef NVG_SHAPE_BROKEN
diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm
index cfdb2f88b090..6e7e891d6ba8 100644
--- a/code/game/objects/items/storage/storage.dm
+++ b/code/game/objects/items/storage/storage.dm
@@ -852,6 +852,7 @@ W is always an item. stop_warning prevents messaging. user may be null.**/
return ..()
/obj/item/storage/emp_act(severity)
+ . = ..()
if(!istype(src.loc, /mob/living))
for(var/obj/O in contents)
O.emp_act(severity)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 6cb9f58aae37..82fdf30f0fc4 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -197,9 +197,9 @@
return TRUE
/obj/item/weapon/baton/emp_act(severity)
+ . = ..()
if(bcell)
bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please.
- ..()
//secborg stun baton module
/obj/item/weapon/baton/robot/attack_self(mob/user)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index e290a23a61e9..331cb884bd59 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -30,6 +30,7 @@
return 0
/obj/structure/closet/secure_closet/emp_act(severity)
+ . = ..()
for(var/obj/O in src)
O.emp_act(severity)
if(!broken)
@@ -42,7 +43,6 @@
else
src.req_access = list()
src.req_access += pick(get_access(ACCESS_LIST_MARINE_MAIN))
- ..()
/obj/structure/closet/secure_closet/proc/togglelock(mob/living/user)
if(src.opened)
diff --git a/code/game/objects/structures/crates_lockers/secure_crates.dm b/code/game/objects/structures/crates_lockers/secure_crates.dm
index e720199f9fbe..28a77e0c81c0 100644
--- a/code/game/objects/structures/crates_lockers/secure_crates.dm
+++ b/code/game/objects/structures/crates_lockers/secure_crates.dm
@@ -87,6 +87,7 @@
..()
/obj/structure/closet/crate/secure/emp_act(severity)
+ . = ..()
for(var/obj/O in src)
O.emp_act(severity)
if(!broken && !opened && prob(50/severity))
@@ -106,7 +107,6 @@
else
src.req_access = list()
src.req_access += pick(get_access(ACCESS_LIST_MARINE_MAIN))
- ..()
//------------------------------------
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index bffbda9f538a..bd87746545d8 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -217,6 +217,7 @@
M.update_inv_gloves()
/obj/item/clothing/gloves/emp_act(severity)
+ . = ..()
if(cell)
//why is this not part of the powercell code?
cell.charge -= 1000 / severity
@@ -224,7 +225,6 @@
cell.charge = 0
if(cell.reliability != 100 && prob(50/severity))
cell.reliability -= 10 / severity
- ..()
// Called just before an attack_hand(), in mob/UnarmedAttack()
/obj/item/clothing/gloves/proc/Touch(atom/A, proximity)
diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm
index ba855e42d3ba..e4a19b7bed3e 100644
--- a/code/modules/clothing/clothing_accessories.dm
+++ b/code/modules/clothing/clothing_accessories.dm
@@ -148,7 +148,7 @@
verbs -= /obj/item/clothing/proc/removetie_verb
/obj/item/clothing/emp_act(severity)
+ . = ..()
if(LAZYLEN(accessories))
for(var/obj/item/clothing/accessory/A in accessories)
A.emp_act(severity)
- ..()
diff --git a/code/modules/clothing/glasses/thermal.dm b/code/modules/clothing/glasses/thermal.dm
index b2ec7597e270..f4a728c8864d 100644
--- a/code/modules/clothing/glasses/thermal.dm
+++ b/code/modules/clothing/glasses/thermal.dm
@@ -18,6 +18,7 @@
var/blinds_on_emp = TRUE
/obj/item/clothing/glasses/thermal/emp_act(severity)
+ . = ..()
if(blinds_on_emp)
if(istype(src.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src.loc
@@ -29,7 +30,6 @@
M.disabilities |= NEARSIGHTED
spawn(100)
M.disabilities &= ~NEARSIGHTED
- ..()
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2c023fed2ed7..82d461c5ca55 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -335,10 +335,10 @@
add_fingerprint(user)
/obj/item/clothing/suit/armor/reactive/emp_act(severity)
+ . = ..()
active = 0
src.icon_state = "reactiveoff"
src.item_state = "reactiveoff"
- ..()
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index a18faa60c0d3..0d5fc31a2560 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -33,8 +33,8 @@
return pockets.attackby(W, user)
/obj/item/clothing/suit/storage/emp_act(severity)
+ . = ..()
pockets.emp_act(severity)
- ..()
/obj/item/clothing/suit/storage/hear_talk(mob/living/M, msg, verb, datum/language/speaking, italics)
pockets.hear_talk(M, msg, verb, speaking, italics)
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index ee19f9ef7d5f..a0c8219ffe69 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -440,8 +440,8 @@
return hold.attackby(W, user)
/obj/item/clothing/accessory/storage/emp_act(severity)
+ . = ..()
hold.emp_act(severity)
- ..()
/obj/item/clothing/accessory/storage/hear_talk(mob/M, msg)
hold.hear_talk(M, msg)
diff --git a/code/modules/cm_marines/NonLethalRestraints.dm b/code/modules/cm_marines/NonLethalRestraints.dm
index 78884aa59843..a7f0277c8aaa 100644
--- a/code/modules/cm_marines/NonLethalRestraints.dm
+++ b/code/modules/cm_marines/NonLethalRestraints.dm
@@ -60,6 +60,7 @@
/obj/item/weapon/stunprod/emp_act(severity)
+ . = ..()
switch(severity)
if(1)
charges = 0
diff --git a/code/modules/cm_preds/falcon.dm b/code/modules/cm_preds/falcon.dm
index 4461f9b4f7e7..63c7e72ab670 100644
--- a/code/modules/cm_preds/falcon.dm
+++ b/code/modules/cm_preds/falcon.dm
@@ -119,6 +119,7 @@
qdel(src)
/mob/hologram/falcon/emp_act()
+ . = ..()
new /obj/item/trash/falcon_drone/emp(loc)
QDEL_NULL(parent_drone)
qdel(src)
diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm
index c0101d636c72..7173575710b1 100644
--- a/code/modules/cm_preds/yaut_bracers.dm
+++ b/code/modules/cm_preds/yaut_bracers.dm
@@ -291,6 +291,7 @@
right_wristblades = new(src)
/obj/item/clothing/gloves/yautja/hunter/emp_act(severity)
+ . = ..()
charge = max(charge - (severity * 500), 0)
if(ishuman(loc))
var/mob/living/carbon/human/wearer = loc
diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm
index b39128b1a8bc..099b41aee72b 100644
--- a/code/modules/defenses/defenses.dm
+++ b/code/modules/defenses/defenses.dm
@@ -431,6 +431,7 @@
turned_on = FALSE
/obj/structure/machinery/defenses/emp_act(severity)
+ . = ..()
if(turned_on)
if(prob(50))
visible_message("[icon2html(src, viewers(src))] [src] beeps and buzzes wildly, flashing odd symbols on its screen before shutting down!")
diff --git a/code/modules/defenses/sentry_computer.dm b/code/modules/defenses/sentry_computer.dm
index dd5726d6ccbf..e2cbd5d5858e 100644
--- a/code/modules/defenses/sentry_computer.dm
+++ b/code/modules/defenses/sentry_computer.dm
@@ -121,6 +121,7 @@
playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE)
/obj/item/device/sentry_computer/emp_act(severity)
+ . = ..()
return TRUE
/**
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index 3861a0126be4..bcb709e2f402 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -134,6 +134,7 @@
to_chat(brainmob, SPAN_NOTICE(" Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast. "))
/obj/item/device/mmi/emp_act(severity)
+ . = ..()
if(!brainmob)
return
else
@@ -144,4 +145,3 @@
brainmob.emp_damage += rand(10,20)
if(3)
brainmob.emp_damage += rand(0,10)
- ..()
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index c085f06b0052..82cbb155b516 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -183,17 +183,3 @@
reset_view(null)
return 1
-
-
-/*/mob/living/brain/emp_act(severity)
- if(!(container && istype(container, /obj/item/device/mmi)))
- return
- else
- switch(severity)
- if(1)
- emp_damage += rand(20,30)
- if(2)
- emp_damage += rand(10,20)
- if(3)
- emp_damage += rand(0,10)
- ..()*/
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index a8734afd7301..56eba38a4000 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -155,6 +155,7 @@ Contains most of the procs that are called when a mob is attacked by something
return FALSE
/mob/living/carbon/human/emp_act(severity)
+ . = ..()
for(var/obj/O in src)
if(!O)
continue
@@ -167,7 +168,6 @@ Contains most of the procs that are called when a mob is attacked by something
if(I.robotic == FALSE)
continue
I.emp_act(severity)
- ..()
//Returns 1 if the attack hit, 0 if it missed.
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index fa33af97275e..375594574ab8 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -22,10 +22,10 @@
return 0 //only carbon liveforms have this proc
/mob/living/emp_act(severity)
+ . = ..()
var/list/L = src.get_contents()
for(var/obj/O in L)
O.emp_act(severity)
- ..()
//this proc handles being hit by a thrown atom
/mob/living/hitby(atom/movable/AM)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 18d6ece8e238..cf734a09ae0d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -301,8 +301,8 @@ var/list/ai_verbs_default = list(
return 0
/mob/living/silicon/ai/emp_act(severity)
+ . = ..()
if (prob(30)) view_core()
- ..()
/mob/living/silicon/ai/Topic(href, href_list)
if(usr != src)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index bccd74036658..1638b0fb7fbe 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -36,6 +36,7 @@
return
/mob/living/silicon/emp_act(severity)
+ . = ..()
switch(severity)
if(1)
src.take_limb_damage(20)
@@ -47,7 +48,6 @@
to_chat(src, SPAN_DANGER("*BZZZT*"))
to_chat(src, SPAN_DANGER("Warning: Electromagnetic pulse detected."))
- ..()
/mob/living/silicon/stun_effect_act(stun_amount, agony_amount)
return //immune
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 3d37f8ea57c1..b7c091d564d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -152,6 +152,7 @@
//ion rifle!
/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity)
+ . = ..()
health -= rand(3,15) * (severity + 1)
disabled = rand(150, 600)
hostile_drone = 0
diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm
index 58d0a4780681..fd81c25bec9f 100644
--- a/code/modules/organs/limbs.dm
+++ b/code/modules/organs/limbs.dm
@@ -171,6 +171,7 @@
*/
/obj/limb/emp_act(severity)
+ . = ..()
if(!(status & (LIMB_ROBOT|LIMB_SYNTHSKIN))) //meatbags do not care about EMP
return
var/probability = 30
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index fc3f213fff35..731ad78caa5b 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1266,6 +1266,7 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
//Damage and destruction acts
/obj/structure/machinery/power/apc/emp_act(severity)
+ . = ..()
if(cell)
cell.emp_act(severity)
lighting = 0
@@ -1274,7 +1275,6 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
spawn(1 MINUTES)
equipment = 3
environ = 3
- ..()
/obj/structure/machinery/power/apc/ex_act(severity)
switch(severity)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 992e0f3464ff..31a096a3a2ee 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -71,12 +71,12 @@
/obj/item/cell/emp_act(severity)
+ . = ..()
charge -= 1000 / severity
if (charge < 0)
charge = 0
if(reliability != 100 && prob(50/severity))
reliability -= 10 / severity
- ..()
/obj/item/cell/ex_act(severity)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index ac19d1ba0c67..0e469a7fe577 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -390,6 +390,7 @@
/obj/structure/machinery/power/smes/emp_act(severity)
+ . = ..()
outputting = 0
inputting = 0
output_level = 0
@@ -400,7 +401,6 @@
output_level = initial(output_level)
inputting = initial(inputting)
outputting = initial(outputting)
- ..()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e113363b8b7f..ac7be20c42ee 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -480,6 +480,7 @@
/obj/item/weapon/gun/emp_act(severity)
+ . = ..()
for(var/obj/O in contents)
O.emp_act(severity)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index adca6a7cce6f..ee122d8f8edd 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -66,9 +66,9 @@
overlays += charge_icon + "_0"
/obj/item/weapon/gun/energy/emp_act(severity)
+ . = ..()
cell.use(round(cell.maxcharge / severity))
update_icon()
- ..()
/obj/item/weapon/gun/energy/load_into_chamber()
if(!cell || cell.charge < charge_cost)
diff --git a/code/modules/vehicles/interior/interactable/vehicle_locker.dm b/code/modules/vehicles/interior/interactable/vehicle_locker.dm
index ab536c7637c6..5571995594f0 100644
--- a/code/modules/vehicles/interior/interactable/vehicle_locker.dm
+++ b/code/modules/vehicles/interior/interactable/vehicle_locker.dm
@@ -117,8 +117,8 @@
return container.attackby(W, user)
/obj/structure/vehicle_locker/emp_act(severity)
+ . = ..()
container.emp_act(severity)
- ..()
/obj/structure/vehicle_locker/hear_talk(mob/M, msg)
container.hear_talk(M, msg)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 5192a6834050..2239329d3e44 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -112,6 +112,7 @@
return
/obj/vehicle/emp_act(severity)
+ . = ..()
var/was_on = on
stat |= EMPED
new /obj/effect/overlay/temp/emp_sparks (loc)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index fccbbd0b7dd9..9ef2ad37c605 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -125,6 +125,7 @@
#include "code\__DEFINES\dcs\signals\signals_global.dm"
#include "code\__DEFINES\dcs\signals\signals_subsystem.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_atom.dm"
+#include "code\__DEFINES\dcs\signals\atom\signals_cell.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_item.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_movable.dm"
#include "code\__DEFINES\dcs\signals\atom\signals_obj.dm"
@@ -373,6 +374,7 @@
#include "code\datums\components\armor_link.dm"
#include "code\datums\components\bad_leg.dm"
#include "code\datums\components\bonus_damage_stack.dm"
+#include "code\datums\components\cell.dm"
#include "code\datums\components\cluster_stack.dm"
#include "code\datums\components\connect_mob_behalf.dm"
#include "code\datums\components\crate_tag.dm"