mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-11 07:58:57 +01:00
cde601b021
Fixes https://github.com/Aurorastation/Aurora.3/issues/15357 Fixes https://github.com/Aurorastation/Aurora.3/issues/22459 Fixes https://github.com/Aurorastation/Aurora.3/issues/22593 Fixes https://github.com/Aurorastation/Aurora.3/issues/22634 changes: - bugfix: "Restores chat highlight background color selection functionality (PR #20701)" - bugfix: "Restores customizable chat message retention settings." - bugfix: "Updates recommended vscode extension config file." - bugfix: "Corrects some mismapped and missing scss files as well as removing temporary working files leftover in PR." - bugfix: "Fixes silicons/AI being unable to interact remotely with shield capacitor and shield generator machinery." - bugfix: "Fixes gene data disks produced by xenobotany's lysis-isolation centrifuge machine not displaying gene names." - bugfix: "Makes AI remote access to machinery TGUIs more consistent." - bugfix: "Fixes the Sensors interface not displaying sensor machinery's current health." - bugfix: "Fixes the Sensors interface displaying strange values for current range." - bugfix: "Fixes modular computer software displaying device themes instead of explicit software themes." - bugfix: "Fixes MC tab links." - spellcheck: "Fixes a typo in the TGUI fatal error message."
188 lines
6.2 KiB
Plaintext
188 lines
6.2 KiB
Plaintext
/obj/structure/machinery/shield_capacitor
|
|
name = "shield capacitor"
|
|
desc = "Machine that charges a shield generator."
|
|
icon = 'icons/obj/machinery/shielding.dmi'
|
|
icon_state = "capacitor"
|
|
obj_flags = OBJ_FLAG_ROTATABLE
|
|
density = TRUE
|
|
/// Doesn't use APC power.
|
|
use_power = POWER_USE_OFF
|
|
req_one_access = list(ACCESS_CAPTAIN, ACCESS_SECURITY, ACCESS_ENGINE)
|
|
|
|
var/active = FALSE
|
|
/// Not to be confused with power cell charge, this is in Joules.
|
|
var/stored_charge = 0
|
|
var/last_stored_charge = 0
|
|
var/time_since_fail = 100
|
|
///How much energy the capacitor can store, value is in Joules, displayed in the UI as MJ. This value is calculated in RefreshParts() based on the components used, the value listed here is what base components provides, changing the value only here will not do anything.
|
|
var/max_charge = 20 MEGA //200 MJ
|
|
///How much energy the capacitor can absorb per second, value is in Watts, displayed in the UI as MW. This value is calculated in RefreshParts() based on the components used, the value listed here is what base components provides, changing the value only here will not do anything.
|
|
var/max_charge_rate = 9 MEGA WATTS //9 MW
|
|
var/locked = FALSE
|
|
|
|
var/charge_rate = 100 KILO WATTS //100 kW
|
|
var/obj/structure/machinery/shield_gen/owned_gen
|
|
|
|
component_types = list(
|
|
/obj/item/circuitboard/shield_cap,
|
|
/obj/item/stock_parts/capacitor = 4,
|
|
/obj/item/stock_parts/micro_laser = 1,
|
|
/obj/item/stock_parts/subspace/filter = 1,
|
|
/obj/item/stock_parts/subspace/treatment = 1,
|
|
/obj/item/stock_parts/subspace/analyzer = 1,
|
|
/obj/item/stock_parts/console_screen = 1,
|
|
/obj/item/stack/cable_coil = 5
|
|
)
|
|
|
|
/obj/structure/machinery/shield_capacitor/upgrade_hints(mob/user, distance, is_adjacent)
|
|
. += ..()
|
|
. += "Upgraded <b>capacitors</b> will increase capacity."
|
|
. += SPAN_NOTICE(" - The current capacity is <b>[max_charge / 1e6]</b> MJ")
|
|
. += "Upgraded <b>microlasers</b> will increase the charging rate."
|
|
. += SPAN_NOTICE(" - The current maximum charge rate is <b>[max_charge_rate / 1e6]</b> MW")
|
|
|
|
/obj/structure/machinery/shield_capacitor/Initialize()
|
|
..()
|
|
return INITIALIZE_HINT_LATELOAD
|
|
|
|
/obj/structure/machinery/shield_capacitor/LateInitialize()
|
|
. = ..()
|
|
for(var/obj/structure/machinery/shield_gen/possible_gen in range(1, src))
|
|
if(get_dir(src, possible_gen) == dir)
|
|
if(possible_gen.attach_capacitor(src))
|
|
owned_gen = possible_gen
|
|
break
|
|
|
|
/obj/structure/machinery/shield_capacitor/emag_act(var/remaining_charges, var/mob/user)
|
|
if(prob(75))
|
|
locked = !locked
|
|
to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]")
|
|
. = TRUE
|
|
updateDialog()
|
|
spark(src, 5, GLOB.alldirs)
|
|
|
|
/obj/structure/machinery/shield_capacitor/RefreshParts()
|
|
..()
|
|
max_charge = 0
|
|
max_charge_rate = 6 MEGA WATTS //9 MW after base components. 15 MW with full upgrades.
|
|
|
|
for(var/obj/item/stock_parts/P in component_parts)
|
|
if(iscapacitor(P))
|
|
max_charge += P.rating * 5 MEGA
|
|
else if(ismicrolaser(P))
|
|
max_charge_rate += P.rating * 3 MEGA WATTS
|
|
|
|
/obj/structure/machinery/shield_capacitor/attackby(obj/item/attacking_item, mob/user)
|
|
|
|
if(default_part_replacement(user, attacking_item))
|
|
return TRUE
|
|
else if(default_deconstruction_screwdriver(user, attacking_item))
|
|
return TRUE
|
|
else if(default_deconstruction_crowbar(user, attacking_item))
|
|
return TRUE
|
|
|
|
if(istype(attacking_item, /obj/item/card/id))
|
|
if(allowed(user))
|
|
locked = !locked
|
|
to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]")
|
|
updateDialog()
|
|
else
|
|
to_chat(user, SPAN_ALERT("Access denied."))
|
|
else if(attacking_item.tool_behaviour == TOOL_WRENCH)
|
|
anchored = !anchored
|
|
visible_message(SPAN_NOTICE("\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by \the [user]."))
|
|
|
|
if(anchored)
|
|
for(var/obj/structure/machinery/shield_gen/gen in range(1, src))
|
|
if(get_dir(src, gen) == src.dir)
|
|
if(gen.attach_capacitor(src))
|
|
owned_gen = gen
|
|
break
|
|
else
|
|
if(owned_gen)
|
|
owned_gen.detach_capacitor(src)
|
|
owned_gen = null
|
|
else
|
|
..()
|
|
|
|
/obj/structure/machinery/shield_capacitor/attack_hand(mob/user)
|
|
if(stat & (BROKEN))
|
|
return
|
|
ui_interact(user)
|
|
|
|
/obj/structure/machinery/shield_capacitor/attack_ai(mob/user)
|
|
if(!ai_can_interact(user))
|
|
return
|
|
return attack_hand(user)
|
|
|
|
/obj/structure/machinery/shield_capacitor/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "ShieldCapacitor", "Shield Capacitor", 400, 300)
|
|
ui.open()
|
|
|
|
/obj/structure/machinery/shield_capacitor/ui_data(mob/user)
|
|
var/list/data = list()
|
|
data["anchored"] = anchored
|
|
data["locked"] = locked
|
|
data["active"] = active
|
|
data["time_since_fail"] = time_since_fail
|
|
data["charge_rate"] = charge_rate / 1000 //UI expects kW
|
|
data["stored_charge"] = round(stored_charge / 1e6, 0.1) //UI expects MJ
|
|
data["max_charge"] = max_charge / 1e6 //UI expects MJ
|
|
data["max_charge_rate"] = max_charge_rate / 1000 //UI expects kW
|
|
return data
|
|
|
|
/obj/structure/machinery/shield_capacitor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
switch(action)
|
|
if("toggle")
|
|
if(!active && !anchored)
|
|
to_chat(usr, SPAN_WARNING("\The [src] needs to be firmly secured to the floor first."))
|
|
return
|
|
active = !active
|
|
. = TRUE
|
|
if("charge_rate")
|
|
// UI sends kW; convert to W and clamp.
|
|
charge_rate = between(0 KILO WATTS, round(params["charge_rate"]) * 1000, max_charge_rate)
|
|
. = TRUE
|
|
|
|
/obj/structure/machinery/shield_capacitor/process()
|
|
if (!anchored)
|
|
active = FALSE
|
|
|
|
//see if we can connect to a power net.
|
|
var/datum/powernet/PN
|
|
var/turf/T = loc
|
|
|
|
if (!istype(T))
|
|
active = FALSE
|
|
return
|
|
|
|
var/obj/structure/cable/C = T.get_cable_node()
|
|
|
|
if (C)
|
|
PN = C.powernet
|
|
|
|
if (PN)
|
|
var/power_draw = between(0, max_charge - stored_charge, charge_rate) //what we are trying to draw
|
|
power_draw = POWERNET_POWER_DRAW(PN, power_draw) //what we actually get
|
|
DRAW_FROM_POWERNET(PN, power_draw)
|
|
stored_charge += power_draw
|
|
|
|
time_since_fail++
|
|
if(stored_charge < last_stored_charge)
|
|
time_since_fail = 0 //losing charge faster than we can draw from PN
|
|
last_stored_charge = stored_charge
|
|
|
|
/obj/structure/machinery/shield_capacitor/power_change()
|
|
if(stat & BROKEN)
|
|
icon_state = "broke"
|
|
else
|
|
..()
|
|
|
|
/// Horizon-specific non-variant, for now.
|
|
/obj/structure/machinery/shield_capacitor/multiz
|