diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f9526f1a758..e93791afb08 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -1,35 +1,39 @@ -// the SMES -// stores power - #define SMESMAXCHARGELEVEL 200000 #define SMESMAXOUTPUT 200000 #define SMESRATE 0.05 // rate of internal charge to external power - - /obj/machinery/power/smes name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." icon_state = "smes" density = TRUE - var/capacity = 5e6 // maximum charge - var/charge = 0 // actual charge - - var/input_attempt = TRUE // 1 = attempting to charge, 0 = not attempting to charge - var/inputting = TRUE // 1 = actually inputting, 0 = not inputting - var/input_level = 50000 // amount of power the SMES attempts to charge by - var/input_level_max = 200000 // cap on input_level - var/input_available = 0 // amount of charge available from input last tick - - var/output_attempt = TRUE // 1 = attempting to output, 0 = not attempting to output - var/outputting = TRUE // 1 = actually outputting, 0 = not outputting - var/output_level = 50000 // amount of power the SMES attempts to output - var/output_level_max = 200000 // cap on output_level - var/output_used = 0 // amount of power actually outputted. may be less than output_level if the powernet returns excess power - - var/name_tag = null - var/obj/machinery/power/terminal/terminal = null + /// Maximum charge of the SMES + var/capacity = 5e6 + /// Current charge level + var/charge = 0 + /// Set TRUE if SMES attempting to charge, FALSE if not + var/input_attempt = TRUE + /// Set TRUE if SMES is inputting, FALSE if not + var/inputting = TRUE + /// Amount of power the SMES attempts to charge by + var/input_level = 50000 + /// Maximum input level + var/input_level_max = 200000 + /// Charge amount available from input last tick + var/input_available = 0 + // TRUE = attempting to output, FALSE = not attempting to output + var/output_attempt = TRUE + /// TRUE = actually outputting, FALSE = not outputting + var/outputting = TRUE + /// Amount of power the SMES attempts to output + var/output_level = 50000 + /// Cap on output_level + var/output_level_max = 200000 + /// Amount of power actually outputted. may be less than output_level if the powernet returns excess power + var/output_used = 0 + /// The terminal that is connected to this SMES unit + var/obj/machinery/power/terminal/terminal /obj/machinery/power/smes/Initialize(mapload) . = ..() @@ -48,10 +52,10 @@ connect_to_network() dir_loop: - for(var/d in GLOB.cardinal) - var/turf/T = get_step(src, d) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(src, direction) for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) + if(term && term.dir == turn(direction, 180)) terminal = term break dir_loop @@ -90,20 +94,20 @@ if(stat & BROKEN) return - . += "smes-op[outputting ? 1 : 0]" - . += "smes-oc[inputting ? 1 : 0]" + . += "smes-op[outputting ? TRUE : FALSE]" + . += "smes-oc[inputting ? TRUE : FALSE]" - var/charge_level = chargedisplay() + var/charge_level = charge_display() if(charge_level > 0) . += "smes-og[charge_level]" /obj/machinery/power/smes/attackby(obj/item/I, mob/user, params) - //opening using screwdriver + // Opening using screwdriver if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) update_icon() return - //changing direction using wrench + // Changing direction using wrench if(default_change_direction_wrench(user, I)) terminal = null var/turf/T = get_step(src, dir) @@ -120,22 +124,22 @@ update_icon() return - //building and linking a terminal + // Building and linking a terminal if(istype(I, /obj/item/stack/cable_coil)) - var/dir = get_dir(user,src) - if(dir & (dir-1))//we don't want diagonal click + var/dir = get_dir(user, src) + if(dir & (dir - 1)) // Checks for diagonal interaction return - if(terminal) //is there already a terminal ? + if(terminal) // Checks for an existing terminal to_chat(user, "This SMES already has a power terminal!") return - if(!panel_open) //is the panel open ? + if(!panel_open) // Checks to see if the panel is closed to_chat(user, "You must open the maintenance panel first!") return var/turf/T = get_turf(user) - if(T.intact) //is the floor plating removed ? + if(T.intact) // Checks to see if floor plating is present to_chat(user, "You must first remove the floor plating!") return @@ -148,31 +152,33 @@ to_chat(user, "You must not be on the same tile as [src].") return - //Direction the terminal will face to - var/tempDir = get_dir(user, src) - switch(tempDir) + // Direction the terminal will face to + var/temporary_direction = get_dir(user, src) + switch(temporary_direction) if(NORTHEAST, SOUTHEAST) - tempDir = EAST + temporary_direction = EAST if(NORTHWEST, SOUTHWEST) - tempDir = WEST - var/turf/tempLoc = get_step(src, REVERSE_DIR(tempDir)) - if(isspaceturf(tempLoc)) + temporary_direction = WEST + var/turf/temporary_location = get_step(src, REVERSE_DIR(temporary_direction)) + + if(isspaceturf(temporary_location)) to_chat(user, "You can't build a terminal on space.") return - else if(istype(tempLoc)) - if(tempLoc.intact) + + else if(istype(temporary_location)) + if(temporary_location.intact) to_chat(user, "You must remove the floor plating first.") return to_chat(user, "You start adding cable to [src].") - playsound(loc, C.usesound, 50, 1) + playsound(loc, C.usesound, 50, TRUE) - if(do_after(user, 50, target = src)) + if(do_after(user, 5 SECONDS, target = src)) if(!terminal && panel_open) T = get_turf(user) var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky - do_sparks(5, 1, src) + do_sparks(5, TRUE, src) return C.use(10) // make sure the cable gets used up @@ -180,11 +186,11 @@ "[user.name] adds the cables and connects the power terminal.",\ "You add the cables and connect the power terminal.") - make_terminal(user, tempDir, tempLoc) + make_terminal(user, temporary_direction, temporary_location) terminal.connect_to_network() return - //disassembling the terminal + // Disassembling the terminal if(istype(I, /obj/item/wirecutters) && terminal && panel_open) var/turf/T = get_turf(terminal) if(T.intact) //is the floor plating removed ? @@ -192,24 +198,24 @@ return to_chat(user, "You begin to dismantle the power terminal...") - playsound(src.loc, I.usesound, 50, 1) + playsound(src.loc, I.usesound, 50, TRUE) - if(do_after(user, 50 * I.toolspeed, target = src)) + if(do_after(user, 5 SECONDS * I.toolspeed, target = src)) if(terminal && panel_open) - if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) //animate the electrocution if uncautious and unlucky - do_sparks(5, 1, src) + if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) // Animate the electrocution if uncautious and unlucky + do_sparks(5, TRUE, src) return - //give the wires back and delete the terminal - new /obj/item/stack/cable_coil(T,10) + // Returns wires on deletion of the terminal + new /obj/item/stack/cable_coil(T, 10) user.visible_message(\ "[user.name] cuts the cables and dismantles the power terminal.",\ "You cut the cables and dismantle the power terminal.") - inputting = 0 //stop inputting, since we have don't have a terminal anymore + inputting = FALSE // Set input FALSE when the terminal no longer exists qdel(terminal) return - //crowbarring it ! + // Crowbarring it ! if(default_deconstruction_crowbar(user, I)) return @@ -222,51 +228,51 @@ return TRUE return FALSE -/obj/machinery/power/smes/proc/make_terminal(user, tempDir, tempLoc) - // create a terminal object at the same position as original turf loc - // wires will attach to this - terminal = new /obj/machinery/power/terminal(tempLoc) - terminal.dir = tempDir +/obj/machinery/power/smes/proc/make_terminal(user, temporary_direction, temporary_location) + // Create a terminal object at the same position as original turf loc + // Wires will attach to this + terminal = new /obj/machinery/power/terminal(temporary_location) + terminal.dir = temporary_direction terminal.master = src /obj/machinery/power/smes/Destroy() if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) var/area/area = get_area(src) if(area) - message_admins("SMES deleted at ([area.name])") + message_admins("SMES deleted at ([area.name])") log_game("SMES deleted at ([area.name])") - investigate_log("deleted at ([area.name])","singulo") + investigate_log("deleted at ([area.name])", "singulo") if(terminal) disconnect_terminal() return ..() -/obj/machinery/power/smes/proc/chargedisplay() +/obj/machinery/power/smes/proc/charge_display() return clamp(round(ceil(charge * 5 / capacity)), 0, 5) /obj/machinery/power/smes/process() if(stat & BROKEN) return - //store machine state to see if we need to update the icon overlays - var/last_disp = chargedisplay() + // Store machine state to see if we need to update the icon overlays + var/last_disp = charge_display() var/last_chrg = inputting var/last_onln = outputting - //inputting + // Inputting if(terminal && input_attempt) input_available = terminal.get_power_balance() if(inputting) - if(input_available > 0) // if there's power available, try to charge + if(input_available > 0) // Checks power availability before attempting to charge - var/load = min(min((capacity-charge)/SMESRATE, input_level), input_available) // charge at set rate, limited to spare capacity + var/load = min(min((capacity - charge) / SMESRATE, input_level), input_available) // Charge at set rate, limited to spare capacity - charge += load * SMESRATE // increase the charge + charge += load * SMESRATE // Increase the charge - terminal.consume_direct_power(load) // add the load to the terminal side network + terminal.consume_direct_power(load) // Add the load to the terminal side network - else // if not enough capcity - inputting = FALSE // stop inputting + else + inputting = FALSE // Set inputting FALSE if not enough capacity else if(input_attempt && input_available > 0) @@ -277,13 +283,13 @@ //outputting if(output_attempt && powernet) if(outputting) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored - if(produce_direct_power(output_used)) // add output to powernet if it exists (smes side) - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + output_used = min( charge/SMESRATE, output_level) // Limit output to that stored + if(produce_direct_power(output_used)) // Add output to powernet if it exists (smes side) + charge -= output_used * SMESRATE // Reduce the storage (may be recovered in /restore() if excessive) else outputting = FALSE - if(output_used < 0.0001) // either from no charge or set to 0 + if(output_used < 0.0001) // Either from no charge or set to 0 outputting = FALSE investigate_log("lost power and turned off", "singulo") else if(output_attempt && charge > output_level && output_level > 0) @@ -293,14 +299,13 @@ else outputting = FALSE - // only update icon if state changed - if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) + // Only update icon if state changed + if(last_disp != charge_display() || last_chrg != inputting || last_onln != outputting) update_icon() - -// called after all power processes are finished -// restores charge level to smes if there was excess this ptick +// Called after all power processes are finished +// Restores charge level to smes if there was excess this ptick /obj/machinery/power/smes/proc/restore() if(stat & BROKEN) return @@ -309,22 +314,22 @@ output_used = 0 return - var/excess = powernet.excess_power // this was how much wasn't used on the network last ptick, minus any removed by other SMESes + var/excess = powernet.excess_power // This was how much wasn't used on the network last ptick, minus any removed by other SMESes - excess = min(output_used, excess) // clamp it to how much was actually output by this SMES last ptick + excess = min(output_used, excess) // Clamp it to how much was actually output by this SMES last ptick - excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) + excess = min((capacity-charge)/SMESRATE, excess) // For safety, also limit recharge by space capacity of SMES (shouldn't happen) // now recharge this amount - var/clev = chargedisplay() + var/clev = charge_display() - charge += excess * SMESRATE // restore unused power - powernet.excess_power -= excess // remove the excess from the powernet, so later SMESes don't try to use it + charge += excess * SMESRATE // Restore unused power + powernet.excess_power -= excess // Remove the excess from the powernet, so later SMESes don't try to use it output_used -= excess - if(clev != chargedisplay()) //if needed updates the icons overlay + if(clev != charge_display()) // If needed updates the icons overlay update_icon() return @@ -353,7 +358,7 @@ /obj/machinery/power/smes/ui_data(mob/user) var/list/data = list( "capacity" = capacity, - "capacityPercent" = round(100*charge/capacity, 0.1), + "capacityPercent" = round(100 * charge / capacity, 0.1), "charge" = charge, "inputAttempt" = input_attempt, "inputting" = inputting, @@ -420,32 +425,6 @@ /obj/machinery/power/smes/proc/log_smes(mob/user) investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user ? key_name(user) : "outside forces"]", "singulo") -/obj/machinery/power/smes/proc/ion_act() - if(is_station_level(src.z)) - if(prob(1)) //explosion - for(var/mob/M in viewers(src)) - M.show_message("[src] is making strange noises!", 3, "You hear sizzling electronics.", 2) - sleep(10*pick(4,5,6,7,10,14)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, FALSE, loc) - smoke.attach(src) - smoke.start() - explosion(src.loc, -1, 0, 1, 3, 1, 0) - qdel(src) - return - if(prob(15)) //Power drain - do_sparks(3, 1, src) - if(prob(50)) - emp_act(1) - else - emp_act(2) - if(prob(5)) //smoke only - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, FALSE, loc) - smoke.attach(src) - smoke.start() - - /obj/machinery/power/smes/proc/inputting(do_input) input_attempt = do_input if(!input_attempt) @@ -461,7 +440,7 @@ outputting(rand(0, 1)) output_level = rand(0, output_level_max) input_level = rand(0, input_level_max) - charge -= 1e6/severity + charge -= 1e6 / severity if(charge < 0) charge = 0 update_icon() @@ -483,6 +462,5 @@ ..() #undef SMESRATE - #undef SMESMAXCHARGELEVEL #undef SMESMAXOUTPUT