Files
Bubberstation/code/modules/power/cell.dm
JoJe3003 3836e13c7d Fix infinite capacity power cell/battery use() method return values (#93544)
## About The Pull Request
Infinite capacity power cells and megacells were returning TRUE (which
evaluates to 1) instead of the actual amount used in their use()
methods. This caused bugs when large electrical loads were applied, as
the power system expected the actual amount consumed to be returned for
proper power accounting. Without this fix, the infinite capacity
megacell would not work properly on the main power grid of the station
as the load would be too big, and it would choke the power grid.

This is the use() method.
```C
/// Use power from the cell.
/// Args:
/// - used: Amount of power in joules to use.
/// - force: If true, uses the remaining power from the cell if there isn't enough power to supply the demand.
/// Returns: The power used from the cell in joules.
/obj/item/stock_parts/power_store/use(used, force = FALSE)
    var/power_used = min(used, charge)     // Calculate how much power we can actually provide
    if(rigged && power_used > 0)
        explode()
        return 0                           // Cell exploded, no power provided
    if(!force && charge < used)
        return 0                           // Not enough charge and force=FALSE, no power provided
    charge -= power_used                   // Reduce the cell's charge by the amount used
    if(!istype(loc, /obj/machinery/power/apc))
        SSblackbox.record_feedback("tally", "cell_used", 1, type)
    return power_used                      // Return the actual amount of power provided
```

It is overridden in battery.dm and cell.dm but the override is
implemented inccorectly. This PR fixes that.

Changes:
- battery.dm: Changed infinite battery use() to return used instead of
TRUE
- cell.dm: Changed infinite cell use() to return used instead of TRUE
## Why It's Good For The Game
Its a bug fix.
## Changelog
🆑

fix: Fixed a bug where infinite capacity power cells and megacells
wouldn't work on large power grids (high loads).

/🆑
2025-10-21 22:15:49 +02:00

261 lines
8.6 KiB
Plaintext

/**
* # Power cell
*
* Power cells, used primarily for handheld and portable things. Holds a reasonable amount of power.
*/
/obj/item/stock_parts/power_store/cell
name = "power cell"
desc = "A rechargeable electrochemical power cell."
icon = 'icons/obj/machines/cell_charger.dmi'
icon_state = "cell"
inhand_icon_state = "cell"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
force = 5
throwforce = 5
throw_speed = 2
throw_range = 5
emp_damage_modifier = 1
w_class = WEIGHT_CLASS_SMALL
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*7, /datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5)
grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5)
/obj/item/stock_parts/power_store/cell/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_FISHING_BAIT, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_POISONOUS_BAIT, INNATE_TRAIT) //bro is fishing using lithium...
var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/battery_match)
AddElement(
/datum/element/slapcrafting,\
slapcraft_recipes = slapcraft_recipe_list,\
)
/* Cell variants*/
/obj/item/stock_parts/power_store/cell/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/crap
name = "\improper Nanotrasen brand rechargeable AA cell"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
icon_state = "aa_cell"
maxcharge = STANDARD_CELL_CHARGE * 0.5
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.4)
/obj/item/stock_parts/power_store/cell/crap/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
return ..()
/obj/item/stock_parts/power_store/cell/crap/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/upgraded
name = "upgraded power cell"
desc = "A power cell with a slightly higher capacity than normal!"
icon_state = "9v_cell"
maxcharge = STANDARD_CELL_CHARGE * 2.5
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.5)
chargerate = STANDARD_CELL_RATE * 0.5
/obj/item/stock_parts/power_store/cell/upgraded/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
return ..()
/obj/item/stock_parts/power_store/cell/upgraded/plus
name = "upgraded power cell+"
desc = "A power cell with an even higher capacity than the base model!"
maxcharge = STANDARD_CELL_CHARGE * 5
/obj/item/stock_parts/power_store/cell/secborg
name = "security borg rechargeable D cell"
maxcharge = STANDARD_CELL_CHARGE * 0.6
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.4)
/obj/item/stock_parts/power_store/cell/secborg/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/mini_egun
name = "miniature energy gun power cell"
maxcharge = STANDARD_CELL_CHARGE * 0.6
/obj/item/stock_parts/power_store/cell/hos_gun
name = "X-01 multiphase energy gun power cell"
maxcharge = STANDARD_CELL_CHARGE * 1.2
/obj/item/stock_parts/power_store/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
emp_damage_modifier = 0.5
maxcharge = STANDARD_CELL_CHARGE * 40
chargerate = STANDARD_CELL_RATE * 0.75
/obj/item/stock_parts/power_store/cell/pulse/carbine //25 pulse shots
name = "pulse carbine power cell"
maxcharge = STANDARD_CELL_CHARGE * 5
/obj/item/stock_parts/power_store/cell/pulse/pistol //10 pulse shots
name = "pulse pistol power cell"
maxcharge = STANDARD_CELL_CHARGE * 2
/obj/item/stock_parts/power_store/cell/ninja
name = "black power cell"
icon_state = "bscell"
emp_damage_modifier = 3
maxcharge = STANDARD_CELL_CHARGE * 10
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.6)
chargerate = STANDARD_CELL_RATE
/obj/item/stock_parts/power_store/cell/high
name = "high-capacity power cell"
icon_state = "hcell"
emp_damage_modifier = 3
maxcharge = STANDARD_CELL_CHARGE * 10
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*0.6)
chargerate = STANDARD_CELL_RATE * 0.75
/obj/item/stock_parts/power_store/cell/high/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/super
name = "super-capacity power cell"
icon_state = "scell"
emp_damage_modifier = 5
maxcharge = STANDARD_CELL_CHARGE * 20
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 3)
chargerate = STANDARD_CELL_RATE
/obj/item/stock_parts/power_store/cell/super/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/hyper
name = "hyper-capacity power cell"
icon_state = "hpcell"
emp_damage_modifier = 5
maxcharge = STANDARD_CELL_CHARGE * 30
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT * 4)
chargerate = STANDARD_CELL_RATE * 1.5
/obj/item/stock_parts/power_store/cell/hyper/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/bluespace
name = "bluespace power cell"
desc = "A rechargeable transdimensional power cell."
icon_state = "bscell"
emp_damage_modifier = 5
maxcharge = STANDARD_CELL_CHARGE * 40
custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*6)
chargerate = STANDARD_CELL_RATE * 2
/obj/item/stock_parts/power_store/cell/bluespace/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/infinite
name = "infinite-capacity power cell"
icon_state = "icell"
emp_damage_modifier = 0
maxcharge = INFINITY //little disappointing if you examine it and it's not huge
custom_materials = list(/datum/material/glass=HALF_SHEET_MATERIAL_AMOUNT)
chargerate = INFINITY
ratingdesc = FALSE
/obj/item/stock_parts/power_store/cell/infinite/use(used, force = FALSE)
return used
/obj/item/stock_parts/power_store/cell/infinite/abductor
name = "void core"
desc = "An alien power cell that produces energy seemingly out of nowhere."
icon = 'icons/obj/antags/abductor.dmi'
icon_state = "cell"
maxcharge = STANDARD_CELL_CHARGE * 50
ratingdesc = FALSE
/obj/item/stock_parts/power_store/cell/infinite/abductor/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
return ..()
/obj/item/stock_parts/power_store/cell/potato
name = "potato battery"
desc = "A rechargeable starch based power cell."
icon = 'icons/obj/service/hydroponics/harvest.dmi'
icon_state = "potato"
maxcharge = STANDARD_CELL_CHARGE * 0.3
emp_damage_modifier = 0.5 //It's biological, so
charge_light_type = null
connector_type = null
custom_materials = null
grown_battery = TRUE //it has the overlays for wires
custom_premium_price = PAYCHECK_CREW
/obj/item/stock_parts/power_store/cell/potato/Initialize(mapload, override_maxcharge)
charge = maxcharge * 0.3
. = ..()
/obj/item/stock_parts/power_store/cell/emproof
name = "\improper EMP-proof cell"
desc = "An EMP-proof cell."
emp_damage_modifier = 0
maxcharge = STANDARD_CELL_CHARGE * 0.5
/obj/item/stock_parts/power_store/cell/emproof/Initialize(mapload)
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF)
return ..()
/obj/item/stock_parts/power_store/cell/emproof/empty
empty = TRUE
/obj/item/stock_parts/power_store/cell/emproof/corrupt()
return
/obj/item/stock_parts/power_store/cell/emproof/slime
name = "EMP-proof slime core"
desc = "A yellow slime core infused with plasma. Its organic nature makes it immune to EMPs."
icon = 'icons/mob/simple/slimes.dmi'
icon_state = "yellow-core"
custom_materials = null
maxcharge = STANDARD_CELL_CHARGE * 5
charge_light_type = null
connector_type = "slimecore"
/obj/item/stock_parts/power_store/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 = STANDARD_CELL_CHARGE * 0.12 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell
custom_materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT*0.2)
w_class = WEIGHT_CLASS_TINY
/obj/item/stock_parts/power_store/cell/emergency_light/Initialize(mapload)
. = ..()
var/area/area = get_area(src)
if(area)
if(!area.lightswitch || !area.light_power)
charge = 0 //For naturally depowered areas, we start with no power
/obj/item/stock_parts/power_store/cell/crystal_cell
name = "crystal power cell"
desc = "A very high power cell made from crystallized plasma"
icon_state = "crystal_cell"
maxcharge = STANDARD_CELL_CHARGE * 50
chargerate = 0
charge_light_type = null
connector_type = "crystal"
custom_materials = null
grind_results = null
/obj/item/stock_parts/power_store/cell/ethereal
name = "ahelp it"
desc = "you sohuldn't see this"
maxcharge = ETHEREAL_CHARGE_DANGEROUS
charge = ETHEREAL_CHARGE_FULL
icon_state = null
charge_light_type = null
connector_type = null
custom_materials = null
grind_results = null
emp_damage_modifier = 0
/obj/item/stock_parts/power_store/cell/ethereal/examine(mob/user)
. = ..()
CRASH("[src.type] got examined by [user]")