From 64e56aaa204bf51c84c8e4a9c7751dac6dfccf0e Mon Sep 17 00:00:00 2001 From: igalan Date: Mon, 2 Jun 2014 12:13:26 +0100 Subject: [PATCH] Made SMES terminals able to be constructed and deconstructed. Way to do: -Open maintenance hatch with screwdriver. -Apply cables (at least 10)/wirecutter. Code is modified and corrected /vg/ code. --- code/modules/power/smes.dm | 96 ++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index e5fe56c9f0a..23decfa1cca 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -27,6 +27,8 @@ var/last_output = 0 var/last_charge = 0 var/last_online = 0 + var/open_hatch = 0 + var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! /obj/machinery/power/smes/New() ..() @@ -155,6 +157,35 @@ updateicon() return +//Will return 1 on failure +/obj/machinery/power/smes/proc/make_terminal(const/mob/user) + if (user.loc == loc) + user << "You must not be on the same tile as the SMES." + return 1 + + //Direction the terminal will face to + var/tempDir = get_dir(user, src) + switch(tempDir) + if (NORTHEAST, SOUTHEAST) + tempDir = EAST + if (NORTHWEST, SOUTHWEST) + tempDir = WEST + var/turf/tempLoc = get_step(src, reverse_direction(tempDir)) + if (istype(tempLoc, /turf/space)) + user << "You can't build a terminal on space." + return 1 + else if (istype(tempLoc)) + if(tempLoc.intact) + user << "\red You must remove the floor plating first." + return 1 + user << "You start adding cable to the SMES." + if(do_after(user, 50)) + terminal = new /obj/machinery/power/terminal(tempLoc) + terminal.dir = tempDir + terminal.master = src + return 0 + return 1 + /obj/machinery/power/smes/add_load(var/amount) if(terminal && terminal.powernet) @@ -169,11 +200,60 @@ /obj/machinery/power/smes/attack_hand(mob/user) add_fingerprint(user) ui_interact(user) - - + + +/obj/machinery/power/smes/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/screwdriver)) + if(!open_hatch) + open_hatch = 1 + user << "You open the maintenance hatch of [src]" + else + open_hatch = 0 + user << "You close the maintenance hatch of [src]" + if (open_hatch) + if(istype(W, /obj/item/weapon/cable_coil) && !terminal && !building_terminal) + building_terminal = 1 + var/obj/item/weapon/cable_coil/CC = W + if (CC.amount < 10) + user << "You need more cables." + return + if (make_terminal(user)) + building_terminal = 0 + return + building_terminal = 0 + CC.use(10) + user.visible_message(\ + "\red [user.name] has added cables to the SMES!",\ + "You added cables the SMES.") + 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 << "\red 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() + return + new /obj/item/weapon/cable_coil(loc,10) + user.visible_message(\ + "\red [user.name] cut the cables and dismantled the power terminal.",\ + "You cut the cables and dismantle the power terminal.") + del(terminal) + building_terminal = 0 + + /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) - if(stat & BROKEN) + if(stat & BROKEN) return // this is the data which will be sent to the ui @@ -190,18 +270,18 @@ data["outputLoad"] = round(loaddemand) // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "smes.tmpl", "SMES Power Storage Unit", 540, 380) // when the ui is first opened this is the data it will use - ui.set_initial_data(data) + ui.set_initial_data(data) // open the new ui window ui.open() // auto update every Master Controller tick ui.set_auto_update(1) - + /obj/machinery/power/smes/Topic(href, href_list) ..() @@ -252,9 +332,9 @@ output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") - + return 1 - + /obj/machinery/power/smes/proc/ion_act() if(src.z == 1)