mirror of
https://github.com/goonstation/goonstation-2020.git
synced 2026-07-10 22:52:21 +01:00
370 lines
9.6 KiB
Plaintext
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 |