Files
CHOMPStation2/code/WorkInProgress/computer3/networking.dm
PsiOmega fe126626ac Cleans up radio frequency numbers.
Replaces magic numbers across the code base with proper constants.
Prepares for the ability to have more than one antag channel in the future.
Corrects a lie.
2014-09-18 13:07:34 +02:00

237 lines
6.1 KiB
Plaintext

/obj/item/part/computer/networking
name = "Computer networking component"
/*
This is the public-facing proc used by NETUP.
It does additional checking before and after calling get_machines()
*/
proc/connect_to(var/typekey,var/atom/previous)
if(!computer || computer.stat)
return null
if(istype(previous,typekey) && verify_machine(previous))
return previous
var/result = get_machines(typekey)
if(!result)
return null
if(islist(result))
var/list/R = result
if(R.len == 0)
return null
else if(R.len == 1)
return R[1]
else
var/list/atomlist = computer.format_atomlist(R)
result = input("Select:","Multiple destination machines located",atomlist[1]) as null|anything in atomlist
return atomlist[result]
if(isobj(result))
return result
return null // ?
/*
This one is used to determine the candidate machines.
It may return an object, a list of objects, or null.
Overwite this on any networking component.
*/
proc/get_machines(var/typekey)
return list()
/*
This is used to verify that an existing machine is within the network.
Calling NETUP() with an object argument will run this check, and if
the object is still accessible, it will be used. Otherwise, another
search will be run.
Overwrite this on any networking component.
*/
proc/verify_machine(var/obj/previous)
return 0
/*
Provides radio/signaler functionality, and also
network-connects to anything on the same z-level
which is tuned to the same frequency.
*/
/obj/item/part/computer/networking/radio
name = "Wireless networking component"
desc = "Radio module for computers"
var/datum/radio_frequency/radio_connection = null
var/frequency = PUB_FREQ
var/filter = null
var/range = null
var/subspace = 0
init()
..()
spawn(5)
radio_connection = radio_controller.add_object(src, src.frequency, src.filter)
proc/set_frequency(new_frequency)
if(radio_controller)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, filter)
else
frequency = new_frequency
spawn(rand(5,10))
set_frequency(new_frequency)
receive_signal(var/datum/signal/signal)
if(!signal || !computer || (computer.stat&~MAINT)) // closed laptops use maint, allow it
return
if(computer.program)
computer.program.receive_signal(signal)
proc/post_signal(var/datum/signal/signal)
if(!computer || (computer.stat&~MAINT) || !computer.program) return
if(!radio_connection) return
radio_connection.post_signal(src,signal,filter,range)
get_machines(var/typekey)
if(!radio_connection || !radio_connection.frequency)
return list()
var/list/result = list()
var/turf/T = get_turf(loc)
var/z_level = T.z
for(var/obj/O in radio_connection.devices)
if(istype(O,typekey))
T = get_turf(O)
if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
result |= O
return result
verify_machine(var/obj/previous)
if(!previous) return 0
if(subspace)
return ( radio_connection && (previous in radio_connection.devices) )
else
var/turf/T = get_turf(loc)
var/turf/O = get_turf(previous)
if(!T || !O)
return 0
return ( radio_connection && (previous in radio_connection.devices) && (T.z == O.z))
/*
Subspace networking: Communicates off-station. Allows centcom communications.
*/
/obj/item/part/computer/networking/radio/subspace
name = "subspace networking terminal"
desc = "Communicates long distances and through spatial anomalies."
subspace = 1
/*
APC (/area) networking
*/
/obj/item/part/computer/networking/area
name = "short-wave networking terminal"
desc = "Connects to nearby computers through the area power network"
get_machines(var/typekey)
var/area/A = get_area(loc)
if(!istype(A) || A == /area)
return list()
if(typekey == null)
typekey = /obj/machinery
var/list/machines = list()
for(var/area/area in A.related)
for(var/obj/O in area.contents)
if(istype(O,typekey))
machines |= O
return machines
verify_machine(var/obj/previous)
if(!previous) return 0
var/area/A = get_area(src)
if( A && A == get_area(previous) )
return 1
return 0
/*
Proximity networking: Connects to machines or computers adjacent to this device
*/
/obj/item/part/computer/networking/prox
name = "proximity networking terminal"
desc = "Connects a computer to adjacent machines"
get_machines(var/typekey)
var/turf/T = get_turf(loc)
if(!istype(T))
return list()
if(typekey == null)
typekey = /obj/machinery
var/list/machines = list()
for(var/d in cardinal)
var/turf/T2 = get_step(T,d)
for(var/obj/O in T2)
if(istype(O,typekey))
machines += O
return machines
verify_machine(var/obj/previous)
if(!previous)
return 0
if(get_dist(get_turf(previous),get_turf(loc)) == 1)
return 1
return 0
/*
Cable networking: Not currently used
*/
/obj/item/part/computer/networking/cable
name = "cable networking terminal"
desc = "Connects to other machines on the same cable network."
get_machines(var/typekey)
// if(istype(computer,/obj/machinery/computer/laptop)) // laptops move, this could get breaky
// return list()
var/turf/T = get_turf(loc)
var/datum/powernet/P = null
for(var/obj/structure/cable/C in T)
if(C.d1 == 0)
P = C.powernet
break
if(!P)
return list()
if(!typekey)
typekey = /obj/machinery
else if(typekey == /datum/powernet)
return list(P)
var/list/candidates = list()
for(var/atom/A in P.nodes)
if(istype(A,typekey))
candidates += A
else if(istype(A,/obj/machinery/power/terminal))
var/obj/machinery/power/terminal/PT = A
if(istype(PT.master,typekey))
candidates += PT.master
return candidates
verify_machine(var/obj/previous)
if(!previous)
return 0
var/turf/T = get_turf(loc)
var/datum/powernet/P = null
for(var/obj/structure/cable/C in T)
if(C.d1 == 0)
P = C.powernet
break
if(istype(previous,/datum/powernet))
if(previous == P)
return 1
return 0
T = get_turf(previous.loc)
for(var/obj/structure/cable/C in T)
if(C.d1 == 0 && (C.powernet == P))
return 1
return 0