diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index 81b9b0d61c8..380c5f8e634 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -1,3 +1,20 @@
+var/global/list/radio_channels_by_freq = list(
+ num2text(PUB_FREQ) = "Common",
+ num2text(AI_FREQ) = "AI Private",
+ num2text(ENT_FREQ) = "Entertainment",
+ num2text(ERT_FREQ) = "Response Team",
+ num2text(COMM_FREQ)= "Command",
+ num2text(ENG_FREQ) = "Engineering",
+ num2text(MED_FREQ) = "Medical",
+ num2text(MED_I_FREQ)="Medical(I)",
+ num2text(SEC_FREQ) = "Security",
+ num2text(SEC_I_FREQ)="Security(I)",
+ num2text(SCI_FREQ) = "Science",
+ num2text(SUP_FREQ) = "Supply",
+ num2text(SRV_FREQ) = "Service",
+ num2text(EXP_FREQ) = "Explorer"
+ )
+
GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard
@@ -11,7 +28,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
show_messages = 0
preserve_item = 1
- var/obj/item/device/radio/radio
+ var/obj/item/device/radio/borg/pai/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/image/screen_layer
@@ -42,10 +59,16 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
if(pai != null) //Have a person in them already?
return ..()
- var/choice = tgui_alert(user, "You sure you want to inhabit this PAI?", "Confirmation", list("Yes", "No"))
- if(choice == "No")
- return ..()
+ if(jobban_isbanned(usr, "pAI"))
+ to_chat(usr,"You cannot join a pAI card when you are banned from playing as a pAI.")
+ return
+ var/choice = tgui_alert(user, "You sure you want to inhabit this PAI, or submit yourself to being recruited?", "Confirmation", list("Inhabit", "Recruit", "Cancel"))
+ if(choice == "Cancel")
+ return ..()
+ if(choice == "Recruit")
+ paiController.recruitWindow(user)
+ return ..()
choice = tgui_alert(user, "Do you want to load your pAI data?", "Load", list("Yes", "No"))
var/actual_pai_name
var/turf/location = get_turf(src)
@@ -447,6 +470,34 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
if(user)
to_chat(user, span_notice("You eject the card from \the [initial(src.name)]."))
+///////////////////////////////
+//////////pAI Radios//////////
+///////////////////////////////
+//Thanks heroman!
+
+/obj/item/device/radio/borg/pai
+ name = "integrated radio"
+ icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component.
+ icon_state = "radio"
+ loudspeaker = FALSE
+
+/obj/item/device/radio/borg/pai/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ return
+
+/obj/item/device/radio/borg/pai/recalculateChannels()
+ if(!istype(loc,/obj/item/device/paicard))
+ return
+ var/obj/item/device/paicard/card = loc
+ secure_radio_connections = list()
+ channels = list()
+
+ for(var/internal_chan in internal_channels)
+ var/ch_name = radio_channels_by_freq[internal_chan]
+ if(has_channel_access(card.pai, internal_chan))
+ channels += ch_name
+ channels[ch_name] = 1
+ secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
+
/obj/item/device/paicard/typeb
name = "personal AI device"
icon = 'icons/obj/paicard.dmi'
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index d786f54e248..128ad94629d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -978,7 +978,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
+ if(jobban_isbanned(usr, "pAI"))
+ to_chat(usr,"You cannot alert pAI cards when you are banned from playing as a pAI.")
+ return
+
if(usr.client.prefs?.be_special & BE_PAI)
+ var/choice = tgui_alert(usr, "Would you like to submit yourself to the recruitment list too?", "Confirmation", list("No", "Yes"))
+ if(choice == "Yes")
+ paiController.recruitWindow(usr)
var/count = 0
for(var/obj/item/device/paicard/p in all_pai_cards)
var/obj/item/device/paicard/PP = p
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index e007e0aa44f..aa816bac0ef 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -22,7 +22,7 @@
var/list/software = list()
var/userDNA // The DNA string of our assigned user
var/obj/item/device/paicard/card // The card we inhabit
- var/obj/item/device/radio/radio // Our primary radio
+ var/obj/item/device/radio/borg/pai/radio // Our primary radio
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
var/chassis = "pai-repairbot" // A record of your chosen chassis.
@@ -112,7 +112,7 @@
communicator = new(src)
if(card)
if(!card.radio)
- card.radio = new /obj/item/device/radio(src.card)
+ card.radio = new /obj/item/device/radio/borg/pai(src.card)
radio = card.radio
//Default languages without universal translator software
@@ -135,7 +135,7 @@
var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger)
if(M)
- M.toff = TRUE
+ M.toff = FALSE
..()
/mob/living/silicon/pai/Login()
@@ -144,7 +144,6 @@
if (client.prefs)
ooc_notes = client.prefs.metadata
-
// this function shows the information about being silenced as a pAI in the Status panel
/mob/living/silicon/pai/proc/show_silenced()
if(src.silence_time)
@@ -403,12 +402,14 @@
M.drop_from_inventory(H)
H.loc = get_turf(src)
src.loc = get_turf(H)
-
- // Move us into the card and move the card to the ground.
- src.loc = card
- card.loc = get_turf(card)
- src.forceMove(card)
- card.forceMove(card.loc)
+
+ if(isbelly(loc)) //If in tumby, when fold up, card go into tumby
+ var/obj/belly/B = loc
+ src.forceMove(card)
+ card.forceMove(B)
+ else //Otherwise go on floor
+ src.forceMove(card)
+ card.forceMove(get_turf(card))
canmove = 1
resting = 0
icon_state = "[chassis]"
@@ -441,11 +442,15 @@
idcard.access |= ID.access
to_chat(user, "You add the access from the [W] to [src].")
to_chat(src, "\The [user] swipes the [W] over you. You copy the access codes.")
+ if(radio)
+ radio.recalculateChannels()
return
if("Remove Access")
idcard.access = list()
to_chat(user, "You remove the access from [src].")
to_chat(src, "\The [user] swipes the [W] over you, removing access codes from you.")
+ if(radio)
+ radio.recalculateChannels()
return
if("Cancel")
return