EditorRUS

Untitled

Mar 7th, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.61 KB | None | 0 0
  1. // attach a wire to a power machine - leads from the turf you are standing on
  2.  
  3. /obj/machinery/power/attackby(obj/item/weapon/W, mob/user)
  4.  
  5. if(istype(W, /obj/item/weapon/cable_coil))
  6.  
  7. var/obj/item/weapon/cable_coil/coil = W
  8.  
  9. var/turf/T = user.loc
  10.  
  11. if(T.intact || !istype(T, /turf/simulated/floor))
  12. return
  13.  
  14. if(get_dist(src, user) > 1)
  15. return
  16.  
  17. if(!directwired) // only for attaching to directwired machines
  18. return
  19.  
  20. var/dirn = get_dir(user, src)
  21.  
  22. for(var/obj/structure/cable/LC in T)
  23. if( (LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0) )
  24. user << "There's already a cable at that position."
  25. return
  26.  
  27. var/obj/structure/cable/NC = new(T)
  28.  
  29. NC.cableColor(coil.color)
  30.  
  31. NC.d1 = 0
  32. NC.d2 = dirn
  33. NC.add_fingerprint()
  34. NC.updateicon()
  35.  
  36. NC.mergeConnectedNetworks(NC.d2)
  37. NC.mergeConnectedNetworksOnTurf()
  38. if(netnum == 0 && NC.netnum == 0)
  39. var/datum/powernet/PN = new()
  40.  
  41. PN.number = powernets.len + 1
  42. powernets += PN
  43. NC.netnum = PN.number
  44. netnum = PN.number
  45. PN.cables += NC
  46. PN.nodes += src
  47. powernet = PN
  48. else if(netnum == 0)
  49. netnum = NC.netnum
  50. var/datum/powernet/PN = powernets[netnum]
  51. powernet = PN
  52. PN.nodes += src
  53. NC.mergeConnectedNetworksOnTurf()
  54.  
  55. coil.use(1)
  56. if (NC.shock(user, 50))
  57. if (prob(50)) //fail
  58. new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color)
  59. del(NC)
  60. return
  61. else
  62. ..()
  63. return
  64.  
  65. // the power cable object
  66.  
  67. /obj/structure/cable/New()
  68. ..()
  69.  
  70.  
  71. // ensure d1 & d2 reflect the icon_state for entering and exiting cable
  72.  
  73. var/dash = findtext(icon_state, "-")
  74.  
  75. d1 = text2num( copytext( icon_state, 1, dash ) )
  76.  
  77. d2 = text2num( copytext( icon_state, dash+1 ) )
  78.  
  79. var/turf/T = src.loc // hide if turf is not intact
  80.  
  81. if(level==1) hide(T.intact)
  82.  
  83.  
  84. /obj/structure/cable/Del() // called when a cable is deleted
  85.  
  86. if(!defer_powernet_rebuild) // set if network will be rebuilt manually
  87.  
  88. if(netnum && powernets && powernets.len >= netnum) // make sure cable & powernet data is valid
  89. var/datum/powernet/PN = powernets[netnum]
  90. PN.cut_cable(src) // updated the powernets
  91. else
  92. if(Debug) diary << "Defered cable deletion at [x],[y]: #[netnum]"
  93. ..() // then go ahead and delete the cable
  94.  
  95. /obj/structure/cable/hide(var/i)
  96.  
  97. if(level == 1 && istype(loc, /turf))
  98. invisibility = i ? 101 : 0
  99. updateicon()
  100.  
  101. /obj/structure/cable/proc/updateicon()
  102. if(invisibility)
  103. icon_state = "[d1]-[d2]-f"
  104. else
  105. icon_state = "[d1]-[d2]"
  106.  
  107.  
  108. // returns the powernet this cable belongs to
  109. /obj/structure/cable/proc/get_powernet()
  110. var/datum/powernet/PN // find the powernet
  111. if(netnum && powernets && powernets.len >= netnum)
  112. PN = powernets[netnum]
  113. return PN
  114.  
  115. /obj/structure/cable/attack_hand(mob/user)
  116. if(ishuman(user))
  117. if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
  118. call(/obj/item/clothing/gloves/space_ninja/proc/drain)("WIRE",src,user:wear_suit)
  119. return
  120.  
  121. /obj/structure/cable/attackby(obj/item/W, mob/user)
  122.  
  123. var/turf/T = src.loc
  124. if(T.intact)
  125. return
  126.  
  127. if(istype(W, /obj/item/weapon/wirecutters))
  128.  
  129. if(power_switch)
  130. user << "\red This piece of cable is tied to a power switch. Flip the switch to remove it."
  131. return
  132.  
  133. if (shock(user, 50))
  134. return
  135.  
  136. if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
  137. new/obj/item/weapon/cable_coil(T, 2, color)
  138. else
  139. new/obj/item/weapon/cable_coil(T, 1, color)
  140.  
  141. for(var/mob/O in viewers(src, null))
  142. O.show_message("\red [user] cuts the cable.", 1)
  143.  
  144. if(defer_powernet_rebuild)
  145. if(netnum && powernets && powernets.len >= netnum)
  146. var/datum/powernet/PN = powernets[netnum]
  147. PN.cut_cable(src)
  148. del(src)
  149.  
  150. return // not needed, but for clarity
  151.  
  152.  
  153. else if(istype(W, /obj/item/weapon/cable_coil))
  154. var/obj/item/weapon/cable_coil/coil = W
  155. coil.cable_join(src, user)
  156.  
  157. else if(istype(W, /obj/item/device/multitool))
  158.  
  159. var/datum/powernet/PN = get_powernet() // find the powernet
  160.  
  161. if(PN && (PN.avail > 0)) // is it powered?
  162. user << "\red [PN.avail]W in power network."
  163.  
  164. else
  165. user << "\red The cable is not powered."
  166.  
  167. shock(user, 5, 0.2)
  168.  
  169. else
  170. if (W.flags & CONDUCT)
  171. shock(user, 50, 0.7)
  172.  
  173. src.add_fingerprint(user)
  174.  
  175. // shock the user with probability prb
  176.  
  177. /obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0)
  178. if(!prob(prb))
  179. return 0
  180. if (electrocute_mob(user, powernets[src.netnum], src, siemens_coeff))
  181. var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
  182. s.set_up(5, 1, src)
  183. s.start()
  184. return 1
  185. else
  186. return 0
  187.  
  188. /obj/structure/cable/ex_act(severity)
  189. switch(severity)
  190. if(1.0)
  191. del(src)
  192. if(2.0)
  193. if (prob(50))
  194. new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, color)
  195. del(src)
  196.  
  197. if(3.0)
  198. if (prob(25))
  199. new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, color)
  200. del(src)
  201. return
  202.  
  203. /obj/structure/cable/emp_act(severity)
  204. var/datum/powernet/PN = get_powernet()
  205. var/location = get_turf(src)
  206. switch(severity)
  207. if(1.0)
  208. PN.load += rand(5000,10000)
  209. del(src)
  210. var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
  211. s.set_up(rand(3,7),1,src)
  212. s.start()
  213. for(var/mob/M in viewers(10,location))
  214. M << "A wires melt with sparks!"
  215. if(2.0)
  216. PN.avail += rand(3500,7000)
  217. return
  218.  
  219. // the cable coil object, used for laying cable
  220.  
  221. /obj/item/weapon/cable_coil/New(loc, length = MAXCOIL, var/param_color = null)
  222. ..()
  223. src.amount = length
  224. if (param_color)
  225. color = param_color
  226. pixel_x = rand(-2,2)
  227. pixel_y = rand(-2,2)
  228. updateicon()
  229.  
  230.  
  231. /obj/item/weapon/cable_coil/cut/New(loc)
  232. ..()
  233. src.amount = rand(1,2)
  234. pixel_x = rand(-2,2)
  235. pixel_y = rand(-2,2)
  236. updateicon()
  237.  
  238. /obj/item/weapon/cable_coil/proc/updateicon()
  239. if (!color)
  240. color = pick("red", "yellow", "blue", "green")
  241. if(amount == 1)
  242. icon_state = "coil_[color]1"
  243. name = "cable piece"
  244. else if(amount == 2)
  245. icon_state = "coil_[color]2"
  246. name = "cable piece"
  247. else
  248. icon_state = "coil_[color]"
  249. name = "cable coil"
  250.  
  251. /obj/item/weapon/cable_coil/examine()
  252. set src in view(1)
  253.  
  254. if(amount == 1)
  255. usr << "A short piece of power cable."
  256. else if(amount == 2)
  257. usr << "A piece of power cable."
  258. else
  259. usr << "A coil of power cable. There are [amount] lengths of cable in the coil."
  260.  
  261. /obj/item/weapon/cable_coil/attackby(obj/item/weapon/W, mob/user)
  262. ..()
  263. if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1)
  264. src.amount--
  265. new/obj/item/weapon/cable_coil(user.loc, 1,color)
  266. user << "You cut a piece off the cable coil."
  267. src.updateicon()
  268. return
  269.  
  270. else if( istype(W, /obj/item/weapon/cable_coil) )
  271. var/obj/item/weapon/cable_coil/C = W
  272. if(C.amount == MAXCOIL)
  273. user << "The coil is too long, you cannot add any more cable to it."
  274. return
  275.  
  276. if( (C.amount + src.amount <= MAXCOIL) )
  277. C.amount += src.amount
  278. user << "You join the cable coils together."
  279. C.updateicon()
  280. del(src)
  281. return
  282.  
  283. else
  284. user << "You transfer [MAXCOIL - src.amount ] length\s of cable from one coil to the other."
  285. src.amount -= (MAXCOIL-C.amount)
  286. src.updateicon()
  287. C.amount = MAXCOIL
  288. C.updateicon()
  289. return
  290.  
  291. /obj/item/weapon/cable_coil/proc/use(var/used)
  292. if(src.amount < used)
  293. return 0
  294. else if (src.amount == used)
  295. del(src)
  296. else
  297. amount -= used
  298. updateicon()
  299. return 1
  300.  
  301. // called when cable_coil is clicked on a turf/simulated/floor
  302.  
  303. /obj/item/weapon/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user)
  304.  
  305. if(!isturf(user.loc))
  306. return
  307.  
  308. if(get_dist(F,user) > 1)
  309. user << "You can't lay cable at a place that far away."
  310. return
  311.  
  312. if(F.intact) // if floor is intact, complain
  313. user << "You can't lay cable there unless the floor tiles are removed."
  314. return
  315.  
  316. else
  317. var/dirn
  318.  
  319. if(user.loc == F)
  320. dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing
  321. else
  322. dirn = get_dir(F, user)
  323.  
  324. for(var/obj/structure/cable/LC in F)
  325. if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
  326. user << "There's already a cable at that position."
  327. return
  328.  
  329. var/obj/structure/cable/C = new(F)
  330.  
  331. C.cableColor(color)
  332.  
  333. C.d1 = 0
  334. C.d2 = dirn
  335. C.add_fingerprint(user)
  336. C.updateicon()
  337.  
  338. var/datum/powernet/PN = new()
  339. PN.number = powernets.len + 1
  340. powernets += PN
  341. C.netnum = PN.number
  342. PN.cables += C
  343.  
  344. C.mergeConnectedNetworks(C.d2)
  345. C.mergeConnectedNetworksOnTurf()
  346.  
  347.  
  348. use(1)
  349. if (C.shock(user, 50))
  350. if (prob(50)) //fail
  351. new/obj/item/weapon/cable_coil(C.loc, 1, C.color)
  352. del(C)
  353. //src.laying = 1
  354. //last = C
  355.  
  356.  
  357. // called when cable_coil is click on an installed obj/cable
  358.  
  359. /obj/item/weapon/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user)
  360.  
  361. var/turf/U = user.loc
  362. if(!isturf(U))
  363. return
  364.  
  365. var/turf/T = C.loc
  366.  
  367. if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable
  368. return
  369.  
  370. if(get_dist(C, user) > 1) // make sure it's close enough
  371. user << "You can't lay cable at a place that far away."
  372. return
  373.  
  374.  
  375. if(U == T) // do nothing if we clicked a cable we're standing on
  376. return // may change later if can think of something logical to do
  377.  
  378. var/dirn = get_dir(C, user)
  379.  
  380. if(C.d1 == dirn || C.d2 == dirn) // one end of the clicked cable is pointing towards us
  381. if(U.intact) // can't place a cable if the floor is complete
  382. user << "You can't lay cable there unless the floor tiles are removed."
  383. return
  384. else
  385. // cable is pointing at us, we're standing on an open tile
  386. // so create a stub pointing at the clicked cable on our tile
  387.  
  388. var/fdirn = turn(dirn, 180) // the opposite direction
  389.  
  390. for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already
  391. if(LC.d1 == fdirn || LC.d2 == fdirn)
  392. user << "There's already a cable at that position."
  393. return
  394.  
  395. var/obj/structure/cable/NC = new(U)
  396. NC.cableColor(color)
  397.  
  398. NC.d1 = 0
  399. NC.d2 = fdirn
  400. NC.add_fingerprint()
  401. NC.updateicon()
  402.  
  403. NC.netnum = C.netnum
  404. var/datum/powernet/PN = powernets[C.netnum]
  405. PN.cables += NC
  406. NC.mergeConnectedNetworks(NC.d2)
  407. NC.mergeConnectedNetworksOnTurf()
  408. use(1)
  409. if (NC.shock(user, 50))
  410. if (prob(50)) //fail
  411. new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color)
  412. del(NC)
  413.  
  414. return
  415. else if(C.d1 == 0) // exisiting cable doesn't point at our position, so see if it's a stub
  416. // if so, make it a full cable pointing from it's old direction to our dirn
  417. var/nd1 = C.d2 // these will be the new directions
  418. var/nd2 = dirn
  419.  
  420.  
  421. if(nd1 > nd2) // swap directions to match icons/states
  422. nd1 = dirn
  423. nd2 = C.d2
  424.  
  425.  
  426. for(var/obj/structure/cable/LC in T) // check to make sure there's no matching cable
  427. if(LC == C) // skip the cable we're interacting with
  428. continue
  429. if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction
  430. user << "There's already a cable at that position."
  431. return
  432.  
  433.  
  434. C.cableColor(color)
  435.  
  436. C.d1 = nd1
  437. C.d2 = nd2
  438.  
  439. C.add_fingerprint()
  440. C.updateicon()
  441.  
  442.  
  443. C.mergeConnectedNetworks(C.d1)
  444. C.mergeConnectedNetworks(C.d2)
  445. C.mergeConnectedNetworksOnTurf()
  446.  
  447. use(1)
  448. if (C.shock(user, 50))
  449. if (prob(50)) //fail
  450. new/obj/item/weapon/cable_coil(C.loc, 2, C.color)
  451. del(C)
  452.  
  453. return
  454.  
  455. /obj/structure/cable/proc/mergeConnectedNetworks(var/direction)
  456. var/turf/TB
  457. if((d1 == direction || d2 == direction) != 1)
  458. return
  459. TB = get_step(src, direction)
  460.  
  461. for(var/obj/structure/cable/TC in TB)
  462.  
  463. if(!TC)
  464. continue
  465.  
  466. if(src == TC)
  467. continue
  468.  
  469. var/fdir = (!direction)? 0 : turn(direction, 180)
  470.  
  471. if(TC.d1 == fdir || TC.d2 == fdir)
  472.  
  473. if(!netnum)
  474. var/datum/powernet/PN = powernets[TC.netnum]
  475. netnum = TC.netnum
  476. PN = powernets[netnum]
  477. PN.cables += src
  478. continue
  479.  
  480. if(TC.netnum != netnum)
  481. var/datum/powernet/PN = powernets[netnum]
  482. var/datum/powernet/TPN = powernets[TC.netnum]
  483.  
  484. PN.merge_powernets(TPN)
  485.  
  486. /obj/structure/cable/proc/mergeConnectedNetworksOnTurf()
  487.  
  488.  
  489. for(var/obj/structure/cable/C in loc)
  490.  
  491.  
  492. if(!C)
  493. continue
  494.  
  495. if(C == src)
  496. continue
  497. if(netnum == 0)
  498. var/datum/powernet/PN = powernets[C.netnum]
  499. netnum = C.netnum
  500. PN.cables += src
  501. continue
  502.  
  503. var/datum/powernet/PN = powernets[netnum]
  504. var/datum/powernet/TPN = powernets[C.netnum]
  505.  
  506. PN.merge_powernets(TPN)
  507.  
  508. for(var/obj/machinery/power/M in loc)
  509.  
  510. if(!M)
  511. continue
  512.  
  513. if(!M.netnum)
  514. var/datum/powernet/PN = powernets[netnum]
  515. PN.nodes += M
  516. M.netnum = netnum
  517. M.powernet = powernets[M.netnum]
  518.  
  519. if(M.netnum < 0)
  520. continue
  521.  
  522. var/datum/powernet/PN = powernets[netnum]
  523. var/datum/powernet/TPN = powernets[M.netnum]
  524.  
  525. PN.merge_powernets(TPN)
  526.  
  527. for(var/obj/machinery/power/apc/N in loc)
  528. if(!N) continue
  529.  
  530. var/obj/machinery/power/M
  531. M = N.terminal
  532. if(!M) continue
  533.  
  534. if(!M.netnum)
  535. if(!netnum)continue
  536. var/datum/powernet/PN = powernets[netnum]
  537. PN.nodes += M
  538. M.netnum = netnum
  539. M.powernet = powernets[M.netnum]
  540. continue
  541.  
  542. var/datum/powernet/PN = powernets[netnum]
  543. var/datum/powernet/TPN = powernets[M.netnum]
  544.  
  545. PN.merge_powernets(TPN)
  546.  
  547. obj/structure/cable/proc/cableColor(var/colorC)
  548. var/color_n = "red"
  549. if(colorC)
  550. color_n = colorC
  551. color = color_n
  552. switch(colorC)
  553. if("red")
  554. icon = 'power_cond_red.dmi'
  555. if("yellow")
  556. icon = 'power_cond_yellow.dmi'
  557. if("green")
  558. icon = 'power_cond_green.dmi'
  559. if("blue")
  560. icon = 'power_cond_blue.dmi'
Advertisement
Add Comment
Please, Sign In to add comment