Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /obj/machinery/power/nuclear //That basic object for nuclear reactors
- name = "Nuclear generator"
- icon = 'nuclear.dmi'
- icon_state = "off"
- density = 1
- anchored = 0
- var
- sheets = 0
- sheet = "/obj/item/stack/sheet/uranium"
- maxsheets = 50
- ienergy = 0 //internal energy
- heat = 0
- maxheat = 10000 //Max heat to meltdown and explosion
- release = 100000 //Release watts
- utime = 5 //Rate of "Ignition" uranium stick
- var/datum/powernet/mypower = null
- status = 0
- overheated = 0
- safeties = 1
- coolant = 1
- derate = 0 //Setup energy outputing
- decharge = 0
- absenergy = 0 //Main energy - full energy units
- board = "/obj/machinery/power/nuclear_board"
- state = 0
- parts = list()
- New()
- parts += new /obj/item/weapon/cable_coil(src)
- parts += new /obj/item/weapon/stock_parts/capacitor(src)
- parts += new /obj/item/weapon/cell(src)
- parts += new /obj/item/weapon/cell(src)
- parts += new /obj/item/weapon/cell(src)
- parts += new /obj/item/weapon/cell(src)
- parts += new /obj/item/weapon/cell(src)
- parts += new board(src)
- Refresh()
- proc
- Refresh()
- for(var/obj/item/weapon/stock_parts/M in parts)
- if(istype(M, /obj/item/weapon/cell))
- derate += M.rating
- if(istype(M, /obj/item/weapon/stock_parts/capacitor))
- release = M.rating * 100000
- examine()
- usr << "[src.name] is turned " + (status ? "on" : "off") + ", a thermometer display - [heat], and charge level = [round(100 / release * ienergy)]%. Safeties lights are " + (safeties ? "on" : "off") + ",Reactor has [sheets] sheets"
- attackby(var/obj/item/O as obj, var/mob/living/user as mob)
- if(istype(O, /obj/item/weapon/wrench))
- for(var/obj/structure/cable/C in loc)
- if(istype(C,/obj/structure/cable))
- if(!anchored)
- user << "You wrench [src.name] to place"
- mypower = C.get_powernet()
- anchored = 1
- return
- else
- user << "You unwrench [src.name]"
- anchored = 0
- if(istype(O, sheet))
- var/obj/item/stack/nyan = O
- if(maxsheets > sheets)
- user << "You add [maxsheets - sheets] sheets of uranium"
- nyan.use(maxsheets - sheets)
- sheets += maxsheets - sheets
- else
- user << "[src.name] has maximum sheets"
- if(istype(O, /obj/item/weapon/card/emag))
- emagged = 1
- coolant = 0
- usr << "You pulse a [src.name], and off coolant system"
- if(istype(O, /obj/item/weapon/screwdriver))
- if(!state)
- state = 1
- user << "You unsecure bolts of panel"
- else if(state == 1)
- state = 0
- user << "You secure panel"
- if(istype(O, /obj/item/weapon/wirecutters) && state == 1)
- if(!status)
- state = 2
- user << "You cut cables"
- else
- if(status)
- user.take_organ_damage(0,rand(40,70))
- user << "\red \bold When you touch cables, they release spark, and burn you"
- else if(state == 2)
- state = 1
- user << "You mend wires."
- if(istype(O, /obj/item/device/multitool) && state == 2)
- if(safeties)
- if(coolant)
- coolant = 0
- user << "You turn off coolant"
- else
- coolant = 1
- user << "You turn on coolant"
- safeties = 0
- user << "You stop energy to safeties, and they offed"
- else
- safeties = 1
- user << "You back energy to safeties"
- if(istype(O, /obj/item/weapon/crowbar) && state == 2)
- user << "You destruct generator, but machine frame is broken"
- for(var/part in parts)
- new part(src)
- del(src)
- emp_act(severity)
- switch(severity)
- if(1.0)
- coolant = 0
- safeties = 0
- if(2.0)
- if(pick(15))
- coolant = 0
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- if(2.0)
- coolant = 0
- heat += 5000
- if(3.0)
- heat += 150
- if(4.0)
- heat -= 1000
- blob_act()
- if(status)
- for(var/mob/M in world.view)
- M << "FULL DISENTIGRATION!!"
- for(var/M in range(rand(1,5), loc))
- del(M)
- else
- del(src)
- attack_hand(var/mob/living/user)
- if(anchored)
- if(state == 0 || state == 1)
- if(sheets)
- if(!status)
- status = 1
- else
- status = 0
- decharge = 0
- else
- user << "[src.name] have 0 fuel"
- RefreshIcons()
- else
- user << "Cables cutted!"
- else
- user << "[src.name] is not wrenched"
- proc/RefreshIcons()
- if(status)
- icon_state = "on"
- else
- icon_state = "off"
- process()
- var/data = 0
- if(status)
- if(sheets)
- if(data < utime)
- ienergy += 9000 - data * utime * 10 //Enriched -> Depleted. So, straight-proportional energy mades.
- data++
- heat += 100 * data
- else
- if(sheets)
- sheets--
- data = 0
- else
- status = 0
- if(coolant && heat > 0)
- heat -= 95 * data //QHA = 95%!
- else
- status = 0
- heat--
- data = 0
- energy()
- if(ienergy > release && safeties)
- ienergy = release
- else
- if(ienergy - 50000 > release)
- if(prob(50))
- for(var/mob/living/M in world.view)
- M << "\blue [src.name] releases nice lightning."
- for(var/mob/living/M in circlerange(rand(1,10),loc))
- M.electrocute_act(round(sqrt(ienergy) / rand(2,6)), src, rand(0.1, 2))
- M << "\red \bold [src.name] releases a lightning onto YOU!!!"
- ienergy = 0
- if(ienergy == release) //nuclear reactor has capacitors for energy
- for(var/mob/M in viewers(9,loc))
- M << "[src.name] energy pulse diode blink"
- decharge = 1
- if(heat > 9000)
- if(heat > 9500)
- safeties = 0
- if(safeties)
- status = 0
- if(heat >= maxheat)
- overheated = 1
- if(overheated)
- for(var/mob/M in viewers(15,loc))
- M << "\red \bold [src.name] OVERHEATED! TURN OFF THEM FAST!"
- sleep(90)
- if(status)
- for(var/mob/M in viewers(sheets / 5,loc))
- M << "Oh...goodbye my friends."
- sleep(10)
- empulse(loc,sheets,sheets * 2)
- explosion(loc,round(sheets / 5), round(sheets / 2), round(sheets * 1.5), round(sheets * 3))
- del(src)
- else
- for(var/mob/M in viewers(15,loc))
- M << "\green \bold [src.name] has been shutdowned"
- status = 0
- overheated = 0
- for(decharge)
- status = 0
- energy()
- if(absenergy > 0)
- if(absenergy < mypower.load)
- absenergy = 0
- mypower.newavail += mypower.load - ienergy
- mypower.newavail += ienergy //Wattage
- absenergy -= mypower.load //Total - PowerLoad/(tick * derate)
- else
- ienergy = 0
- decharge = 0
- status = 1
- RefreshIcons()
- proc
- energy()
- ienergy = round(absenergy / derate)
- absenergy = ienergy * derate //Energy * CellForm(4*5 = 20, maximum hyper-cells)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement