/atom/proc/electrocute(mob/user, prb, netnum, var/ignore_gloves) if(!prob(prb)) return 0 if(!netnum) // unconnected cable is unpowered return 0 var/datum/powernet/PN if(powernets && powernets.len >= netnum) PN = powernets[netnum] var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, src) s.start() return user.shock(src, PN ? PN.avail : 0, user.hand == 1 ? "l_arm": "r_arm", 1, ignore_gloves ? 1 : 0) // attach a wire to a power machine - leads from the turf you are standing on /obj/machinery/power/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/cable_coil)) var/obj/item/cable_coil/coil = W var/turf/T = user.loc if(T.intact || !istype(T, /turf/simulated/floor)) return if(get_dist(src, user) > 1) return if(!directwired) // only for attaching to directwired machines return var/dirn = get_dir(user, src) for(var/obj/cable/LC in T) if(LC.d1 == dirn || LC.d2 == dirn) boutput(user, "There's already a cable at that position.") return var/obj/cable/NC = new(T, coil) NC.d1 = 0 NC.d2 = dirn NC.iconmod = coil.iconmod NC.add_fingerprint() NC.updateicon() NC.update_network() coil.use(1) return else ..() return // the power cable object /obj/cable level = 1 anchored =1 var/netnum = 0 name = "power cable" desc = "A flexible power cable." icon = 'icons/obj/power_cond.dmi' icon_state = "0-1" var/d1 = 0 var/d2 = 1 var/iconmod = null //var/image/cableimg = null //^ is unnecessary, i think layer = CABLE_LAYER color = "#DD0000" var/insulator_default = "synthrubber" var/condcutor_default = "copper" var/datum/material/insulator = null var/datum/material/conductor = null conduit name = "power conduit" desc = "A rigid assembly of superconducting power lines." icon_state = "conduit" /obj/cable/reinforced name = "reinforced power cable" desc = "A flexible yet extremely thick power cable. How paradoxical." icon_state = "0-1-thick" iconmod = "-thick" color = "#075C90" condcutor_default = "pharosium" insulator_default = "synthblubber" //same as normal cables but you have to click them multiple cuts heheheh var/static/cuts_required = 3 var/cuts = 0 get_desc(dist, mob/user) if(dist < 4 && cuts) .= "
" + "The cable looks partially cut." cut(mob/user,turf/T) cuts++ shock(user, 50) var/num = "first" if (cuts == 2) num = "second" if (cuts == 3) num = "third" if (cuts == 4) num = "fourth" if (cuts == 5) num = "fifth" src.visible_message("[user] cuts through the [num] section of [src].") if (cuts >= cuts_required) ..() else playsound(src.loc, "sound/items/Wirecutter.ogg", 50, 1) /obj/cable/New(var/newloc, var/obj/item/cable_coil/source) ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable d1 = text2num( icon_state ) d2 = text2num( copytext( icon_state, findtext(icon_state, "-")+1 ) ) if (source) src.iconmod = source.iconmod var/turf/T = src.loc // hide if turf is not intact // but show if in space if(istype(T, /turf/space) && !istype(T,/turf/space/fluid)) hide(0) else if(level==1) hide(T.intact) //cableimg = image(src.icon, src.loc, src.icon_state) //cableimg.layer = OBJ_LAYER if (istype(source)) applyCableMaterials(src, source.insulator, source.conductor) else applyCableMaterials(src, getMaterial(insulator_default), getMaterial(condcutor_default)) allcables += src /obj/cable/disposing() // called when a cable is deleted if(!defer_powernet_rebuild) // set if network will be rebuilt manually if(netnum && powernets && powernets.len >= netnum) // make sure cable & powernet data is valid var/datum/powernet/PN = powernets[netnum] PN.cut_cable(src) // updated the powernets else if(Debug) diary << "Defered cable deletion at [x],[y]: #[netnum]" defer_powernet_rebuild = 2 if(netnum && powernets && powernets.len >= netnum) //NEED FOR CLEAN GC IN EXPLOSIONS powernets[netnum].cables -= src insulator.owner = null conductor.owner = null allcables -= src ..() // then go ahead and delete the cable /obj/cable/hide(var/i) if(level == 1)// && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 updateicon() /obj/cable/proc/updateicon() icon_state = "[d1]-[d2][iconmod]" alpha = invisibility ? 128 : 255 //if (cableimg) // cableimg.icon_state = icon_state // cableimg.alpha = invisibility ? 128 : 255 // returns the powernet this cable belongs to /obj/cable/proc/get_powernet() var/datum/powernet/PN // find the powernet if(netnum && powernets && powernets.len >= netnum) PN = powernets[netnum] return PN /obj/cable/proc/cut(mob/user,turf/T) if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long var/atom/A = new/obj/item/cable_coil(T, 2) applyCableMaterials(A, src.insulator, src.conductor) if (src.iconmod) var/obj/item/cable_coil/C = A C.iconmod = src.iconmod C.updateicon() else var/atom/A = new/obj/item/cable_coil(T, 1) applyCableMaterials(A, src.insulator, src.conductor) if (src.iconmod) var/obj/item/cable_coil/C = A C.iconmod = src.iconmod C.updateicon() src.visible_message("[user] cuts the cable.") src.log_wirelaying(user, 1) shock(user, 50) defer_powernet_rebuild = 0 // to fix no-action bug qdel(src) return /obj/cable/attackby(obj/item/W, mob/user) var/turf/T = src.loc if (T.intact) return if (issnippingtool(W)) src.cut(user,T) return // not needed, but for clarity else if (istype(W, /obj/item/cable_coil)) var/obj/item/cable_coil/coil = W coil.cable_join(src, user) //note do shock in cable_join else if (istype(W, /obj/item/device/t_scanner) || ispulsingtool(W) || (istype(W, /obj/item/device/pda2) && istype(W:module, /obj/item/device/pda_module/tray))) var/datum/powernet/PN = get_powernet() // find the powernet if(PN && (PN.avail > 0)) // is it powered? boutput(user, "[PN.avail]W in power network.") else boutput(user, "The cable is not powered.") if(prob(40)) shock(user, 10) else shock(user, 10) src.add_fingerprint(user) // shock the user with probability prb /obj/cable/proc/shock(mob/user, prb) if(!netnum) // unconnected cable is unpowered return 0 return src.electrocute(user, prb, netnum) /obj/cable/ex_act(severity) switch (severity) if (1) qdel(src) if (2) if (prob(15)) var/atom/A = new/obj/item/cable_coil(src.loc, src.d1 ? 2 : 1) applyCableMaterials(A, src.insulator, src.conductor) qdel(src) /obj/cable/reinforced/ex_act(severity) return //nah switch (severity) if (3) if (prob(15)) var/atom/A = new/obj/item/cable_coil(src.loc, src.d1 ? 2 : 1) applyCableMaterials(A, src.insulator, src.conductor) qdel(src) // called when a new cable is created // can be 1 of 3 outcomes: // 1. Isolated cable (or only connects to isolated machine) -> create new powernet // 2. Joins to end or bridges loop of a single network (may also connect isolated machine) -> add to old network // 3. Bridges gap between 2 networks -> merge the networks (must rebuild lists also) (currently just calls makepowernets. welp) /obj/cable/proc/update_network() var/turf/T = get_turf(src) var/obj/cable/cable_d1 = null //locate() in (d1 ? get_step(src,d1) : orange(0, src) ) var/obj/cable/cable_d2 = null //locate() in (d2 ? get_step(src,d2) : orange(0, src) ) var/obj/machinery/power/terminal/PT = null // Terminal connections aren't always restored when laying wires...and I can't be bothered // to dive into the powernet code to avoid an additional makepowernets() call. Sorry. if (T && isturf(T)) for (var/obj/machinery/power/terminal/t_check in T.contents) PT = t_check break var/flip_d1 = d1 ? turn(d1, 180) : 0 for (var/obj/cable/new_cable_d1 in (d1 ? get_step(src, d1) : orange(0, src) )) if (new_cable_d1.d1 != flip_d1 && new_cable_d1.d2 != flip_d1) continue cable_d1 = new_cable_d1 break var/flip_d2 = d2 ? turn(d2, 180) : 0 for (var/obj/cable/new_cable_d2 in (d2 ? get_step(src, d2) : orange(0, src) )) if (new_cable_d2.d1 != flip_d2 && new_cable_d2.d2 != flip_d2) continue cable_d2 = new_cable_d2 break if (cable_d1 && cable_d2) if (cable_d1.netnum == cable_d2.netnum && powernets[cable_d1.netnum]) var/datum/powernet/PN = powernets[cable_d1.netnum] PN.cables += src src.netnum = cable_d1.netnum if (PT && istype(PT)) return makepowernets() else return return makepowernets() //ugh :( else if (!cable_d1 && !cable_d2) var/datum/powernet/PN = new() powernets += PN PN.number = powernets.len src.netnum = powernets.len if (PT && istype(PT)) return makepowernets() else return else if (cable_d1) var/datum/powernet/PN = powernets[cable_d1.netnum] PN.cables += src src.netnum = cable_d1.netnum if (PT && istype(PT)) return makepowernets() else return else var/datum/powernet/PN = powernets[cable_d2.netnum] PN.cables += src src.netnum = cable_d2.netnum if (PT && istype(PT)) return makepowernets() else return //powernets are really in need of a renovation. makepowernets() is called way too much and is really intensive on the server ok. // Some non-traitors love to hotwire the engine (Convair880). /obj/cable/proc/log_wirelaying(var/mob/user, var/cut = 0) if (!src || !istype(src) || !user || !ismob(user)) return var/powered = 0 var/datum/powernet/PN = src.get_powernet() if (PN && istype(PN) && (PN.avail > 0)) powered = 1 logTheThing("station", user, null, "[cut == 0 ? "lays" : "cuts"] a cable[powered == 1 ? " (powered when [cut == 0 ? "connected" : "cut"])" : ""] at [log_loc(src)].") return