mirror of
https://github.com/goonstation/goonstation-2020.git
synced 2026-07-11 07:02:20 +01:00
201 lines
5.2 KiB
Plaintext
201 lines
5.2 KiB
Plaintext
/*
|
|
Special frequency list:
|
|
On the map:
|
|
1149 for PDA messaging
|
|
1433 for hydroponics alerts
|
|
1435 for status displays
|
|
1437 for atmospherics/fire alerts
|
|
1445 for bot nav beacons
|
|
1447 for mulebot control
|
|
1449 for airlock controls
|
|
1453 for engineering access
|
|
1457 for door access request
|
|
1475 for Mail chute location
|
|
1359 for security headsets
|
|
1357 for engineering headsets
|
|
1354 for research headsets
|
|
1356 for medical headsets
|
|
1352 for syndicate headsets
|
|
*/
|
|
|
|
//moved transmission type defines to _setup.dm
|
|
|
|
var/global/datum/controller/radio/radio_controller
|
|
|
|
datum/controller/radio
|
|
var/list/datum/radio_frequency/frequencies = list()
|
|
var/list/active_jammers = list()
|
|
|
|
proc/add_object(obj/device, new_frequency)
|
|
var/datum/radio_frequency/frequency = frequencies[new_frequency]
|
|
|
|
if(!frequency)
|
|
frequency = new
|
|
frequency.frequency = new_frequency
|
|
frequencies[new_frequency] = frequency
|
|
|
|
if( !frequency.devices.Find(device) )
|
|
frequency.devices += device
|
|
return frequency
|
|
|
|
proc/remove_object(obj/device, old_frequency)
|
|
var/datum/radio_frequency/frequency = frequencies[old_frequency]
|
|
|
|
if(frequency)
|
|
frequency.devices -= device
|
|
|
|
if(frequency.devices.len < 1)
|
|
qdel(frequency)
|
|
frequencies -= old_frequency
|
|
|
|
return 1
|
|
|
|
proc/return_frequency(frequency)
|
|
return frequencies[frequency]
|
|
|
|
/*
|
|
mob/verb/listfreq()
|
|
boutput(world, "<span style=\"color:blue\">registered devices:</span>")
|
|
for(var/fn in radio_controller.frequencies)
|
|
var/datum/radio_frequency/f = radio_controller.return_frequency(fn)
|
|
boutput(world, "<span style=\"color:blue\">[fn]</span>")
|
|
for(var/obj/o in f.devices)
|
|
boutput(world, "<span style=\"color:blue\">>[o]</span>")
|
|
boutput(world, "<span style=\"color:blue\">end</span>")
|
|
*/
|
|
|
|
|
|
var/global/list/datum/signal/reusable_signals = list()
|
|
proc/get_free_signal()
|
|
if (reusable_signals && reusable_signals.len)
|
|
while (. == null && reusable_signals.len)
|
|
. = reusable_signals[reusable_signals.len]
|
|
reusable_signals.len--
|
|
if (. == null)
|
|
return new /datum/signal ()
|
|
else
|
|
return new /datum/signal ()
|
|
|
|
datum/radio_frequency
|
|
var/frequency
|
|
var/list/obj/devices = list()
|
|
|
|
//MBC : check_for_jammer proc was being called thousands of times per second. Do its initial check in a define instead, because proc call overhead. Then call check_for_jammer_bare
|
|
#define can_check_jammer (!prob(signal_loss) && radio_controller.active_jammers.len)
|
|
|
|
disposing()
|
|
devices = null
|
|
..()
|
|
|
|
proc
|
|
post_signal(obj/source, datum/signal/signal, range)
|
|
var/turf/start_point
|
|
if(range)
|
|
start_point = get_turf(source)
|
|
if(!start_point)
|
|
if (reusable_signals && reusable_signals.len && !(signal in reusable_signals))
|
|
signal.dispose()
|
|
else if (signal)
|
|
signal.wipe()
|
|
reusable_signals += signal
|
|
return 0
|
|
|
|
if (check_for_jammer(source))
|
|
return 0
|
|
|
|
signal.channels_passed += "[src.frequency];"
|
|
|
|
for(var/obj/device in devices)
|
|
if(device != source)
|
|
|
|
//MBC : Do checks here and call check_for_jammer_bare instead. reduces proc calls.
|
|
if (can_check_jammer)
|
|
if (check_for_jammer_bare(device))
|
|
continue
|
|
|
|
if(range)
|
|
var/turf/end_point = get_turf(device)
|
|
if(end_point)
|
|
if(start_point.z != end_point.z) continue
|
|
if(max(abs(start_point.x-end_point.x), abs(start_point.y-end_point.y)) <= range)
|
|
|
|
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
|
|
else
|
|
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
|
|
|
|
LAGCHECK(LAG_REALTIME)
|
|
|
|
if (!reusable_signals || reusable_signals.len > 10)
|
|
signal.dispose()
|
|
else if (signal)
|
|
signal.wipe()
|
|
if (!(signal in reusable_signals))
|
|
reusable_signals += signal
|
|
LAGCHECK(LAG_MED)
|
|
|
|
check_for_jammer(obj/source)
|
|
.= 0
|
|
if (prob(signal_loss))
|
|
.= 1
|
|
else
|
|
if (radio_controller.active_jammers.len)
|
|
for (var/atom in radio_controller.active_jammers) // Can be a mob or obj.
|
|
var/atom/A = atom
|
|
if (A && get_dist(get_turf(source), get_turf(A)) <= 6)
|
|
.= 1
|
|
|
|
check_for_jammer_bare(obj/source)
|
|
.= 0
|
|
for (var/atom in radio_controller.active_jammers) // Can be a mob or obj.
|
|
var/atom/A = atom
|
|
if (A && get_dist(get_turf(source), get_turf(A)) <= 6)
|
|
.= 1
|
|
|
|
obj/proc
|
|
receive_signal(datum/signal/signal, receive_method, receive_param)
|
|
return null
|
|
|
|
datum/signal
|
|
var/obj/source
|
|
var/channels_passed = "" //Param-like list of frequencies this signal has been on, for transponders and stuff.
|
|
|
|
var/transmission_method = 0
|
|
//0 = wire
|
|
//1 = radio transmission
|
|
|
|
var/data = list()
|
|
var/encryption
|
|
//We can carry a computer file around, why not.
|
|
var/datum/computer/file/data_file
|
|
|
|
proc/copy_from(datum/signal/model)
|
|
source = model.source
|
|
transmission_method = model.transmission_method
|
|
data = model.data
|
|
encryption = model.encryption
|
|
|
|
proc/wipe()
|
|
source = null
|
|
channels_passed = ""
|
|
data = list()
|
|
encryption = null
|
|
if (data_file)
|
|
data_file.dispose()
|
|
data_file = null
|
|
return
|
|
|
|
disposing()
|
|
if(src.data_file)
|
|
src.data_file.dispose()
|
|
|
|
if (reusable_signals)
|
|
reusable_signals -= null
|
|
..()
|
|
|
|
|
|
// debuggging
|
|
proc/show()
|
|
boutput(world, "signal from \ref[source][source] on [channels_passed]")
|
|
for(var/key in data)
|
|
boutput(world, "[key]=[data[key]]")
|
|
boutput(world, "end of signal") |