diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 3f08862d9a1..27ad7cd2275 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -294,6 +294,12 @@ Class Procs:
s.set_up(5, 1, src)
s.start()
if (electrocute_mob(user, get_area(src), src, 0.7))
+ var/area/temp_area = get_area(src)
+ if(temp_area && temp_area.master)
+ var/obj/machinery/power/apc/temp_apc = temp_area.master.get_apc()
+
+ if(temp_apc && temp_apc.terminal && temp_apc.terminal.powernet)
+ temp_apc.terminal.powernet.trigger_warning()
return 1
else
return 0
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index cdbb7788af8..91ba7bf6ba8 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -14,7 +14,8 @@
matter = list("metal" = 750,"waste" = 750)
origin_tech = "powerstorage=3;syndicate=5"
- var/drain_rate = 600000 // amount of power to drain per tick
+ var/drain_rate = 1000000 // amount of power to drain per tick
+ var/dissipation_rate = 20000
var/power_drained = 0 // has drained this much power
var/max_power = 5e9 // maximum power that can be drained before exploding
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating
@@ -91,6 +92,7 @@
processing_objects.Remove(src)
process()
+ power_drained -= min(dissipation_rate, power_drained)
if(attached)
var/datum/powernet/PN = attached.get_powernet()
if(PN)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index e1f0804c0e9..e3f34691a9a 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -212,6 +212,8 @@
var/obj/structure/cable/C = T.get_cable_node()
if(C)
if(electrocute_mob(user, C, src))
+ if(C.powernet)
+ C.powernet.trigger_warning()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index 4bf1ab251cc..401cb41af77 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -12,7 +12,7 @@
var/perapc_excess = 0
var/netexcess = 0 // excess power on the powernet (typically avail-load)
- var/problem = 0 // If either of these is set to 1 there is some sort of issue at the powernet.
+ var/problem = 0 // If this is not 0 there is some sort of issue in the powernet. Monitors will display warnings.
/datum/powernet/New()
powernets += src
diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm
index dd7a5104341..43af5649fed 100644
--- a/code/modules/power/sensors/powernet_sensor.dm
+++ b/code/modules/power/sensors/powernet_sensor.dm
@@ -69,21 +69,26 @@
else
total_load = "[round(total_load)] W"
- out += ""
+ out += "
TOTAL GRID LOAD: [total_load]"
- var/textavail = powernet.avail
- if(textavail > 1000)
- textavail = "[textavail / 1000]"
- textavail += " kW"
- else
- textavail += " W"
+ var/textavail = powernet.avail
+ if(textavail > 1000)
+ textavail = "[textavail / 1000] kW"
+ else
+ textavail = "[textavail] W"
+ out += "
TOTAL AVAILABLE: [textavail]"
- if(powernet.problem)
- out += "
WARNING: Abnormal grid activity detected!"
- out += "
TOTAL GRID LOAD: [total_load]"
- out += "
TOTAL AVAILABLE: [textavail]"
+ if(powernet.problem)
+ out += "
WARNING: Abnormal grid activity detected!"
return out
+/obj/machinery/power/sensor/proc/check_grid_warning()
+ RefreshGrid()
+ if(powernet)
+ if(powernet.problem)
+ return 1
+ return 0
+
// Has to be here as we need it to be in Machines list.
/obj/machinery/power/sensor/process()
return 1
\ No newline at end of file
diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm
index 9f4ce0bf292..632a428f690 100644
--- a/code/modules/power/sensors/sensor_monitoring.dm
+++ b/code/modules/power/sensors/sensor_monitoring.dm
@@ -15,10 +15,17 @@
anchored = 1.0
var/circuit = /obj/item/weapon/circuitboard/powermonitor
var/list/grid_sensors = null
+ var/update_counter = 0 // Next icon update when this reaches 5 (ie every 5 ticks)
use_power = 1
idle_power_usage = 300
active_power_usage = 300
+ // Update icon every 5 ticks.
+/obj/machinery/power/monitor/process()
+ update_counter++
+ if(update_counter > 4)
+ update_icon()
+
/obj/machinery/power/monitor/New()
..()
refresh_sensors()
@@ -81,7 +88,7 @@
if(S.powernet)
reported_nets += S.powernet
if(duplicities)
- t += "
Ignored [duplicities] duplicite readings"
+ t += "
Ignored [duplicities] duplicite readings"
user << browse(t, "window=powcomp;size=600x900")
onclose(user, "powcomp")
@@ -99,17 +106,38 @@
refresh_sensors()
return
+/obj/machinery/power/monitor/update_icon()
+ update_counter = 0 // Reset the icon update counter.
+ if(stat & BROKEN)
+ icon_state = "powerb"
+ return
+ if(stat & NOPOWER)
+ icon_state = "power0"
+ return
+ if(check_warnings())
+ icon_state = "power_alert"
+ return
+
+ icon_state = "power"
+
+/obj/machinery/power/monitor/proc/check_warnings()
+ var/warn = 0
+ if(grid_sensors)
+ for(var/obj/machinery/power/sensor/S in grid_sensors)
+ if(S.check_grid_warning())
+ warn = 1
+ return warn
+
/obj/machinery/power/monitor/power_change()
..()
- if(stat & BROKEN)
- icon_state = "broken"
+
+ // Leaving this here to preserve that delayed shutdown effect when power goes out.
+ if (stat & NOPOWER)
+ spawn(rand(0, 15))
+ update_icon()
else
- if (stat & NOPOWER)
- spawn(rand(0, 15))
- src.icon_state = "c_unpowered"
- else
- icon_state = initial(icon_state)
+ update_icon()
//copied from computer.dm
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 27f23d622e0..d14558c0c42 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ