From a8b71089aef834545d7a2fb50d4545f685aa1b4c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 11 Jun 2017 02:03:27 -0500 Subject: [PATCH] upstream-merge-27933 --- .../chemistry/machinery/chem_dispenser.dm | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 428d1fc114..277b3b8ede 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -9,8 +9,9 @@ idle_power_usage = 40 interact_offline = 1 resistance_flags = FIRE_PROOF | ACID_PROOF - var/energy = 100 - var/max_energy = 100 + var/cell_type = /obj/item/weapon/stock_parts/cell/high + var/obj/item/weapon/stock_parts/cell/cell + var/powerefficiency = 0.01 var/amount = 30 var/recharged = 0 var/recharge_delay = 5 @@ -54,6 +55,7 @@ /obj/machinery/chem_dispenser/Initialize() . = ..() + cell = new cell_type recharge() dispensable_reagents = sortList(dispensable_reagents) @@ -66,11 +68,8 @@ recharged -= 1 /obj/machinery/chem_dispenser/proc/recharge() - if(stat & (BROKEN|NOPOWER)) return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) + var/usedpower = cell.give( 1 / powerefficiency) //Should always be a gain of one on the UI. + if(usedpower) use_power(2500) /obj/machinery/chem_dispenser/emag_act(mob/user) @@ -106,8 +105,8 @@ /obj/machinery/chem_dispenser/ui_data() var/data = list() data["amount"] = amount - data["energy"] = energy - data["maxEnergy"] = max_energy + data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. + data["maxEnergy"] = cell.maxcharge * powerefficiency data["isBeakerLoaded"] = beaker ? 1 : 0 var beakerContents[0] @@ -149,7 +148,7 @@ if(beaker && dispensable_reagents.Find(reagent)) var/datum/reagents/R = beaker.reagents var/free = R.maximum_volume - R.total_volume - var/actual = min(amount, energy * 10, free) + var/actual = min(amount, (cell.charge * powerefficiency)*10, free) R.add_reagent(reagent, actual) energy = max(energy - actual / 10, 0) @@ -189,15 +188,36 @@ add_overlay(beaker_overlay) else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag)) to_chat(user, "You can't load \the [I] into the machine!") + return ..() else return ..() +/obj/machinery/chem_dispenser/get_cell() + return cell + +/obj/machinery/chem_dispenser/emp_act(severity) + var/list/datum/reagents/R = list() + var/total = min(rand(7,15), Floor(cell.charge*powerefficiency)) + var/datum/reagents/Q = new(total*10) + if(beaker && beaker.reagents) + R += beaker.reagents + for(var/i in 1 to total) + Q.add_reagent(pick(dispensable_reagents), 10) + R += Q + chem_splash(get_turf(src), 3, R) + if(beaker && beaker.reagents) + beaker.reagents.remove_all() + cell.use(total/powerefficiency) + cell.emp_act() + visible_message(" The [src] malfunctions, spraying chemicals everywhere!") + ..() + + /obj/machinery/chem_dispenser/constructable name = "portable chem dispenser" icon = 'icons/obj/chemical.dmi' icon_state = "minidispenser" - energy = 10 - max_energy = 10 + powerefficiency = 0.001 amount = 5 recharge_delay = 30 dispensable_reagents = list() @@ -263,16 +283,13 @@ /obj/machinery/chem_dispenser/constructable/RefreshParts() var/time = 0 - var/temp_energy = 0 var/i ++ for(var/obj/item/weapon/stock_parts/cell/P in component_parts) + cell = P for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - temp_energy += M.rating - temp_energy-- - max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest + time += M.rating for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) time += C.rating - for(var/obj/item/weapon/stock_parts/cell/P in component_parts) - time += round(P.maxcharge, 10000) / 10000 recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(i=1, i<=M.rating, i++)