Advertisement
EditorRUS

Nuclear Generator SS13. v1.5

Mar 11th, 2012
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.43 KB | None | 0 0
  1. /obj/machinery/power/nuclear //That basic object for nuclear reactors
  2. name = "Nuclear generator"
  3. icon = 'nuclear.dmi'
  4. icon_state = "off"
  5. density = 1
  6. anchored = 0
  7. var
  8. sheets = 0
  9. sheet = "/obj/item/stack/sheet/uranium"
  10. maxsheets = 50
  11. ienergy = 0 //internal energy
  12. heat = 0
  13. maxheat = 10000 //Max heat to meltdown and explosion
  14. release = 100000 //Release watts
  15. utime = 5 //Rate of "Ignition" uranium stick
  16. var/datum/powernet/mypower = null
  17. status = 0
  18. overheated = 0
  19. safeties = 1
  20. coolant = 1
  21. derate = 0 //Setup energy outputing
  22. decharge = 0
  23. absenergy = 0 //Main energy - full energy units
  24. board = "/obj/machinery/power/nuclear_board"
  25. state = 0
  26. parts = list()
  27. New()
  28. parts += new /obj/item/weapon/cable_coil(src)
  29. parts += new /obj/item/weapon/stock_parts/capacitor(src)
  30. parts += new /obj/item/weapon/cell(src)
  31. parts += new /obj/item/weapon/cell(src)
  32. parts += new /obj/item/weapon/cell(src)
  33. parts += new /obj/item/weapon/cell(src)
  34. parts += new /obj/item/weapon/cell(src)
  35. parts += new board(src)
  36. Refresh()
  37. proc
  38. Refresh()
  39. for(var/obj/item/weapon/stock_parts/M in parts)
  40. if(istype(M, /obj/item/weapon/cell))
  41. derate += M.rating
  42. if(istype(M, /obj/item/weapon/stock_parts/capacitor))
  43. release = M.rating * 100000
  44. examine()
  45. 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"
  46. attackby(var/obj/item/O as obj, var/mob/living/user as mob)
  47. if(istype(O, /obj/item/weapon/wrench))
  48. for(var/obj/structure/cable/C in loc)
  49. if(istype(C,/obj/structure/cable))
  50. if(!anchored)
  51. user << "You wrench [src.name] to place"
  52. mypower = C.get_powernet()
  53. anchored = 1
  54. return
  55. else
  56. user << "You unwrench [src.name]"
  57. anchored = 0
  58. if(istype(O, sheet))
  59. var/obj/item/stack/nyan = O
  60. if(maxsheets > sheets)
  61. user << "You add [maxsheets - sheets] sheets of uranium"
  62. nyan.use(maxsheets - sheets)
  63. sheets += maxsheets - sheets
  64. else
  65. user << "[src.name] has maximum sheets"
  66. if(istype(O, /obj/item/weapon/card/emag))
  67. emagged = 1
  68. coolant = 0
  69. usr << "You pulse a [src.name], and off coolant system"
  70. if(istype(O, /obj/item/weapon/screwdriver))
  71. if(!state)
  72. state = 1
  73. user << "You unsecure bolts of panel"
  74. else if(state == 1)
  75. state = 0
  76. user << "You secure panel"
  77. if(istype(O, /obj/item/weapon/wirecutters) && state == 1)
  78. if(!status)
  79. state = 2
  80. user << "You cut cables"
  81. else
  82. if(status)
  83. user.take_organ_damage(0,rand(40,70))
  84. user << "\red \bold When you touch cables, they release spark, and burn you"
  85. else if(state == 2)
  86. state = 1
  87. user << "You mend wires."
  88. if(istype(O, /obj/item/device/multitool) && state == 2)
  89. if(safeties)
  90. if(coolant)
  91. coolant = 0
  92. user << "You turn off coolant"
  93. else
  94. coolant = 1
  95. user << "You turn on coolant"
  96. safeties = 0
  97. user << "You stop energy to safeties, and they offed"
  98. else
  99. safeties = 1
  100. user << "You back energy to safeties"
  101. if(istype(O, /obj/item/weapon/crowbar) && state == 2)
  102. user << "You destruct generator, but machine frame is broken"
  103. for(var/part in parts)
  104. new part(src)
  105. del(src)
  106. emp_act(severity)
  107. switch(severity)
  108. if(1.0)
  109. coolant = 0
  110. safeties = 0
  111. if(2.0)
  112. if(pick(15))
  113. coolant = 0
  114. ex_act(severity)
  115. switch(severity)
  116. if(1.0)
  117. del(src)
  118. if(2.0)
  119. coolant = 0
  120. heat += 5000
  121. if(3.0)
  122. heat += 150
  123. if(4.0)
  124. heat -= 1000
  125. blob_act()
  126. if(status)
  127. for(var/mob/M in world.view)
  128. M << "FULL DISENTIGRATION!!"
  129. for(var/M in range(rand(1,5), loc))
  130. del(M)
  131. else
  132. del(src)
  133. attack_hand(var/mob/living/user)
  134. if(anchored)
  135. if(state == 0 || state == 1)
  136. if(sheets)
  137. if(!status)
  138. status = 1
  139. else
  140. status = 0
  141. decharge = 0
  142. else
  143. user << "[src.name] have 0 fuel"
  144. RefreshIcons()
  145. else
  146. user << "Cables cutted!"
  147. else
  148. user << "[src.name] is not wrenched"
  149. proc/RefreshIcons()
  150. if(status)
  151. icon_state = "on"
  152. else
  153. icon_state = "off"
  154. process()
  155. var/data = 0
  156. if(status)
  157. if(sheets)
  158. if(data < utime)
  159. ienergy += 9000 - data * utime * 10 //Enriched -> Depleted. So, straight-proportional energy mades.
  160. data++
  161. heat += 100 * data
  162. else
  163. if(sheets)
  164. sheets--
  165. data = 0
  166. else
  167. status = 0
  168. if(coolant && heat > 0)
  169. heat -= 95 * data //QHA = 95%!
  170. else
  171. status = 0
  172. heat--
  173. data = 0
  174. energy()
  175. if(ienergy > release && safeties)
  176. ienergy = release
  177. else
  178. if(ienergy - 50000 > release)
  179. if(prob(50))
  180. for(var/mob/living/M in world.view)
  181. M << "\blue [src.name] releases nice lightning."
  182. for(var/mob/living/M in circlerange(rand(1,10),loc))
  183. M.electrocute_act(round(sqrt(ienergy) / rand(2,6)), src, rand(0.1, 2))
  184. M << "\red \bold [src.name] releases a lightning onto YOU!!!"
  185. ienergy = 0
  186. if(ienergy == release) //nuclear reactor has capacitors for energy
  187. for(var/mob/M in viewers(9,loc))
  188. M << "[src.name] energy pulse diode blink"
  189. decharge = 1
  190. if(heat > 9000)
  191. if(heat > 9500)
  192. safeties = 0
  193. if(safeties)
  194. status = 0
  195. if(heat >= maxheat)
  196. overheated = 1
  197. if(overheated)
  198. for(var/mob/M in viewers(15,loc))
  199. M << "\red \bold [src.name] OVERHEATED! TURN OFF THEM FAST!"
  200. sleep(90)
  201. if(status)
  202. for(var/mob/M in viewers(sheets / 5,loc))
  203. M << "Oh...goodbye my friends."
  204. sleep(10)
  205. empulse(loc,sheets,sheets * 2)
  206. explosion(loc,round(sheets / 5), round(sheets / 2), round(sheets * 1.5), round(sheets * 3))
  207. del(src)
  208. else
  209. for(var/mob/M in viewers(15,loc))
  210. M << "\green \bold [src.name] has been shutdowned"
  211. status = 0
  212. overheated = 0
  213. for(decharge)
  214. status = 0
  215. energy()
  216. if(absenergy > 0)
  217. if(absenergy < mypower.load)
  218. absenergy = 0
  219. mypower.newavail += mypower.load - ienergy
  220. mypower.newavail += ienergy //Wattage
  221. absenergy -= mypower.load //Total - PowerLoad/(tick * derate)
  222. else
  223. ienergy = 0
  224. decharge = 0
  225. status = 1
  226. RefreshIcons()
  227. proc
  228. energy()
  229. ienergy = round(absenergy / derate)
  230. absenergy = ienergy * derate //Energy * CellForm(4*5 = 20, maximum hyper-cells)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement