From 5621507b4a0f96fb2dc43851ab53177acb697133 Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Sun, 3 Dec 2017 13:53:58 -0500 Subject: [PATCH] Adds emergency lights, built into light fixtures --- .../gamemodes/malfunction/Malf_Modules.dm | 27 ++++ code/modules/power/apc.dm | 10 ++ code/modules/power/cell.dm | 14 ++ code/modules/power/lighting.dm | 125 +++++++++++++++++- .../research/designs/autolathe_designs.dm | 8 ++ icons/mob/actions/actions_AI.dmi | Bin 8198 -> 8853 bytes tgui/src/interfaces/apc.ract | 9 ++ 7 files changed, 187 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 9be9e59cab..1c17893a28 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -734,6 +734,33 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( owner.playsound_local(owner, "sparks", 50, 0) +//Disable Emergency Lights +/datum/AI_Module/small/emergency_lights + module_name = "Disable Emergency Lights" + mod_pick_name = "disable_emergency_lights" + description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, they will not attempt to fall back on emergency power reserves." + cost = 10 + one_purchase = TRUE + power_type = /datum/action/innate/ai/emergency_lights + unlock_text = "You hook into the powernet and locate the connections between light fixtures and their fallbacks." + unlock_sound = "sparks" + +/datum/action/innate/ai/emergency_lights + name = "Disable Emergency Lights" + desc = "Disables all emergency lighting. Note that emergency lights can be restored through reboot at an APC." + button_icon_state = "emergency_lights" + uses = 1 + +/datum/action/innate/ai/emergency_lights/Activate() + for(var/obj/machinery/light/L in GLOB.machines) + if(L.z in GLOB.station_z_levels) + L.no_emergency = TRUE + INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) + CHECK_TICK + to_chat(owner, "Emergency light connections severed.") + owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE) + + //Reactivate Camera Network: Reactivates up to 30 cameras across the station. /datum/AI_Module/small/reactivate_cameras module_name = "Reactivate Camera Network" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 815da3fbdb..7f3b428978 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -89,6 +89,7 @@ var/auto_name = 0 var/failure_timer = 0 var/force_update = 0 + var/emergency_lights = FALSE var/update_state = -1 var/update_overlay = -1 var/icon_update_needed = FALSE @@ -760,6 +761,7 @@ "coverLocked" = coverlocked, "siliconUser" = user.has_unlimited_silicon_privilege || user.using_power_flow_console(), "malfStatus" = get_malf_status(user), + "emergencyLights" = !emergency_lights, "powerChannels" = list( list( @@ -899,6 +901,14 @@ failure_timer = 0 update_icon() update() + if("emergency_lighting") + emergency_lights = !emergency_lights + for(var/area/A in area.related) + for(var/obj/machinery/light/L in A) + if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override + L.no_emergency = emergency_lights + INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) + CHECK_TICK return 1 /obj/machinery/power/apc/proc/toggle_breaker() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c8e58791e2..acbebea458 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -343,3 +343,17 @@ /obj/item/stock_parts/cell/beam_rifle/emp_act(severity) charge = Clamp((charge-(10000/severity)),0,maxcharge) + +/obj/item/stock_parts/cell/emergency_light + name = "miniature power cell" + desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage." + maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell + materials = list(MAT_GLASS = 20) + rating = 1 + w_class = WEIGHT_CLASS_TINY + +/obj/item/stock_parts/cell/emergency_light/Initialize() + . = ..() + var/area/A = get_area(src) + if(!A.lightswitch || !A.light_power) + charge = 0 //For naturally depowered areas, we start with no power diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 98fb2ed233..635a17056d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -49,12 +49,22 @@ var/fixture_type = "tube" var/sheets_refunded = 2 var/obj/machinery/light/newlight = null + var/obj/item/stock_parts/cell/cell -/obj/structure/light_construct/New(loc, ndir, building) - ..() + var/cell_connectors = TRUE + +/obj/structure/light_construct/Initialize(mapload, ndir, building) + . = ..() if(building) setDir(ndir) +/obj/structure/light_construct/Destroy() + QDEL_NULL(cell) + return ..() + +/obj/structure/light_construct/get_cell() + return cell + /obj/structure/light_construct/examine(mob/user) ..() switch(src.stage) @@ -64,9 +74,38 @@ to_chat(user, "It's wired.") if(3) to_chat(user, "The casing is closed.") + if(cell_connectors) + if(cell) + to_chat(user, "You see [cell] inside the casing.") + else + to_chat(user, "The casing has no power cell for backup power.") + else + to_chat(user, "This casing doesn't support power cells for backup power.") + return /obj/structure/light_construct/attackby(obj/item/W, mob/user, params) add_fingerprint(user) + if(istype(W, /obj/item/stock_parts/cell)) + if(!cell_connectors) + to_chat(user, "This [name] can't support a power cell!") + return + if(W.flags_1 & NODROP_1) + to_chat(user, "[W] is stuck to your hand!") + return + user.dropItemToGround(W) + if(cell) + user.visible_message("[user] swaps [W] out for [src]'s cell.", \ + "You swap [src]'s power cells.") + cell.forceMove(drop_location()) + user.put_in_hands(cell) + else + user.visible_message("[user] hooks up [W] to [src].", \ + "You add [W] to [src].") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + W.forceMove(src) + cell = W + add_fingerprint(user) + return switch(stage) if(1) if(istype(W, /obj/item/wrench)) @@ -124,6 +163,10 @@ newlight = new /obj/machinery/light/small/built(loc) newlight.setDir(dir) transfer_fingerprints_to(newlight) + if(cell) + newlight.cell = cell + cell.forceMove(newlight) + cell = null qdel(src) return return ..() @@ -173,6 +216,11 @@ var/rigged = 0 // true if rigged to explode + var/obj/item/stock_parts/cell/cell + var/start_with_cell = TRUE // if true, this fixture generates a very weak cell at roundstart + var/emergency_mode = FALSE // if true, the light is in emergency mode + var/no_emergency = FALSE // if true, this light cannot ever have an emergency mode + // the smaller bulb light fixture /obj/machinery/light/small @@ -192,8 +240,14 @@ /obj/machinery/light/built icon_state = "tube-empty" + start_with_cell = FALSE +<<<<<<< HEAD /obj/machinery/light/built/New() +======= +/obj/machinery/light/built/Initialize() + . = ..() +>>>>>>> fe816da... Adds emergency lights, built into light fixtures (#33213) status = LIGHT_EMPTY update(0) ..() @@ -208,8 +262,15 @@ // create a new lighting fixture +<<<<<<< HEAD /obj/machinery/light/New() ..() +======= +/obj/machinery/light/Initialize() + . = ..() + if(start_with_cell && !no_emergency) + cell = new/obj/item/stock_parts/cell/emergency_light(src) +>>>>>>> fe816da... Adds emergency lights, built into light fixtures (#33213) spawn(2) switch(fitting) if("tube") @@ -228,13 +289,17 @@ if(A) on = FALSE // A.update_lights() + QDEL_NULL(cell) return ..() /obj/machinery/light/update_icon() switch(status) // set icon_states if(LIGHT_OK) - icon_state = "[base_state][on]" + if(emergency_mode) + icon_state = "[base_state]_emergency" + else + icon_state = "[base_state][on]" if(LIGHT_EMPTY) icon_state = "[base_state]-empty" on = FALSE @@ -249,7 +314,7 @@ // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(trigger = 1) - update_icon() + emergency_mode = FALSE if(on) if(!light || light.light_range != brightness) switchcount++ @@ -261,10 +326,15 @@ burn_out() else use_power = ACTIVE_POWER_USE - set_light(brightness) + set_light(brightness, 1, "#FFFFFF") + else if(has_emergency_power() && !turned_off()) + use_power = IDLE_POWER_USE + emergency_mode = TRUE + process() //Force a process tick to update the light immediately else use_power = IDLE_POWER_USE set_light(0) + update_icon() active_power_usage = (brightness * 10) if(on != on_gs) @@ -276,6 +346,12 @@ removeStaticPower(static_power_used, STATIC_LIGHT) +/obj/machinery/light/process() + if(has_power() && cell) + cell.charge = min(cell.maxcharge, cell.charge + 0.2) //Recharge emergency power automatically while not using it + if(emergency_mode && !use_emergency_power(0.2)) + update(FALSE) //Disables emergency mode and sets the color to normal + /obj/machinery/light/proc/burn_out() if(status == LIGHT_OK) status = LIGHT_BURNED @@ -289,6 +365,9 @@ on = (s && status == LIGHT_OK) update() +/obj/machinery/light/get_cell() + return cell + // examine verb /obj/machinery/light/examine(mob/user) ..() @@ -301,6 +380,8 @@ to_chat(user, "The [fitting] is burnt out.") if(LIGHT_BROKEN) to_chat(user, "The [fitting] has been smashed.") + if(cell) + to_chat(user, "Its backup power charge meter reads [(cell.charge / cell.maxcharge) * 100]%.") @@ -384,6 +465,10 @@ drop_light_tube() new /obj/item/stack/cable_coil(loc, 1, "red") transfer_fingerprints_to(newlight) + if(cell) + newlight.cell = cell + cell.forceMove(newlight) + cell = null qdel(src) /obj/machinery/light/attacked_by(obj/item/I, mob/living/user) @@ -415,6 +500,11 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) +// returns if the light has power /but/ is manually turned off +// if a light is turned off, it won't activate emergency power +/obj/machinery/light/proc/turned_off() + var/area/A = get_area(src) + return !A.lightswitch && A.power_light // returns whether this light has power // true if area has power and lightswitch is on @@ -422,6 +512,27 @@ var/area/A = get_area(src) return A.lightswitch && A.power_light +// returns whether this light has emergency power +// can also return if it has access to a certain amount of that power +/obj/machinery/light/proc/has_emergency_power(pwr) + if(no_emergency || !cell) + return FALSE + if(pwr ? cell.charge >= pwr : cell.charge) + return status == LIGHT_OK + +// attempts to use power from the installed emergency cell, returns true if it does and false if it doesn't +/obj/machinery/light/proc/use_emergency_power(pwr = 0.2) + if(!has_emergency_power(pwr)) + return FALSE + if(cell.charge > 300) //it's meant to handle 120 W, ya doofus + visible_message("[src] short-circuits from too powerful of a power cell!") + burn_out() + return FALSE + cell.use(pwr) + set_light(brightness * 0.25, max(0.5, 0.75 * (cell.charge / cell.maxcharge)), "#FF3232") //RGB: 255, 50, 50 + return TRUE + + /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) set waitfor = 0 if(flickering) @@ -441,7 +552,9 @@ // ai attack - make lights flicker, because why not /obj/machinery/light/attack_ai(mob/user) - src.flicker(1) + no_emergency = !no_emergency + to_chat(user, "Emergency lights for this fixture have been [no_emergency ? "disabled" : "enabled"].") + update(FALSE) return // attack with hand - remove tube/bulb diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 03424346e8..77150a44d8 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -799,3 +799,11 @@ materials = list(MAT_METAL = 300, MAT_GLASS = 200) build_path = /obj/item/device/slime_scanner category = list("initial", "Misc") + +/datum/design/miniature_power_cell + name = "Light Fixture Battery" + id = "miniature_power_cell" + build_type = AUTOLATHE + materials = list(MAT_GLASS = 20) + build_path = /obj/item/stock_parts/cell/emergency_light + category = list("initial", "Electronics") diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi index c6e4e1dae721a5f603f3164a4fea2830b789e566..2ddc7923cc3e56b3df04a1d90612c3f5c2265117 100644 GIT binary patch literal 8853 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 LdZ$<`ZyEYOOr4{T literal 8198 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 b=MB3xxf=^%FEIgjun+hkuO?S3V;cNFF}mC} diff --git a/tgui/src/interfaces/apc.ract b/tgui/src/interfaces/apc.ract index 686d20755a..fb1d7d2799 100644 --- a/tgui/src/interfaces/apc.ract +++ b/tgui/src/interfaces/apc.ract @@ -121,6 +121,15 @@ {{/if}} {{/if}} + + + {{#if data.locked && !data.siliconUser}} + {{data.emergencyLights ? "Enabled" : "Disabled"}} + {{else}} + {{data.emergencyLights ? "Enabled" : "Disabled"}} + {{/if}} + + {{#if data.locked && !data.siliconUser}}