/mob/living/silicon/say(var/message, var/sanitize = 1, var/whispering = 0) return ..((sanitize ? sanitize(message) : message), whispering = whispering) /mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) log_say(message, src) /mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) ..() if(message_mode) if(!is_component_functioning("radio")) src << "Your radio isn't functional at this time." return 0 if(message_mode == "general") message_mode = null return radio.talk_into(src,message,message_mode,verb,speaking) /mob/living/silicon/speech_bubble_appearance() return "synthetic" /mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) ..() if(message_mode == "department") return holopad_talk(message, verb, speaking) else if(message_mode) if (aiRadio.disabledAi || aiRestorePowerRoutine || stat) src << "System Error - Transceiver Disabled." return 0 if(message_mode == "general") message_mode = null return aiRadio.talk_into(src,message,message_mode,verb,speaking) /mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) ..() if(message_mode) if(message_mode == "general") message_mode = null return radio.talk_into(src,message,message_mode,verb,speaking) /mob/living/silicon/say_quote(var/text) var/ending = copytext(text, length(text)) if (ending == "?") return speak_query else if (ending == "!") return speak_exclamation return speak_statement #define IS_AI 1 #define IS_ROBOT 2 #define IS_PAI 3 /mob/living/silicon/say_understands(var/other,var/datum/language/speaking = null) //These only pertain to common. Languages are handled by mob/say_understands() if (!speaking) if (istype(other, /mob/living/carbon)) return 1 if (istype(other, /mob/living/silicon)) return 1 if (istype(other, /mob/living/carbon/brain)) return 1 return ..() //For holopads only. Usable by AI. /mob/living/silicon/ai/proc/holopad_talk(var/message, verb, datum/language/speaking) log_say("(HPAD) [message]",src) message = trim(message) if (!message) return var/obj/machinery/hologram/holopad/T = src.holo if(T && T.masters[src])//If there is a hologram and its master is the user. //Human-like, sorta, heard by those who understand humans. var/rendered_a //Speech distorted, heard by those who do not understand AIs. var/message_stars = stars(message) var/rendered_b if(speaking) rendered_a = "[name] [speaking.format_message(message, verb)]" rendered_b = "[voice_name] [speaking.format_message(message_stars, verb)]" src << "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]"//The AI can "hear" its own message. else rendered_a = "[name] [verb], \"[message]\"" rendered_b = "[voice_name] [verb], \"[message_stars]\"" src << "Holopad transmitted, [real_name] [verb], \"[message]\""//The AI can "hear" its own message. var/list/listeners = get_mobs_and_objs_in_view_fast(get_turf(T), world.view) var/list/listening = listeners["mobs"] var/list/listening_obj = listeners["objs"] for(var/mob/M in listening) spawn(0) if(M.say_understands(src))//If they understand AI speak. Humans and the like will be able to. M.show_message(rendered_a, 2) else//If they do not. M.show_message(rendered_b, 2) for(var/obj/O in listening_obj) if(O == T) //Don't recieve your own speech continue spawn(0) if(O && src) //If we still exist, when the spawn processes O.hear_talk(src, message, verb, speaking) /*Radios "filter out" this conversation channel so we don't need to account for them. This is another way of saying that we won't bother dealing with them.*/ else src << "No holopad connected." return 0 return 1 /mob/living/silicon/ai/proc/holopad_emote(var/message) //This is called when the AI uses the 'me' verb while using a holopad. message = trim(message) if (!message) return var/obj/machinery/hologram/holopad/T = src.holo if(T && T.masters[src]) var/rendered = "[name] [message]" src << "Holopad action relayed, [real_name] [message]" var/obj/effect/overlay/hologram = T.masters[src] var/list/in_range = get_mobs_and_objs_in_view_fast(get_turf(hologram), world.view, 2) //Emotes are displayed from the hologram, not the pad var/list/m_viewers = in_range["mobs"] var/list/o_viewers = in_range["objs"] for(var/mob/M in m_viewers) spawn(0) if(M) M.show_message(rendered, 2) for(var/obj/O in o_viewers) if(O == T) continue spawn(0) if(O) O.see_emote(src, message) log_emote("(HPAD) [message]", src) else //This shouldn't occur, but better safe then sorry. src << "No holopad connected." return 0 return 1 /mob/living/silicon/ai/emote(var/act, var/type, var/message) var/obj/machinery/hologram/holopad/T = src.holo if(T && T.masters[src]) //Is the AI using a holopad? src.holopad_emote(message) else //Emote normally, then. ..() #undef IS_AI #undef IS_ROBOT #undef IS_PAI