Files
Aurora.3/code/modules/power/batteryrack.dm
Ron ceab73c63e Makes some machines upgradeable (#3311)
Adds the ability to upgrade the following:
- Sleepers
- The ore processor
- All cooking appliances (Minus the microwave)
- Tesla Coil

Also makes components not spawn in machines until they are needed (When they are being upgraded) to reduce the objects generated. Adds some new macro's and converts some istypes to use them. And moves stock parts into their own file.
2017-08-28 01:51:37 -05:00

206 lines
6.8 KiB
Plaintext

//The one that works safely.
/obj/machinery/power/smes/batteryrack
name = "power cell rack PSU"
desc = "A rack of power cells working as a PSU."
charge = 0 //you dont really want to make a potato PSU which already is overloaded
output_attempt = 0
input_level = 0
output_level = 0
input_level_max = 0
output_level_max = 0
icon_state = "gsmes"
var/cells_amount = 0
var/capacitors_amount = 0
component_types = list(
/obj/item/weapon/circuitboard/batteryrack,
/obj/item/weapon/cell/high = 3
)
/obj/machinery/power/smes/batteryrack/RefreshParts()
capacitors_amount = 0
cells_amount = 0
if(!component_parts)
populate_components()
var/max_level = 0 //for both input and output
for(var/obj/item/weapon/stock_parts/capacitor/CP in component_parts)
max_level += CP.rating
capacitors_amount++
input_level_max = 50000 + max_level * 20000
output_level_max = 50000 + max_level * 20000
var/C = 0
for(var/obj/item/weapon/cell/PC in component_parts)
C += PC.maxcharge
cells_amount++
capacity = C * 40 //Basic cells are such crap. Hyper cells needed to get on normal SMES levels.
/obj/machinery/power/smes/batteryrack/update_icon()
cut_overlays()
if(stat & BROKEN) return
if (output_attempt)
add_overlay("gsmes_outputting")
if(inputting)
add_overlay("gsmes_charging")
var/clevel = chargedisplay()
if(clevel>0)
add_overlay("gsmes_og[clevel]")
/obj/machinery/power/smes/batteryrack/chargedisplay()
return round(4 * charge/(capacity ? capacity : 5e6))
/obj/machinery/power/smes/batteryrack/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) //these can only be moved by being reconstructed, solves having to remake the powernet.
..() //SMES attackby for now handles screwdriver, cable coils and wirecutters, no need to repeat that here
if(open_hatch)
if(iscrowbar(W))
if (charge < (capacity / 100))
if (!output_attempt && !input_attempt)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
M.state = 2
M.icon_state = "box_1"
for(var/obj/I in component_parts)
I.loc = src.loc
qdel(src)
return 1
else
user << "<span class='warning'>Turn off the [src] before dismantling it.</span>"
else
user << "<span class='warning'>Better let [src] discharge before dismantling it.</span>"
else if ((istype(W, /obj/item/weapon/stock_parts/capacitor) && (capacitors_amount < 5)) || (istype(W, /obj/item/weapon/cell) && (cells_amount < 5)))
if (charge < (capacity / 100))
if (!output_attempt && !input_attempt)
user.drop_item()
component_parts += W
W.loc = src
RefreshParts()
user << "<span class='notice'>You upgrade the [src] with [W.name].</span>"
else
user << "<span class='warning'>Turn off the [src] before dismantling it.</span>"
else
user << "<span class='warning'>Better let [src] discharge before putting your hand inside it.</span>"
else
user.set_machine(src)
interact(user)
return 1
return
//The shitty one that will blow up.
/obj/machinery/power/smes/batteryrack/makeshift
name = "makeshift PSU"
desc = "A rack of batteries connected by a mess of wires posing as a PSU."
var/overcharge_percent = 0
component_types = list(
/obj/item/weapon/circuitboard/ghettosmes,
/obj/item/weapon/cell/high = 3
)
/obj/machinery/power/smes/batteryrack/makeshift/update_icon()
cut_overlays()
if(stat & BROKEN) return
if (output_attempt)
add_overlay("gsmes_outputting")
if(inputting)
add_overlay("gsmes_charging")
if (overcharge_percent > 100)
add_overlay("gsmes_overcharge")
else
var/clevel = chargedisplay()
if(clevel>0)
add_overlay("gsmes_og[clevel]")
//This mess of if-elses and magic numbers handles what happens if the engies don't pay attention and let it eat too much charge
//What happens depends on how much capacity has the ghetto smes and how much it is overcharged.
//Under 1.2M: 5% of ion_act() per process() tick from 125% and higher overcharges. 1.2M is achieved with 3 high cells.
//[1.2M-2.4M]: 6% ion_act from 120%. 1% of EMP from 140%.
//(2.4M-3.6M] :7% ion_act from 115%. 1% of EMP from 130%. 1% of non-hull-breaching explosion at 150%.
//(3.6M-INFI): 8% ion_act from 115%. 2% of EMP from 125%. 1% of Hull-breaching explosion from 140%.
/obj/machinery/power/smes/batteryrack/makeshift/proc/overcharge_consequences()
switch (capacity)
if (0 to (1.2e6-1))
if (overcharge_percent >= 125)
if (prob(5))
ion_act()
if (1.2e6 to 2.4e6)
if (overcharge_percent >= 120)
if (prob(6))
ion_act()
else
return
if (overcharge_percent >= 140)
if (prob(1))
empulse(src.loc, 3, 8, 1)
if ((2.4e6+1) to 3.6e6)
if (overcharge_percent >= 115)
if (prob(7))
ion_act()
else
return
if (overcharge_percent >= 130)
if (prob(1))
empulse(src.loc, 3, 8, 1)
if (overcharge_percent >= 150)
if (prob(1))
explosion(src.loc, 0, 1, 3, 5)
if ((3.6e6+1) to INFINITY)
if (overcharge_percent >= 115)
if (prob(8))
ion_act()
else
return
if (overcharge_percent >= 125)
if (prob(2))
empulse(src.loc, 4, 10, 1)
if (overcharge_percent >= 140)
if (prob(1))
explosion(src.loc, 1, 3, 5, 8)
else //how the hell was this proc called for negative charge
charge = 0
#define SMESRATE 0.05 // rate of internal charge to external power
/obj/machinery/power/smes/batteryrack/makeshift/machinery_process()
if(stat & BROKEN) return
//store machine state to see if we need to update the icon overlays
var/last_disp = chargedisplay()
var/last_chrg = inputting
var/last_onln = output_attempt
var/last_overcharge = overcharge_percent
if(terminal)
if(input_attempt)
var/target_load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity
var/actual_load = draw_power(target_load) // add the load to the terminal side network
charge += actual_load * SMESRATE // increase the charge
if (actual_load >= target_load) // did the powernet have enough power available for us?
inputting = 1
else
inputting = 0
if(output_attempt) // if outputting
output_used = min( charge/SMESRATE, output_level) //limit output to that stored
charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive)
add_avail(output_used) // add output to powernet (smes side)
if(charge < 0.0001)
outputting(0) // stop output if charge falls to zero
overcharge_percent = round((charge / capacity) * 100)
if (overcharge_percent > 115) //115% is the minimum overcharge for anything to happen
overcharge_consequences()
// only update icon if state changed
if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != output_attempt || ((overcharge_percent > 100) ^ (last_overcharge > 100)))
update_icon()
return
#undef SMESRATE