/datum/radio_frequency var/frequency as num var/list/obj/devices = list() /datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, filter = null as text|null, range = null as num|null) var/turf/start_point if(range) start_point = get_turf(source) if(!start_point) qdel(signal) return 0 if(filter) send_to_filter(source, signal, filter, start_point, range) send_to_filter(source, signal, RADIO_DEFAULT, start_point, range) else //Broadcast the signal to everyone! for(var/next_filter in devices) send_to_filter(source, signal, next_filter, start_point, range) //Sends a signal to all machines belonging to a given filter. Should be called by post_signal() /datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, filter, turf/start_point = null, range = null) if(range && !start_point) return for(var/obj/device in devices[filter]) if(device == source) continue if(range) var/turf/end_point = get_turf(device) if(!end_point) continue if(start_point.z!=end_point.z || get_dist(start_point, end_point) > range) continue device.receive_signal(signal, TRANSMISSION_RADIO, frequency) /datum/radio_frequency/proc/add_listener(obj/device as obj, filter as text|null) if(!filter) filter = RADIO_DEFAULT //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]") var/list/obj/devices_line = devices[filter] if(!devices_line) devices_line = new devices[filter] = devices_line if(device in devices[filter]) return devices_line += device // var/list/obj/devices_line___ = devices[filter_str] // var/l = devices_line___.len //log_admin("DEBUG: devices_line.len=[devices_line.len]") //log_admin("DEBUG: devices(filter_str).len=[l]") /datum/radio_frequency/proc/remove_listener(obj/device) for(var/devices_filter in devices) var/list/devices_line = devices[devices_filter] devices_line-=device while(null in devices_line) devices_line -= null if(devices_line.len==0) devices -= devices_filter qdel(devices_line) /datum/signal var/obj/source var/transmission_method = 0 //unused at the moment //0 = wire //1 = radio transmission //2 = subspace transmission var/list/data = list() var/encryption var/frequency = 0 /datum/signal/proc/copy_from(datum/signal/model) source = model.source transmission_method = model.transmission_method data = model.data encryption = model.encryption frequency = model.frequency /datum/signal/proc/debug_print() if(source) . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" else . = "signal = {source = '[source]' ()\n" for(var/i in data) . += "data\[\"[i]\"\] = \"[data[i]]\"\n" if(islist(data[i])) var/list/L = data[i] for(var/t in L) . += "data\[\"[i]\"\] list has: [t]" /datum/signal/proc/get_race(mob/M) if(ishuman(M)) var/mob/living/carbon/human/H = M . = H.dna.species.name else if(isbrain(M)) var/mob/living/brain/B = M . = B.get_race() else if(issilicon(M)) . = "Artificial Life" else if(isslime(M)) . = "Slime" else if(isbot(M)) . = "Bot" else if(isanimal(M)) . = "Domestic Animal" else . = "Unidentifiable" //callback used by objects to react to incoming radio signals /obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return null