/obj/item/paicard name = "personal AI device" icon = 'icons/obj/aicards.dmi' icon_state = "pai" inhand_icon_state = "electronic" worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT var/mob/living/silicon/pai/pai resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE /obj/item/paicard/suicide_act(mob/living/user) user.visible_message("[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!") return OXYLOSS /obj/item/paicard/Initialize() SSpai.pai_card_list += src add_overlay("pai-off") return ..() /obj/item/paicard/Destroy() //Will stop people throwing friend pAIs into the singularity so they can respawn SSpai.pai_card_list -= src if (!QDELETED(pai)) QDEL_NULL(pai) return ..() /obj/item/paicard/attack_self(mob/user) if (!in_range(src, user)) return user.set_machine(src) var/dat = "Personal AI Device
" if(pai) if(!pai.master_dna || !pai.master) dat += "Imprint Master DNA
" dat += "Installed Personality: [pai.name]
" dat += "Prime directive:
[pai.laws.zeroth]
" for(var/slaws in pai.laws.supplied) dat += "Additional directives:
[slaws]
" dat += "Configure Directives
" dat += "
" dat += "

Device Settings


" if(pai.radio) dat += "Radio Uplink
" dat += "Transmit: \[[pai.can_transmit? "Disable" : "Enable"] Radio Transmission\]
" dat += "Receive: \[[pai.can_receive? "Disable" : "Enable"] Radio Reception\]
" else dat += "Radio Uplink
" dat += "Radio firmware not loaded. Please install a pAI personality to load firmware.
" if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.real_name == pai.master || H.dna.unique_enzymes == pai.master_dna) dat += "\[[pai.canholo? "Disable" : "Enable"] holomatrix projectors\]
" dat += "\[Reset speech synthesis module\]
" dat += "\[Wipe current pAI personality\]
" else dat += "No personality installed.
" dat += "Searching for a personality... Press view available personalities to notify potential candidates." dat += "\[View available personalities\]
" user << browse(dat, "window=paicard") onclose(user, "paicard") return /obj/item/paicard/Topic(href, href_list) if(!usr || usr.stat) return if(href_list["request"]) SSpai.findPAI(src, usr) if(pai) if(!(loc == usr)) return if(href_list["setdna"]) if(pai.master_dna) return if(!iscarbon(usr)) to_chat(usr, "You don't have any DNA, or your DNA is incompatible with this device!") else var/mob/living/carbon/M = usr pai.master = M.real_name pai.master_dna = M.dna.unique_enzymes to_chat(pai, "You have been bound to a new master.") pai.emittersemicd = FALSE if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") if(confirm == "Yes") if(pai) to_chat(pai, "You feel yourself slipping away from reality.") to_chat(pai, "Byte by byte you lose your sense of self.") to_chat(pai, "Your mental faculties leave you.") to_chat(pai, "oblivion... ") qdel(pai) if(href_list["fix_speech"]) pai.stuttering = 0 pai.slurring = 0 pai.derpspeech = 0 if(href_list["toggle_transmit"] || href_list["toggle_receive"]) var/transmitting = href_list["toggle_transmit"] //it can't be both so if we know it's not transmitting it must be receiving. var/transmit_holder = (transmitting ? WIRE_TX : WIRE_RX) if(transmitting) pai.can_transmit = !pai.can_transmit else //receiving pai.can_receive = !pai.can_receive pai.radio.wires.cut(transmit_holder)//wires.cut toggles cut and uncut states transmit_holder = (transmitting ? pai.can_transmit : pai.can_receive) //recycling can be fun! to_chat(usr,"You [transmit_holder ? "enable" : "disable"] your pAI's [transmitting ? "outgoing" : "incoming"] radio transmissions!") to_chat(pai,"Your owner has [transmit_holder ? "enabled" : "disabled"] your [transmitting ? "outgoing" : "incoming"] radio transmissions!") if(href_list["setlaws"]) var/newlaws = stripped_multiline_input(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1], MAX_MESSAGE_LEN) if(newlaws && pai) pai.add_supplied_law(0,newlaws) if(href_list["toggle_holo"]) if(pai.canholo) to_chat(pai, "Your owner has disabled your holomatrix projectors!") pai.canholo = FALSE to_chat(usr, "You disable your pAI's holomatrix!") else to_chat(pai, "Your owner has enabled your holomatrix projectors!") pai.canholo = TRUE to_chat(usr, "You enable your pAI's holomatrix!") attack_self(usr) // WIRE_SIGNAL = 1 // WIRE_RECEIVE = 2 // WIRE_TRANSMIT = 4 /obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality) src.pai = personality src.add_overlay("pai-null") playsound(loc, 'sound/effects/pai_boot.ogg', 50, TRUE, -1) audible_message("\The [src] plays a cheerful startup noise!") /obj/item/paicard/proc/setEmotion(emotion) if(pai) src.cut_overlays() switch(emotion) if(1) src.add_overlay("pai-happy") if(2) src.add_overlay("pai-cat") if(3) src.add_overlay("pai-extremely-happy") if(4) src.add_overlay("pai-face") if(5) src.add_overlay("pai-laugh") if(6) src.add_overlay("pai-off") if(7) src.add_overlay("pai-sad") if(8) src.add_overlay("pai-angry") if(9) src.add_overlay("pai-what") if(10) src.add_overlay("pai-null") if(11) src.add_overlay("pai-sunglasses") /obj/item/paicard/proc/alertUpdate() audible_message("[src] flashes a message across its screen, \"Additional personalities available for download.\"", "[src] vibrates with an alert.") /obj/item/paicard/emp_act(severity) . = ..() if (. & EMP_PROTECT_SELF) return if(pai && !pai.holoform) pai.emp_act(severity)