diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 5ef7ee6f952..6d43cfe3812 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -71,6 +71,10 @@
dat += "
"
dat += {"[A.control_disabled ? "Enable" : "Disable"] Wireless Activity"}
dat += "
"
+ dat += "Subspace Transceiver is: [A.radio.disabledAi ? "Disabled" : "Enabled"]"
+ dat += "
"
+ dat += {"[A.radio.disabledAi ? "Enable" : "Disable"] Subspace Transceiver"}
+ dat += "
"
dat += {" Close"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
@@ -110,6 +114,12 @@
sleep(10)
flush = 0
+ if ("Radio")
+ for(var/mob/living/silicon/ai/A in src)
+ A.radio.disabledAi = !A.radio.disabledAi
+ A << "Your Subspace Transceiver has been: [A.radio.disabledAi ? "disabled" : "enabled"]"
+ U << "You [A.radio.disabledAi ? "Disable" : "Enable"] the AI's Subspace Transceiver"
+
if ("Wireless")
for(var/mob/living/silicon/ai/A in src)
A.control_disabled = !A.control_disabled
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 1300eb5933b..3b21358bccb 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -131,3 +131,9 @@
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1)
+
+/obj/item/device/encryptionkey/heads/ai_integrated //ported from bay, this goes 'inside' the AI.
+ name = "AI Integrated Encryption Key"
+ desc = "Integrated encryption key"
+ icon_state = "cap_cypherkey"
+ channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index f8b908264d9..71f737fd42d 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -20,7 +20,10 @@
keyslot1 = new /obj/item/device/encryptionkey/
recalculateChannels()
-/obj/item/device/radio/headset/receive_range(freq, level)
+
+/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
+ if(aiOverride)
+ return ..(freq, level)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
if(H.l_ear == src || H.r_ear == src)
@@ -164,6 +167,21 @@
freerange = 1
keyslot2 = new /obj/item/device/encryptionkey/ert
+//The below was ported from Baystation.
+/obj/item/device/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway.
+ name = "AI Subspace Transceiver"
+ desc = "Integrated AI radio transceiver."
+ icon_state = "ai_radio"
+ item_state = "headset"
+ keyslot2 = new /obj/item/device/encryptionkey/heads/ai_integrated
+ var/myAi = null // Atlantis: Reference back to the AI which has this radio.
+ var/disabledAi = 0 // Atlantis: Used to manually disable AI's integrated radio via intellicard menu.
+
+/obj/item/device/radio/headset/heads/ai_integrated/receive_range(freq, level)
+ if(disabledAi)
+ return -1 //Transciever Disabled.
+ return ..(freq, level, 1)
+
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
@@ -268,4 +286,4 @@
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9a516e538f6..02fc30278a8 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -146,6 +146,7 @@ var/list/department_radio_keys = list(
var/italics = 0
var/message_range = null
var/message_mode = null
+
var/datum/language/speaking = null //For use if a specific language is being spoken.
var/braindam = getBrainLoss()
@@ -178,7 +179,7 @@ var/list/department_radio_keys = list(
message_mode = department_radio_keys[channel_prefix]
if (message_mode || speaking || copytext(message,1,2) == ":")
message = trim(copytext(message, 3))
- if (!(istype(src,/mob/living/carbon/human) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels))))
+ if (!(istype(src,/mob/living/carbon/human) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || isAI(src) && (message_mode=="department") || (message_mode in radiochannels))))
message_mode = null //only humans can use headsets
if(src.stunned > 2 || (traumatic_shock > 61 && prob(50)))
@@ -284,7 +285,6 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
-
if("changeling")
if(mind && mind.changeling)
log_say("[key_name(src)] ([mind.changeling.changelingID]): [message]")
@@ -301,12 +301,18 @@ var/list/department_radio_keys = list(
if(C:l_ear) devices += C:l_ear
if(C:r_ear) devices += C:r_ear
if(issilicon(src))
- var/mob/living/silicon/Ro=src
- if(!isAI(Ro))
- if(Ro:radio)
- devices += Ro:radio
+ if(isAI(src))//for the AI's radio. This can't be with the borg thing above due to typecasting.
+ var/mob/living/silicon/ai/A = src
+ if(A.radio)
+ A.radio.talk_into(src, message, message_mode)
+ used_radios += A.radio
else
- warning("[src] has no radio!")
+ var/mob/living/silicon/Ro=src
+ if(!isAI(Ro))
+ if(Ro:radio)
+ devices += Ro:radio
+ else
+ warning("[src] has no radio!")
message_range = 1
italics = 1
if(devices.len>0)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 6b0f903c41d..a325090c828 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -33,7 +33,8 @@ var/list/ai_list = list()
var/obj/item/device/multitool/aiMulti = null
var/custom_sprite = 0 //For our custom sprites
var/alienAI = 0
-//Hud stuff
+
+ var/obj/item/device/radio/headset/heads/ai_integrated/radio = null
//MALFUNCTION
var/datum/module_picker/malf_picker
@@ -90,11 +91,13 @@ var/list/ai_list = list()
aiPDA.name = name + " (" + aiPDA.ownjob + ")"
aiMulti = new(src)
+ radio = new(src)
+ radio.myAi = src
if (istype(loc, /turf))
verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
- /mob/living/silicon/ai/proc/toggle_camera_light)
+ /mob/living/silicon/ai/proc/toggle_camera_light, /mob/living/silicon/ai/proc/control_integrateed_radio)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
@@ -778,4 +781,14 @@ var/list/ai_list = list()
anchored = 1
return
else
- return ..()
+ return ..()
+
+
+/mob/living/silicon/ai/proc/control_integrateed_radio()
+ set name = "Radio Settings"
+ set desc = "Allows you to change settings of your radio."
+ set category = "AI Commands"
+
+ src << "Accessing Subspace Transceiver control..."
+ if (src.radio)
+ src.radio.interact(src)