Files
2020-02-16 19:40:21 -08:00

370 lines
9.6 KiB
Plaintext

/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)
.= "<br>" + "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("<span style=\"color:red\">[user] cuts through the [num] section of [src].</span>")
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("<span style=\"color:red\">[user] cuts the cable.</span>")
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, "<span style=\"color:red\">[PN.avail]W in power network.</span>")
else
boutput(user, "<span style=\"color:red\">The cable is not powered.</span>")
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