diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index d1bee2bb62e..ce2f0616add 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -58,6 +58,10 @@
pulledby = null
return ..()
+//Returns an atom's power cell, if it has one. Overload for individual items.
+/atom/movable/proc/get_cell()
+ return
+
/atom/movable/proc/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
if(QDELETED(AM))
return FALSE
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 81006be3fdd..b8f2d153d9f 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -8,6 +8,7 @@
idle_power_usage = 4
active_power_usage = 250
var/obj/item/charging = null
+ var/using_power = FALSE
var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/rcs, /obj/item/bodyanalyzer)
var/icon_state_off = "rechargeroff"
var/icon_state_charged = "recharger2"
@@ -81,22 +82,21 @@
if(stat & (NOPOWER|BROKEN) || !anchored)
return
- var/using_power = 0
+ using_power = FALSE
if(charging)
if(istype(charging, /obj/item/gun/energy))
var/obj/item/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
E.power_supply.give(E.power_supply.chargerate)
use_power(250)
- using_power = 1
-
+ using_power = TRUE
if(istype(charging, /obj/item/melee/baton))
var/obj/item/melee/baton/B = charging
if(B.bcell)
if(B.bcell.give(B.bcell.chargerate))
use_power(200)
- using_power = 1
+ using_power = TRUE
if(istype(charging, /obj/item/modular_computer))
var/obj/item/modular_computer/C = charging
@@ -107,21 +107,21 @@
if(B.battery.charge < B.battery.maxcharge)
B.battery.give(B.battery.chargerate)
use_power(200)
- using_power = 1
+ using_power = TRUE
if(istype(charging, /obj/item/rcs))
var/obj/item/rcs/R = charging
if(R.rcell)
if(R.rcell.give(R.rcell.chargerate))
use_power(200)
- using_power = 1
+ using_power = TRUE
if(istype(charging, /obj/item/bodyanalyzer))
var/obj/item/bodyanalyzer/B = charging
if(B.power_supply)
if(B.power_supply.give(B.power_supply.chargerate))
use_power(200)
- using_power = 1
+ using_power = TRUE
update_icon(using_power)
@@ -141,7 +141,7 @@
B.bcell.charge = 0
..(severity)
-/obj/machinery/recharger/update_icon(using_power = 0) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+/obj/machinery/recharger/update_icon(using_power = FALSE) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
if(stat & (NOPOWER|BROKEN) || !anchored)
icon_state = icon_state_off
return
@@ -153,6 +153,23 @@
return
icon_state = icon_state_idle
+/obj/machinery/recharger/examine(mob/user)
+ ..()
+ if(charging && (!in_range(user, src) && !issilicon(user) && !isobserver(user)))
+ to_chat(user, "You're too far away to examine [src]'s contents and display!")
+ return
+
+ if(charging)
+ to_chat(user, "\The [src] contains:")
+ to_chat(user, "- \A [charging].")
+ if(!(stat & (NOPOWER|BROKEN)))
+ var/obj/item/stock_parts/cell/C = charging.get_cell()
+ to_chat(user, "The status display reads:")
+ if(using_power)
+ to_chat(user, "- Recharging [(C.chargerate/C.maxcharge)*100]% cell charge per cycle.")
+ if(charging)
+ to_chat(user, "- \The [charging]'s cell is at [C.percent()]%.")
+
// Atlantis: No need for that copy-pasta code, just use var to store icon_states instead.
/obj/machinery/recharger/wallcharger
name = "wall recharger"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 9bb036c4d05..cad4ae25ac8 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -591,6 +591,9 @@ REAGENT SCANNER
var/scan_time = 10 SECONDS //how long does it take to scan
var/scan_cd = 60 SECONDS //how long before we can scan again
+/obj/item/bodyanalyzer/get_cell()
+ return power_supply
+
/obj/item/bodyanalyzer/advanced
cell_type = /obj/item/stock_parts/cell/upgraded/plus
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index f128b874eaa..526340daea5 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -20,6 +20,9 @@
user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.")
return FIRELOSS
+/obj/item/melee/baton/get_cell()
+ return bcell
+
/obj/item/melee/baton/New()
..()
update_icon()
diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm
index 65b4ef1f640..98f1ab5667e 100644
--- a/code/modules/modular_computers/hardware/battery_module.dm
+++ b/code/modules/modular_computers/hardware/battery_module.dm
@@ -8,6 +8,9 @@
var/obj/item/stock_parts/cell/battery = null
device_type = MC_CELL
+/obj/item/computer_hardware/battery/get_cell()
+ return battery
+
/obj/item/computer_hardware/battery/New(loc, battery_type = null)
if(battery_type)
battery = new battery_type(src)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 4719ff75261..33b423c6360 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -19,6 +19,9 @@
var/ratingdesc = TRUE
var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
+/obj/item/stock_parts/cell/get_cell()
+ return src
+
/obj/item/stock_parts/cell/New()
..()
START_PROCESSING(SSobj, src)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index b25420b5491..cbc230c1e98 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -23,6 +23,9 @@
power_supply.use(round(power_supply.charge / severity))
update_icon()
+/obj/item/gun/energy/get_cell()
+ return power_supply
+
/obj/item/gun/energy/New()
..()
if(cell_type)
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 2f3667a645f..893e9719fb4 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -128,11 +128,13 @@
var/teleporting = 0
var/chargecost = 1000
+/obj/item/rcs/get_cell()
+ return rcell
+
/obj/item/rcs/New()
..()
rcell = new(src)
-
/obj/item/rcs/examine(mob/user)
..(user)
to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.")