Fixes multi-cell chargers (#27357)

* Update multi_cell_charger.dm

* Update wall_cell_charger.dm
This commit is contained in:
lessthanthree
2024-04-18 01:02:01 +02:00
committed by GitHub
parent 98121a2bf2
commit 26b15a012e
2 changed files with 32 additions and 22 deletions
@@ -7,7 +7,7 @@
circuit = null
obj_flags = CAN_BE_HIT | NO_DECONSTRUCTION
max_batteries = 3
charge_rate = 750
charge_rate = 900 KILO WATTS
/// The item we turn into when repacked
var/repacked_type = /obj/item/wallframe/cell_charger_multi
@@ -33,7 +33,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/cell_charger_multi/wall_mounted, 29)
/obj/machinery/cell_charger_multi/wall_mounted/RefreshParts()
. = ..()
charge_rate = 750 // Nuh uh!
charge_rate = 900 KILO WATTS // Nuh uh!
// Item for creating the arc furnace or carrying it around
@@ -10,11 +10,12 @@
power_channel = AREA_USAGE_EQUIP
circuit = /obj/item/circuitboard/machine/cell_charger_multi
pass_flags = PASSTABLE
var/list/charging_batteries = list() //The list of batteries we are gonna charge!
/// The list of batteries we are gonna charge!
var/list/charging_batteries = list()
/// Number of concurrent batteries that can be charged
var/max_batteries = 4
var/charge_rate = 250 KILO WATTS
var/charge_rate_base = 250 KILO WATTS// Amount of charge we gain from a level one capacitor
var/charge_rate_max = 4000 KILO WATTS// The highest we allow the charge rate to go
/// The base charge rate when spawned
var/charge_rate = 375 KILO WATTS
/obj/machinery/cell_charger_multi/update_overlays()
. = ..()
@@ -93,15 +94,27 @@
if(!charging_batteries.len || !anchored || (machine_stat & (BROKEN|NOPOWER)))
return
for(var/obj/item/stock_parts/cell/charging in charging_batteries)
if(charging.percent() >= 100)
// create a charging queue, we only want cells that require charging to use the power budget
var/list/charging_queue = list()
for(var/obj/item/stock_parts/cell/battery_slot in charging_batteries)
if(battery_slot.percent() >= 100)
continue
var/main_draw = use_power_from_net(charge_rate * seconds_per_tick, take_any = TRUE) //Pulls directly from the Powernet to dump into the cell
if(!main_draw)
return
charging.give(main_draw)
use_energy(charge_rate / 100) //use a small bit for the charger itself, but power usage scales up with the part tier
LAZYADD(charging_queue, battery_slot)
if(!length(charging_queue))
return
// since this loop is running multiple times per tick, we divide so that the total usage in the tick is the expected charge rate
// 4 batteries can no longer magically each pull 4MW per tick (16MW total per tick) out of thin air like in the old system
var/charge_current = (charge_rate / length(charging_queue)) * seconds_per_tick
if(!charge_current)
return
for(var/obj/item/stock_parts/cell/charging_cell in charging_queue)
use_energy(charge_current * 0.01) //use a small bit for the charger itself, but power usage scales up with the part tier
charge_cell(charge_current, charging_cell, grid_only = TRUE)
LAZYNULL(charging_queue)
update_appearance()
/obj/machinery/cell_charger_multi/attack_tk(mob/user)
@@ -115,14 +128,9 @@
/obj/machinery/cell_charger_multi/RefreshParts()
. = ..()
charge_rate = 0 // No, you cant get free charging speed!
var/charge_rate_base = 250 KILO WATTS
for(var/datum/stock_part/capacitor/capacitor in component_parts)
charge_rate += charge_rate_base * capacitor.tier
if(charge_rate >= charge_rate_max) // We've hit the charge speed cap, stop iterating.
charge_rate = charge_rate_max
break
if(charge_rate < charge_rate_base) // This should never happen; but we need to pretend it can.
charge_rate = charge_rate_base
charge_rate += (charge_rate_base * capacitor.tier) / 4
/obj/machinery/cell_charger_multi/emp_act(severity)
. = ..()
@@ -137,6 +145,8 @@
for(var/obj/item/stock_parts/cell/charging in charging_batteries)
charging.forceMove(drop_location())
charging_batteries = null
return ..()
/obj/machinery/cell_charger_multi/attack_ai(mob/user)
return
@@ -163,7 +173,7 @@
if(charging_batteries.len > 1 && user)
var/list/buttons = list()
for(var/obj/item/stock_parts/cell/battery in charging_batteries)
buttons["[battery] [battery.percent()]%"] = battery
buttons["[battery.name] ([round(battery.percent(), 1)]%)"] = battery
var/cell_name = tgui_input_list(user, "Please choose what cell you'd like to remove.", "Remove a cell", buttons)
charging = buttons[cell_name]
else
@@ -186,7 +196,7 @@
name = "Multi-Cell Charger (Machine Board)"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
build_path = /obj/machinery/cell_charger_multi
req_components = list(/datum/stock_part/capacitor = 4)
req_components = list(/datum/stock_part/capacitor = 6)
needs_anchored = FALSE