diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 3f08862d9a..27ad7cd227 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 cdbb7788af..91ba7bf6ba 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 e1f0804c0e..e3f34691a9 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 4bf1ab251c..401cb41af7 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 dd7a510434..43af5649fe 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 9f4ce0bf29..632a428f69 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 27f23d622e..d14558c0c4 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ