From 68dc63e005f801bf5a2cb10b8c89ddcd1323d219 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 15:15:47 +0200 Subject: [PATCH 1/8] SMES Coil Cost - Supply point cost doubled to 150 according to feedback. --- code/datums/supplypacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 225c7989b36..cf08713f1f5 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -439,7 +439,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/smescoil name = "Superconducting Magnetic Coil" contains = list(/obj/item/weapon/smes_coil) - cost = 75 + cost = 150 containertype = /obj/structure/closet/crate containername = "Superconducting Magnetic Coil crate" group = "Engineering" From 8c983b317ee2ba8c816d05380955748e2a268b74 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 15:18:14 +0200 Subject: [PATCH 2/8] SMES Board design fix - Fixes SMES circuit board issue --- code/modules/research/designs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 2126f9e523a..1edf1c74929 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -376,7 +376,7 @@ datum/design/aifixer build_path = "/obj/item/weapon/circuitboard/aifixer" // VERY VERY EXPENSIVE (needs diamonds and stuff) -datum/design/aifixer +datum/design/smes_cell name = "Circuit Design (SMES Cell)" desc = "Allows for the construction of circuit boards used to build an SMES Cell." id = "smes_cell" From 6905a90b9ec6d0e740b4722a52b65fbacd2ad125 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 15:33:36 +0200 Subject: [PATCH 3/8] SMES Construction rework - Buildable SMES is now subtype of regular SMES. - Buildable SMES related stuff moved to separate file (smes_construction.dm) Please note that this commit is one of two commits which have to be applied together. Otherwise, compilation error occurs. (Code + Map. This one is Code) --- baystation12.dme | 1 + code/modules/power/smes.dm | 85 +--------------------- code/modules/power/smes_construction.dm | 97 +++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 81 deletions(-) create mode 100644 code/modules/power/smes_construction.dm diff --git a/baystation12.dme b/baystation12.dme index e7a8d9fdbe1..8f35cc14104 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1142,6 +1142,7 @@ #include "code\modules\power\power_monitor.dm" #include "code\modules\power\profiling.dm" #include "code\modules\power\smes.dm" +#include "code\modules\power\smes_construction.dm" #include "code\modules\power\solar.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 9953cde0241..32f408d0b06 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -1,24 +1,6 @@ // the SMES // stores power -//Board -/obj/item/weapon/circuitboard/smes - name = "Circuit board (SMES Cell)" - build_path = "/obj/machinery/power/smes" - board_type = "machine" - origin_tech = "powerstorage=6;engineering=4" // Board itself is high tech. Coils have to be ordered from cargo or salvaged from existing SMESs. - frame_desc = "Requires 1 superconducting magnetic coil and 30 wires." - req_components = list("/obj/item/weapon/smes_coil" = 1, "/obj/item/stack/cable_coil" = 30) - -//Construction Item -/obj/item/weapon/smes_coil - name = "Superconducting Magnetic Coil" - desc = "Heavy duty superconducting magnetic coil, mainly used in construction of SMES units." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "smes_coil" // Just few icons patched together. If someone wants to make better icon, feel free to do so! - w_class = 4.0 // It's LARGE (backpack size) - - /obj/machinery/power/smes name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." @@ -26,11 +8,11 @@ density = 1 anchored = 1 use_power = 0 - var/output = 0 //Amount of power it tries to output + var/output = 50000 //Amount of power it tries to output var/lastout = 0 //Amount of power it actually outputs to the powernet var/loaddemand = 0 //For use in restore() var/capacity = 5e6 //Maximum amount of power it can hold - var/charge = 0 //Current amount of power it holds + var/charge = 1e6 //Current amount of power it holds var/charging = 0 //1 if it's actually charging, 0 if not var/chargemode = 0 //1 if it's trying to charge, 0 if not. //var/chargecount = 0 @@ -44,25 +26,11 @@ var/last_online = 0 var/open_hatch = 0 var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! - var/input_level_max = 250000 // It is now coil amount based, so no need for DEFINE - var/output_level_max = 250000 - - var/storage_per_coil = 5000000 - var/IO_per_coil = 250000 - var/max_coils = 6 //30M capacity, 1.5MW input/output when fully upgraded - var/cur_coils = 1 // Current amount of installed coils + var/input_level_max = 200000 + var/output_level_max = 200000 /obj/machinery/power/smes/New() - component_parts = list() - component_parts += new /obj/item/stack/cable_coil(src,30) - component_parts += new /obj/item/weapon/circuitboard/smes(src) - - // Allows for mapped-in SMESs with larger capacity/IO - for(var/i = 1, i <= cur_coils, i++) - component_parts += new /obj/item/weapon/smes_coil(src) - ..() - recalc_coils() spawn(5) if(!powernet) connect_to_network() @@ -83,16 +51,6 @@ updateicon() return -/obj/machinery/power/smes/proc/recalc_coils() - if ((cur_coils <= max_coils) && (cur_coils >= 1)) - capacity = cur_coils * storage_per_coil - charge = between(0, charge, capacity) - output_level_max = cur_coils * IO_per_coil - output = between(0, output, output_level_max) - input_level_max = cur_coils * IO_per_coil - chargelevel = between(0, chargelevel, input_level_max) - - /obj/machinery/power/smes/proc/updateicon() overlays.Cut() if(stat & BROKEN) return @@ -293,41 +251,6 @@ del(terminal) building_terminal = 0 - // PSUs have their own code in batteryrack.dm - else if(istype(W, /obj/item/weapon/crowbar) && !(istype(src, /obj/machinery/power/smes/batteryrack))) - if (charge < (capacity / 100)) - if (!online && !chargemode) - if (!terminal) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - usr << "\red You begin to disassemble the SMES cell!" - if (do_after(usr, 100 * cur_coils)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s - usr << "\red You have disassembled the SMES cell!" - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - del(src) - return 1 - else - user << "You have to disassemble the terminal first!" - else - user << "Turn off the [src] before dismantling it." - else - user << "Better let [src] discharge before dismantling it." - else if(istype(W, /obj/item/weapon/smes_coil) && !(istype(src, /obj/machinery/power/smes/batteryrack))) - if (cur_coils < max_coils) - usr << "You install the coil into the SMES unit!" - user.drop_item() - cur_coils ++ - component_parts += W - W.loc = src - recalc_coils() - else - usr << "\red You can't insert more coils to this SMES unit!" - /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(stat & BROKEN) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm new file mode 100644 index 00000000000..5bbf970b954 --- /dev/null +++ b/code/modules/power/smes_construction.dm @@ -0,0 +1,97 @@ +// Constructable SMES version. Based on Coils. Each SMES can hold 6 Coils by default. +// Each coil adds 250kW I/O and 5M capacity. +// This is second version, now subtype of regular SMES. + + +//Board +/obj/item/weapon/circuitboard/smes + name = "Circuit board (SMES Cell)" + build_path = "/obj/machinery/power/smes/buildable" + board_type = "machine" + origin_tech = "powerstorage=6;engineering=4" // Board itself is high tech. Coils have to be ordered from cargo or salvaged from existing SMESs. + frame_desc = "Requires 1 superconducting magnetic coil and 30 wires." + req_components = list("/obj/item/weapon/smes_coil" = 1, "/obj/item/stack/cable_coil" = 30) + +//Construction Item +/obj/item/weapon/smes_coil + name = "Superconducting Magnetic Coil" + desc = "Heavy duty superconducting magnetic coil, mainly used in construction of SMES units." + icon = 'icons/obj/stock_parts.dmi' + icon_state = "smes_coil" // Just few icons patched together. If someone wants to make better icon, feel free to do so! + w_class = 4.0 // It's LARGE (backpack size) + var/ChargeCapacity = 5000000 + var/IOCapacity = 250000 + + + + +// SMES itself +/obj/machinery/power/smes/buildable + var/max_coils = 6 //30M capacity, 1.5MW input/output when fully upgraded /w default coils + var/cur_coils = 1 // Current amount of installed coils + +/obj/machinery/power/smes/buildable/New() + component_parts = list() + component_parts += new /obj/item/stack/cable_coil(src,30) + component_parts += new /obj/item/weapon/circuitboard/smes(src) + + // Allows for mapped-in SMESs with larger capacity/IO + for(var/i = 1, i <= cur_coils, i++) + component_parts += new /obj/item/weapon/smes_coil(src) + + recalc_coils() + ..() + +/obj/machinery/power/smes/buildable/proc/recalc_coils() + if ((cur_coils <= max_coils) && (cur_coils >= 1)) + capacity = 0 + input_level_max = 0 + output_level_max = 0 + for(var/obj/item/weapon/smes_coil/C in component_parts) + capacity += C.ChargeCapacity + input_level_max += C.IOCapacity + output_level_max += C.IOCapacity + charge = between(0, charge, capacity) + return 1 + else + return 0 + +/obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + ..() + if(open_hatch) + if(istype(W, /obj/item/weapon/crowbar)) + if (charge < (capacity / 100)) + if (!online && !chargemode) + if (!terminal) + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + usr << "\red You begin to disassemble the SMES cell!" + if (do_after(usr, 100 * cur_coils)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s + usr << "\red You have disassembled the SMES cell!" + var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) + M.state = 2 + M.icon_state = "box_1" + for(var/obj/I in component_parts) + if(I.reliability != 100 && crit_fail) + I.crit_fail = 1 + I.loc = src.loc + del(src) + return 1 + else + user << "You have to disassemble the terminal first!" + else + user << "Turn off the [src] before dismantling it." + else + user << "Better let [src] discharge before dismantling it." + + else if(istype(W, /obj/item/weapon/smes_coil) && !(istype(src, /obj/machinery/power/smes/batteryrack))) + if (cur_coils < max_coils) + usr << "You install the coil into the SMES unit!" + user.drop_item() + cur_coils ++ + component_parts += W + W.loc = src + recalc_coils() + else + usr << "\red You can't insert more coils to this SMES unit!" + else + user << "You need to open access hatch on [src] first!" \ No newline at end of file From 68f5522095ae26ca5e358206dd108cf4d803dce8 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 15:44:49 +0200 Subject: [PATCH 4/8] SMES Construction rework - Updates engineering SMES to be of /buildable subtype. (Second commit, rest of the changes in previous one) --- maps/tgstation2.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index 07e1ea25717..e9a58d9bc69 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -5640,7 +5640,7 @@ "cex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes) "cey" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/drone_fabrication) "cez" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = 30; pixel_y = -5; req_access_txt = "0"; req_one_access_txt = "13"},/turf/space,/area/space) -"ceA" = (/obj/machinery/power/smes{charge = 1e+007; chargelevel = 500000; chargemode = 1; cur_coils = 4; output = 500000},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) +"ceA" = (/obj/machinery/power/smes/buildable{charge = 1e+007; chargelevel = 500000; chargemode = 1; cur_coils = 4; output = 500000},/obj/structure/cable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) "ceB" = (/obj/machinery/power/terminal{dir = 8},/obj/machinery/light,/obj/machinery/door_control{id = "engine_electrical_maintenance"; name = "Door Bolt Control"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -25; req_access_txt = "10"; specialfunctions = 4},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engine_smes) "ceC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes) "ceD" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor,/area/engine/engine_monitoring) From 3ca0d1577fdb4e9ce051a5543c12bd4a66c2ae75 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 17:02:36 +0200 Subject: [PATCH 5/8] Breaker Box AI interaction fix - AI can now properly interact with Breaker Box, without interacting BOTH as AI and human. --- code/modules/power/breaker_box.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 61b43425472..b951b379e43 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -36,8 +36,6 @@ user << "\red System is busy. Please wait until current operation is finished before changing power settings." return - ..() - busy = 1 user << "\green Updating power settings.." if(do_after(user, 50)) //5s for AI as AIs can manipulate electronics much faster. @@ -52,8 +50,6 @@ user << "\red System is busy. Please wait until current operation is finished before changing power settings." return - ..() - busy = 1 for(var/mob/O in viewers(user)) O.show_message(text("\red [user] started reprogramming [src]!"), 1) From 20d33815baf180e38094531a78c563917e46be16 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Tue, 2 Sep 2014 17:09:37 +0200 Subject: [PATCH 6/8] Breaker Box Fix - Removes source of runtime errors. From my examination of code, it seems these errors happen when breaker box is turned off for the first time. It should work then. - Mostly temporary fix, i intend to rework the powernet code over time. I would welcome cooperation with @mwerezak as he is currently doing lots of related things. --- code/modules/power/power.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index a1c0a57529e..d9452b8eb27 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -398,7 +398,10 @@ if(S.powernet == src) S.restore() // and restore some of the power that was used else - error("[S.name] (\ref[S]) had a [S.powernet ? "different (\ref[S.powernet])" : "null"] powernet to our powernet (\ref[src]).") + // I don't see how this could be an error.Tends to break substations due to breaker box network updates. + // Having nodes.Remove(S) is sufficient, no need to spam the console too. Mostly temporary fix until powernets are + // rewritten (hopefully soon!). + // error("[S.name] (\ref[S]) had a [S.powernet ? "different (\ref[S.powernet])" : "null"] powernet to our powernet (\ref[src]).") nodes.Remove(S) From 03f2be3091d131ad3d06440d4f9a770900911bf4 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Fri, 5 Sep 2014 01:52:15 +0200 Subject: [PATCH 7/8] PARTIAL IMPLEMENTATION - Charged SMES deconstruction & SMES code cleanup - Cleanup of SMES attackby() code - Buildable SMESs now have option to override safety circuit by using multitool while the hatch is open. - Disabling safeties lets you disassemble SMES even if it's charged above 1%. - If charge is above 5% stored energy may discharge violently. This is percentage based (more energy = higher chance of this occuring + more severe consequences) - Larger discharges affect whole powernet, burning out some lights and even completely destroying APCs! - Substation PSUs act as surge protection. Thus, if set up properly damage is limited to few areas which are directly on the main grid (= maintenance mostly) - STILL NEEDS TESTING. Pushing so other people can review the code and give further suggestions. And because i need to access it on second computer. --- code/modules/power/apc.dm | 15 +- code/modules/power/smes.dm | 85 +++++----- code/modules/power/smes_construction.dm | 217 ++++++++++++++++++++---- icons/obj/power.dmi | Bin 24387 -> 25056 bytes 4 files changed, 241 insertions(+), 76 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index db4a8bcf99a..cbc87c7985d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1401,12 +1401,15 @@ if (ticker.mode.config_tag == "malfunction") if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas)) ticker.mode:apcs-- - stat |= BROKEN - operating = 0 - /*if(occupant) - malfvacate(1)*/ - update_icon() - update() + + // Aesthetically much better! + src.visible_message("[src]'s screen flickers with warnings briefly!") + spawn(rand(2,5)) + src.visible_message("[src]'s screen suddenly explodes in rain of sparks and small debris!") + stat |= BROKEN + operating = 0 + update_icon() + update() // overload all the lights in this APC area diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 32f408d0b06..7cc64f2ee5c 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -206,50 +206,57 @@ if(!open_hatch) open_hatch = 1 user << "You open the maintenance hatch of [src]." + return 0 else open_hatch = 0 user << "You close the maintenance hatch of [src]." - if (open_hatch) - if(istype(W, /obj/item/stack/cable_coil) && !terminal && !building_terminal) - building_terminal = 1 - var/obj/item/stack/cable_coil/CC = W - if (CC.amount < 10) - user << "You need more cables." - building_terminal = 0 - return - if (make_terminal(user)) - building_terminal = 0 - return - building_terminal = 0 - CC.use(10) - user.visible_message(\ - "[user.name] has added cables to the [src].",\ - "You added cables to the [src].") - terminal.connect_to_network() - stat = 0 + return 0 - else if(istype(W, /obj/item/weapon/wirecutters) && terminal && !building_terminal) - building_terminal = 1 - var/turf/tempTDir = terminal.loc - if (istype(tempTDir)) - if(tempTDir.intact) - user << "You must remove the floor plating first." - else - user << "You begin to cut the cables..." - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 50)) - if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - building_terminal = 0 - return - new /obj/item/stack/cable_coil(loc,10) - user.visible_message(\ - "[user.name] cut the cables and dismantled the power terminal.",\ - "You cut the cables and dismantle the power terminal.") - del(terminal) + if (!open_hatch) + user << "You need to open access hatch on [src] first!" + return 0 + + if(istype(W, /obj/item/stack/cable_coil) && !terminal && !building_terminal) + building_terminal = 1 + var/obj/item/stack/cable_coil/CC = W + if (CC.amount < 10) + user << "You need more cables." building_terminal = 0 + return 0 + if (make_terminal(user)) + building_terminal = 0 + return 0 + building_terminal = 0 + CC.use(10) + user.visible_message(\ + "[user.name] has added cables to the [src].",\ + "You added cables to the [src].") + terminal.connect_to_network() + stat = 0 + + else if(istype(W, /obj/item/weapon/wirecutters) && terminal && !building_terminal) + building_terminal = 1 + var/turf/tempTDir = terminal.loc + if (istype(tempTDir)) + if(tempTDir.intact) + user << "You must remove the floor plating first." + else + user << "You begin to cut the cables..." + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 50)) + if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + building_terminal = 0 + return 0 + new /obj/item/stack/cable_coil(loc,10) + user.visible_message(\ + "[user.name] cut the cables and dismantled the power terminal.",\ + "You cut the cables and dismantle the power terminal.") + del(terminal) + building_terminal = 0 + return 1 /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 5bbf970b954..3fa10dc490f 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -27,8 +27,10 @@ // SMES itself /obj/machinery/power/smes/buildable - var/max_coils = 6 //30M capacity, 1.5MW input/output when fully upgraded /w default coils - var/cur_coils = 1 // Current amount of installed coils + var/max_coils = 6 //30M capacity, 1.5MW input/output when fully upgraded /w default coils + var/cur_coils = 1 // Current amount of installed coils + var/safeties_enabled = 1 // If 0 modifications can be done without discharging the SMES, at risk of critical failure. + var/failing = 0 // If 1 critical failure has occured and SMES explosion is imminent. /obj/machinery/power/smes/buildable/New() component_parts = list() @@ -56,35 +58,184 @@ else return 0 -/obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - ..() - if(open_hatch) - if(istype(W, /obj/item/weapon/crowbar)) - if (charge < (capacity / 100)) - if (!online && !chargemode) - if (!terminal) - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - usr << "\red You begin to disassemble the SMES cell!" - if (do_after(usr, 100 * cur_coils)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s - usr << "\red You have disassembled the SMES cell!" - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - del(src) - return 1 - else - user << "You have to disassemble the terminal first!" - else - user << "Turn off the [src] before dismantling it." - else - user << "Better let [src] discharge before dismantling it." + // SMESs store very large amount of power. If someone screws up (ie: Disables safeties and attempts to modify the SMES) very bad things happen. + // Bad things are based on charge percentage. + // Possible effects: + // Sparks - Lets out few sparks, mostly fire hazard if phoron present. Otherwise purely aesthetic. + // Shock - Depending on intensity harms the user. Insultated Gloves protect against weaker shocks, but strong shock bypasses them. + // EMP Pulse - Lets out EMP pulse discharge which screws up nearby electronics. + // Light Overload - X% chance to overload each lighting circuit in connected powernet. APC based. + // APC Failure - X% chance to destroy APC causing very weak explosion too. Won't cause hull breach or serious harm. + // SMES Explosion - X% chance to destroy the SMES, in moderate explosion. May cause small hull breach. +/obj/machinery/power/smes/buildable/proc/total_system_failure(var/intensity = 0, var/mob/user as mob) + if (!intensity) + return - else if(istype(W, /obj/item/weapon/smes_coil) && !(istype(src, /obj/machinery/power/smes/batteryrack))) + var/mob/living/carbon/human/h_user = null + if (!istype(user, /mob/living/carbon/human)) + return + else + h_user = user + + + // Preparations + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + // Check if user has protected gloves. + var/user_protected = 0 + if(h_user.gloves) + var/obj/item/clothing/gloves/G = h_user.gloves + if(G.siemens_coefficient == 0) + user_protected = 1 + + + switch (intensity) + if (0 to 15) + // Small overcharge + // Sparks, Weak shock + s.set_up(2, 1, src) + s.start() + if (user_protected && prob(80)) + h_user << "Small electrical arc almost burns your hand. Luckily you had your gloves on!" + else + h_user << "Small electrical arc sparks and burns your hand as you touch the [src]!" + h_user.adjustFireLoss(rand(5,10)) + h_user.Paralyse(2) + charge = 0 + + if (16 to 35) + // Medium overcharge + // Sparks, Medium shock, Weak EMP + s.set_up(4,1,src) + s.start() + if (user_protected && prob(25)) + h_user << "Medium electrical arc sparks and almost burns your hand. Luckily you had your gloves on!" + else + h_user << "Medium electrical sparks as you touch the [src], severely burning your hand!" + h_user.adjustFireLoss(rand(10,25)) + h_user.Paralyse(5) + empulse(src.loc, 2, 4) + charge = 0 + + if (36 to 60) + // Strong overcharge + // Sparks, Strong shock, Strong EMP, 10% light overload. 1% APC failure + s.set_up(7,1,src) + s.start() + if (user_protected) + h_user << "Strong electrical arc sparks between you and [src], ignoring your gloves and burning your hand!" + h_user.adjustFireLoss(rand(25,60)) + h_user.Paralyse(8) + else + h_user << "Strong electrical arc sparks between you and [src], knocking you out for a while!" + h_user.adjustFireLoss(rand(35,75)) + h_user.Paralyse(12) + empulse(src.loc, 8, 16) + charge = 0 + apcs_overload(1, 10) + src.visible_message("\icon[src] [src] beeps: \"Caution. Output regulators malfunction. Uncontrolled discharge detected.\"") + + if (61 to INFINITY) + // Massive overcharge + // Sparks, Near - instantkill shock, Strong EMP, 25% light overload, 5% APC failure. 50% of SMES explosion. This is bad. + s.set_up(10,1,src) + s.start() + h_user << "Massive electrical arc sparks between you and [src]. Last thing you can think about is \"Oh shit...\"" + // Remember, we have few gigajoules of electricity here.. Turn them into crispy toast. + h_user.adjustFireLoss(rand(150,195)) + h_user.Paralyse(25) + empulse(src.loc, 32, 64) + charge = 0 + apcs_overload(5, 25) + src.visible_message("\icon[src] [src] beeps: \"Caution. Output regulators malfunction. Significant uncontrolled discharge detected.\"") + + if (prob(50)) + src.visible_message("\icon[src] [src] beeps: \"DANGER! Magnetic containment field unstable! Containment field failure imminent!\"") + failing = 1 + // 30 - 60 seconds and then BAM! + spawn(rand(300,600)) + src.visible_message("\icon[src] [src] beeps: \"DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...\"") + explosion(src.loc,1,2,4,8) + // Not sure if this is necessary, but just in case the SMES *somehow* survived.. + del(src) + + + + // Gets powernet APCs and overloads lights or breaks the APC completely, depending on percentages. +/obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance) + if (!src.powernet) + return + + for(var/obj/machinery/power/terminal/T in src.powernet.nodes) + if(istype(T.master, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = T.master + if (prob(overload_chance)) + A.overload_lighting() + else if (prob(failure_chance)) + A.set_broken() + + // Failing SMES has special icon overlay. +/obj/machinery/power/smes/buildable/updateicon() + if (failing) + overlays.Cut() + overlays += image('icons/obj/power.dmi', "smes-crit") + else + ..() + +/obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + // If parent returned 1: + // - Hatch is open, so we can modify the SMES + // - No action was taken in parent function (terminal de/construction atm). + if (..()) + + // Charged above 1% and safeties are enabled. + if((charge > (capacity/100)) && safeties_enabled && (!istype(W, /obj/item/device/multitool))) + user << "Safety circuit of [src] is preventing modifications while it's charged!" + return + + if (online || chargemode) + user << "Turn off the [src] first!" + return + + // Probability of failure if safety circuit is disabled (in %) + var/failure_probability = round((charge / capacity) * 100) + + // If failure probability is below 5% it's usually safe to do modifications + if (failure_probability < 5) + failure_probability = 0 + + // Crowbar - Disassemble the SMES. + if(istype(W, /obj/item/weapon/crowbar)) + if (terminal) + user << "You have to disassemble the terminal first!" + return + + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + user << "You begin to disassemble the [src]!" + if (do_after(usr, 100 * cur_coils)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s + + if (failure_probability && prob(failure_probability)) + total_system_failure(failure_probability, user) + return + + usr << "\red You have disassembled the SMES cell!" + var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) + M.state = 2 + M.icon_state = "box_1" + for(var/obj/I in component_parts) + if(I.reliability != 100 && crit_fail) + I.crit_fail = 1 + I.loc = src.loc + del(src) + return + + // Superconducting Magnetic Coil - Upgrade the SMES + else if(istype(W, /obj/item/weapon/smes_coil)) if (cur_coils < max_coils) + + if (failure_probability && prob(failure_probability)) + total_system_failure(failure_probability, user) + return + usr << "You install the coil into the SMES unit!" user.drop_item() cur_coils ++ @@ -93,5 +244,9 @@ recalc_coils() else usr << "\red You can't insert more coils to this SMES unit!" - else - user << "You need to open access hatch on [src] first!" \ No newline at end of file + + // Multitool - Toggle the safeties. + else if(istype(W, /obj/item/device/multitool)) + safeties_enabled = !safeties_enabled + user << "You [safeties_enabled ? "connected" : "disconnected"] the safety circuit." + src.visible_message("\icon[src] [src] beeps: \"Caution. Safety circuit has been: [safeties_enabled ? "re-enabled" : "disabled. Please excercise caution."]\"") diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index ef05d86e6472b7ca89ee4a10435bcf14646e8c35..4d2282bbcfea36624253f598c705e23abaf9c97c 100644 GIT binary patch delta 24197 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\r6AJHi4iTg$;nTBK?!|` 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 a4@u~TQ{)bJvqgRgymU15)l0734*Ng*zjdSl From cbeff523ace6b00a37de6ff011d71c992e078ee4 Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Fri, 12 Sep 2014 20:07:21 +0200 Subject: [PATCH 8/8] Attempt to resolve merge conflict. I hope i won't break something. --- code/modules/power/smes.dm | 2 +- code/modules/power/smes_construction.dm | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 7cc64f2ee5c..4c549e71559 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -219,7 +219,7 @@ if(istype(W, /obj/item/stack/cable_coil) && !terminal && !building_terminal) building_terminal = 1 var/obj/item/stack/cable_coil/CC = W - if (CC.amount < 10) + if (CC.get_amount() <= 10) user << "You need more cables." building_terminal = 0 return 0 diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 3fa10dc490f..891f231f8fe 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -182,6 +182,10 @@ ..() /obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + // No more disassembling of overloaded SMESs. You broke it, now enjoy the consequences. + if (failing) + user << "The [src]'s screen is flashing with alerts. It seems to be overloaded! Touching it now is probably not a good idea." + return // If parent returned 1: // - Hatch is open, so we can modify the SMES // - No action was taken in parent function (terminal de/construction atm).