diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 22612983a8..db7b9d0e45 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -167,7 +167,8 @@ return if(!R.cell.fully_charged()) var/diff = min(R.cell.maxcharge - R.cell.charge, charge_rate) // Capped at charge_rate charge / tick - if (cell.use(diff)) + if (cell.charge >= diff) + cell.use(diff) R.cell.give(diff) if(weld_rate && R.getBruteLoss()) R.adjustBruteLoss(-1) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 5cab6b24cb..bd344d2267 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -88,8 +88,11 @@ name = "infinite-capacity power cell!" icon_state = "icell" origin_tech = null - maxcharge = 30000 + maxcharge = 30000 //determines how badly mobs get shocked matter = list("metal" = 700, "glass" = 80) + + check_charge() + return 1 use() return 1 diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 62890d849c..811cd4f866 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -35,12 +35,13 @@ /obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt) if(bcell) - if(bcell.use(chrgdeductamt)) + if(bcell.checked_use(chrgdeductamt)) return 1 else status = 0 update_icon() return 0 + return null /obj/item/weapon/melee/baton/update_icon() if(status) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index eff23b686c..b534c861fe 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -706,7 +706,7 @@ take_hit((100/severity_class), "electrical pulse", 1) /obj/item/weapon/rig/proc/shock(mob/user) - if (electrocute_mob(user, cell, src)) + if (electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here. spark_system.start() if(user.stunned) return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index c0d119b0b4..f3f48b5661 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -3,9 +3,7 @@ if(!istype(user,/mob/living)) return 0 if(electrified != 0) - if(cell && cell.charge >= 100) - cell.use(100) - if(shock(user, 100)) + if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. return // Pass repair items on to the chestpiece. @@ -193,8 +191,6 @@ /obj/item/weapon/rig/attack_hand(var/mob/user) if(electrified != 0) - if(cell && cell.charge >= 100) - cell.use(100) - if(shock(user, 100)) + if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b762ec79c1..542daeed5f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1233,8 +1233,9 @@ var/list/robot_verbs_default = list( if(cell.charge == 0) return 0 - if(cell.use(amount * CELLRATE * CYBORG_POWER_USAGE_MULTIPLIER)) - used_power_this_tick += amount * CYBORG_POWER_USAGE_MULTIPLIER + var/power_use = amount * CYBORG_POWER_USAGE_MULTIPLIER + if(cell.checked_use(CELLRATE * power_use)) + used_power_this_tick += power_use return 1 return 0 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 553891565c..f664890be9 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -9,7 +9,7 @@ spawn(5) updateicon() -/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/amount = 0) +/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/power = 0) if(drain_check) return 1 @@ -17,9 +17,9 @@ if(charge <= 0) return 0 - var/cell_amt = min((amount * CELLRATE), charge) - use(cell_amt) - return cell_amt / CELLRATE + var/cell_amt = power * CELLRATE + + return use(cell_amt) / CELLRATE /obj/item/weapon/cell/proc/updateicon() overlays.Cut() @@ -37,13 +37,26 @@ /obj/item/weapon/cell/proc/fully_charged() return (charge == maxcharge) -// use power from a cell +// checks if the power cell is able to provide the specified amount of charge +/obj/item/weapon/cell/proc/check_charge(var/amount) + return (charge >= amount) + +// use power from a cell, returns the amount actually used /obj/item/weapon/cell/proc/use(var/amount) if(rigged && amount > 0) explode() return 0 - charge = max(0, charge - amount) - return charge + var/used = min(charge, amount) + charge -= used + return used + +// Checks if the specified amount can be provided. If it can, it removes the amount +// from the cell and returns 1. Otherwise does nothing and returns 0. +/obj/item/weapon/cell/proc/checked_use(var/amount) + if(!check_charge(amount)) + return 0 + use(amount) + return 1 // recharge the cell /obj/item/weapon/cell/proc/give(var/amount) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 7cfcc53246..4a172b361b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -374,7 +374,7 @@ if (source_area) source_area.use_power(drained_energy/CELLRATE) else if (istype(power_source,/datum/powernet)) - var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts" + var/drained_power = drained_energy/CELLRATE drained_power = PN.draw_power(drained_power) else if (istype(power_source, /obj/item/weapon/cell)) cell.use(drained_energy) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 994256b12a..c167964f34 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -57,7 +57,7 @@ /obj/item/weapon/gun/energy/consume_next_projectile() if(!power_supply) return null if(!ispath(projectile_type)) return null - if(!power_supply.use(charge_cost)) return null + if(!power_supply.checked_use(charge_cost)) return null return new projectile_type(src) /obj/item/weapon/gun/energy/proc/get_external_power_supply()