From f5c67f87abc1b38c80eb7422acfae4f8180db5f4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 12 Jul 2014 15:44:21 -0400 Subject: [PATCH] Fixes chargers being a magical source of charge --- code/game/machinery/cell_charger.dm | 15 ++++---- code/game/machinery/recharger.dm | 54 +++++++++++++++++---------- code/modules/organs/organ_external.dm | 4 +- code/modules/power/cell.dm | 9 +++-- 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 7632e9cb6ee..b263377feaa 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -1,6 +1,6 @@ /obj/machinery/cell_charger - name = "cell charger" - desc = "It charges power cells." + name = "heavy-duty cell charger" + desc = "A much more powerful version of the standard recharger that is specially designed for charging power cells." icon = 'icons/obj/power.dmi' icon_state = "ccharger0" anchored = 1 @@ -10,7 +10,9 @@ power_channel = EQUIP var/obj/item/weapon/cell/charging = null var/chargelevel = -1 - var/efficiency = 0.875 //<1.0 means some power is lost in the charging process, >1.0 means free energy. + var/power_rating = 50000 //50 kW. A measure of how powerful this charger is for charging cells (this the power drawn when charging) + + proc updateicon() icon_state = "ccharger[charging ? 1 : 0]" @@ -93,9 +95,8 @@ if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored) return - var/power_used = 100000 //for 200 units of charge. Yes, thats right, 100 kW. Is something wrong with CELLRATE? - - power_used = charging.give(power_used*CELLRATE*efficiency) - use_power(power_used) + if (!charging.fully_charged()) + var/charge_used = charging.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) //It's only while charging something, so I'm going to say use_power() is fine here... updateicon() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index bffc256b742..b293451e5e6 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -7,13 +7,19 @@ obj/machinery/recharger anchored = 1 use_power = 1 idle_power_usage = 4 - active_power_usage = 250 + var/power_rating = 15000 //15 kW var/obj/item/charging = null + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell) obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) if(istype(user,/mob/living/silicon)) return - if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G,/obj/item/device/laptop)) + + var/allowed = 0 + for (var/allowed_type in allowed_devices) + if (istype(G, allowed_type)) allowed = 1 + + if(allowed) if(charging) return @@ -39,11 +45,10 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) user.drop_item() G.loc = src charging = G - use_power = 2 update_icon() else if(istype(G, /obj/item/weapon/wrench)) if(charging) - user << "\red Remove the weapon first!" + user << "\red Remove [charging] first!" return anchored = !anchored user << "You [anchored ? "attached" : "detached"] the recharger." @@ -56,7 +61,6 @@ obj/machinery/recharger/attack_hand(mob/user as mob) charging.update_icon() charging.loc = loc charging = null - use_power = 1 update_icon() obj/machinery/recharger/attack_paw(mob/user as mob) @@ -69,19 +73,20 @@ obj/machinery/recharger/process() if(charging) if(istype(charging, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = charging - if(E.power_supply.charge < E.power_supply.maxcharge) - E.power_supply.give(100) + if(!E.power_supply.fully_charged()) icon_state = "recharger1" - use_power(250/CELLRATE) + var/charge_used = E.power_supply.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) else icon_state = "recharger2" return if(istype(charging, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = charging if(B.bcell) - if(B.bcell.give(1500)) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti + if(!B.bcell.fully_charged()) icon_state = "recharger1" - use_power(200/CELLRATE) + var/charge_used = B.bcell.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) else icon_state = "recharger2" else @@ -89,14 +94,22 @@ obj/machinery/recharger/process() return if(istype(charging, /obj/item/device/laptop)) var/obj/item/device/laptop/L = charging - if(L.stored_computer.battery.charge < L.stored_computer.battery.maxcharge) - L.stored_computer.battery.give(100) + if(!L.stored_computer.battery.fully_charged()) icon_state = "recharger1" - use_power(250/CELLRATE) + var/charge_used = L.stored_computer.battery.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) + else + icon_state = "recharger2" + return + if(istype(charging, /obj/item/weapon/cell)) + var/obj/item/weapon/cell/C = charging + if(!C.fully_charged()) + icon_state = "recharger1" + var/charge_used = C.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) else icon_state = "recharger2" return - obj/machinery/recharger/emp_act(severity) @@ -125,6 +138,8 @@ obj/machinery/recharger/wallcharger name = "wall recharger" icon = 'icons/obj/stationobjs.dmi' icon_state = "wrecharger0" + power_rating = 25000 //25 kW , It's more specialized than the standalone recharger but more powerful + allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton) obj/machinery/recharger/wallcharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) @@ -133,19 +148,20 @@ obj/machinery/recharger/wallcharger/process() if(charging) if(istype(charging, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = charging - if(E.power_supply.charge < E.power_supply.maxcharge) - E.power_supply.give(100) + if(!E.power_supply.fully_charged()) icon_state = "wrecharger1" - use_power(250/CELLRATE) + var/charge_used = E.power_supply.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) else icon_state = "wrecharger2" return if(istype(charging, /obj/item/weapon/melee/baton)) var/obj/item/weapon/melee/baton/B = charging if(B.bcell) - if(B.bcell.give(1500)) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti + if(!B.bcell.fully_charged()) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti icon_state = "wrecharger1" - use_power(200/CELLRATE) + var/charge_used = B.bcell.give(power_rating*CELLRATE) + use_power(charge_used/CELLRATE) else icon_state = "wrecharger2" else diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 5cf4d013022..cd6ac2b7dd2 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -98,7 +98,7 @@ return // High brute damage or sharp objects may damage internal organs - if(internal_organs != null) if( (sharp && brute >= 5) || brute >= 10) if(prob(5)) + if(internal_organs && ( (sharp && brute >= 5) || brute >= 10) && prob(5)) // Damage an internal organ var/datum/organ/internal/I = pick(internal_organs) I.take_damage(brute / 2) @@ -387,7 +387,7 @@ Note that amputating the affected organ does in fact remove the infection from t /datum/organ/external/proc/handle_germ_effects() var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") - if (germ_level < INFECTION_LEVEL_ONE && prob(60)) //this could be an else clause, but it looks cleaner this way + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE && prob(60)) //this could be an else clause, but it looks cleaner this way germ_level-- //since germ_level increases at a rate of 1 per second with dirty wounds, prob(60) should give us about 5 minutes before level one. if(germ_level >= INFECTION_LEVEL_ONE) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 5c4b37ba26a..6caf7e1e99a 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -22,6 +22,9 @@ /obj/item/weapon/cell/proc/percent() // return % charge of cell return 100.0*charge/maxcharge +/obj/item/weapon/cell/proc/fully_charged() + return (charge == maxcharge) + // use power from a cell /obj/item/weapon/cell/proc/use(var/amount) if(rigged && amount > 0) @@ -39,15 +42,15 @@ return 0 if(maxcharge < amount) return 0 - var/power_used = min(maxcharge-charge,amount) + var/amount_used = min(maxcharge-charge,amount) if(crit_fail) return 0 if(!prob(reliability)) minor_fault++ if(prob(minor_fault)) crit_fail = 1 return 0 - charge += power_used - return power_used + charge += amount_used + return amount_used /obj/item/weapon/cell/examine()