diff --git a/baystation12.dme b/baystation12.dme
index 69dba608c5f..9e39d5a8f46 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -957,7 +957,6 @@
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
-#include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\inventory.dm"
#include "code\modules\mob\language.dm"
#include "code\modules\mob\login.dm"
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index fa6e446b152..406b30ee0b5 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -59,9 +59,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],,
- signal.data["compression"], signal.data["level"], signal.frequency,
- signal.data["verb"], signal.data["language"] )
+ signal.data["realname"], signal.data["vname"],, signal.data["compression"], signal.data["level"], signal.frequency)
/** #### - Simple Broadcast - #### **/
@@ -86,8 +84,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency,
- signal.data["verb"], signal.data["language"])
+ signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency)
if(!message_delay)
message_delay = 1
@@ -150,16 +147,14 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency,
- signal.data["verb"], signal.data["language"])
+ signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency)
else
if(intercept)
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
- signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency,
- signal.data["verb"], signal.data["language"])
+ signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency)
@@ -223,8 +218,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
var/vmask, var/vmessage, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname, var/vname,
- var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null)
-
+ var/data, var/compression, var/list/level, var/freq)
/* ###### Prepare the radio connection ###### */
@@ -374,6 +368,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// syndies!
if (display_freq == SYND_FREQ)
part_a = ""
+
// centcomm channels (deathsquid and ert)
else if (display_freq in CENT_FREQS)
part_a = ""
@@ -446,41 +441,108 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.messages += blackbox_msg
//End of research and feedback code.
+
+ var/aitrack = ""
+ var/aiopen = ""
/* ###### Send the message ###### */
/* --- Process all the mobs that heard a masked voice (understood) --- */
if (length(heard_masked))
+ var/N = name
+ var/J = job
+ var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
- R.hear_radio(message,verbage, speaking, part_a, part_b, M)
+ aitrack = ""
+ aiopen = "\[OPEN\] "
+ if(data == 4)
+ aitrack = ""
+
+ if(istype(R, /mob/living/silicon/ai))
+ R.show_message("[part_a][aitrack][N] ([J]) [aiopen][part_b][quotedmsg][part_c]", 2)
+ else
+ R.show_message(rendered, 2)
/* --- Process all the mobs that heard the voice normally (understood) --- */
if (length(heard_normal))
- for (var/mob/R in heard_normal)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M)
+ var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]"
+ for (var/mob/R in heard_normal)
+ aitrack = ""
+ aiopen = "\[OPEN\] "
+ if(data == 4)
+ aitrack = ""
+
+ if(istype(R, /mob/living/silicon/ai))
+ R.show_message("[part_a][aitrack][realname] ([job]) [aiopen][part_b][quotedmsg][part_c]", 2)
+ else
+ R.show_message(rendered, 2)
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
if (length(heard_voice))
+ var/rendered = "[part_a][vname][part_b][vmessage][part_c]"
+
for (var/mob/R in heard_voice)
- R.hear_radio(message,verbage, speaking, part_a, part_b, M)
+ aitrack = ""
+ aiopen = "\[OPEN\] "
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai))
+ R.show_message("[part_a][aitrack][vname] ([job]) [aiopen][part_b][vmessage]][part_c]", 2)
+ else
+ R.show_message(rendered, 2)
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
+ if(M)
+ quotedmsg = M.say_quote(stars(message))
+ else
+ quotedmsg = stars(quotedmsg)
+
+ var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
+
for (var/mob/R in heard_garbled)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1)
+ aitrack = ""
+ aiopen = "\[OPEN\] "
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai))
+ R.show_message("[part_a][aitrack][vname][aiopen][part_b][quotedmsg][part_c]", 2)
+ else
+ R.show_message(rendered, 2)
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
+ if(M)
+ quotedmsg = M.say_quote(Gibberish(message, compression + 50))
+ else
+ quotedmsg = Gibberish(quotedmsg, compression + 50)
+
+ var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]"
+
for (var/mob/R in heard_gibberish)
- R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1)
+ aitrack = ""
+ aiopen = "\[OPEN\] "
+ if(data == 4)
+ aitrack = ""
+
+
+ if(istype(R, /mob/living/silicon/ai))
+ R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [aiopen][part_b][quotedmsg][part_c]", 2)
+ else
+ R.show_message(rendered, 2)
+
/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level)
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index a8fd88f8349..1be534354e8 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -91,9 +91,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
"type" = signal.data["type"],
"server" = signal.data["server"],
"reject" = signal.data["reject"],
- "level" = signal.data["level"],
- "verb" = signal.data["verb"],
- "language" = signal.data["language"]
+ "level" = signal.data["level"]
)
// Keep the "original" signal constant
@@ -160,7 +158,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
add_link(T)
-/obj/machinery/telecomms/Del()
+/obj/machinery/telecomms/Destroy()
telecomms_list -= src
..()
@@ -631,3 +629,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
+
+
+
+
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 2121b7cf334..fcd7d2c76fe 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -219,7 +219,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
del(A)
return
-/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
+/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -351,9 +351,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
- "level" = position.z, // The source's z level
- "language" = speaking,
- "verb" = verb
+ "level" = position.z // The source's z level
)
signal.frequency = connection.frequency // Quick frequency set
@@ -406,9 +404,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"type" = 0,
"server" = null,
"reject" = 0,
- "level" = position.z,
- "language" = speaking,
- "verb" = verb
+ "level" = position.z
)
signal.frequency = connection.frequency // Quick frequency set
@@ -430,7 +426,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
- filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
+ filter_type, signal.data["compression"], list(position.z), connection.frequency)
@@ -603,13 +599,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
else
R.show_message(rendered, 2)
-/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
+/obj/item/device/radio/hear_talk(mob/M as mob, msg)
if (broadcasting)
if(get_dist(src, M) <= canhear_range)
- talk_into(M, msg,null,verb,speaking)
-
-
+ talk_into(M, msg)
/*
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index db9bfdbdc88..21554782bab 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -76,31 +76,6 @@
real_name = name
..()
-
-/mob/dead/observer/Topic(href, href_list)
- if (href_list["track"])
- var/mob/target = locate(href_list["track"]) in mob_list
- if(target)
- ManualFollow(target)
-
-
-
-/mob/dead/attackby(obj/item/W, mob/user)
- if(istype(W,/obj/item/weapon/tome))
- var/mob/dead/M = src
- if(src.invisibility != 0)
- M.invisibility = 0
- user.visible_message( \
- "\red [user] drags ghost, [M], to our plan of reality!", \
- "\red You drag [M] to our plan of reality!" \
- )
- else
- user.visible_message ( \
- "\red [user] just tried to smash his book into that ghost! It's not very effective", \
- "\red You get the feeling that the ghost can't become any more visible." \
- )
-
-
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
return 1
/*
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
deleted file mode 100644
index 06a76218e78..00000000000
--- a/code/modules/mob/hear_say.dm
+++ /dev/null
@@ -1,137 +0,0 @@
-// At minimum every mob has a hear_say proc.
-
-/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
- if(!client)
- return
-
- if(sleeping)
- hear_sleep(message)
- return
-
- var/style = "body"
- if(!say_understands(speaker,language))
- if(istype(speaker,/mob/living/simple_animal))
- var/mob/living/simple_animal/S = speaker
- message = pick(S.speak)
- else
- message = stars(message)
-
- if(language)
- verb = language.speech_verb
- style = language.colour
-
- var/speaker_name = speaker.name
- if(istype(speaker, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = speaker
- speaker_name = H.GetVoice()
-
- if(italics)
- message = "[message]"
-
- var/track = null
- if(istype(src, /mob/dead/observer))
- if(speaker_name != speaker.real_name)
- speaker_name = "[speaker.real_name] ([speaker_name])"
- track = "(follow) "
- if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
- message = "[message]"
-
- if(sdisabilities & DEAF || ear_deaf)
- if(speaker == src)
- src << "You cannot hear yourself speak!"
- else
- src << "[speaker_name][alt_name] talks but you cannot hear them."
- else
- src << "[speaker_name][alt_name] [track][verb], \"[message]\""
-
-
-
-
-
-/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
- if(!client)
- return
-
- if(sleeping)
- hear_sleep(message)
- return
-
- var/track = null
-
- var/style = "body"
-
- if(!say_understands(speaker,language))
- if(istype(speaker,/mob/living/simple_animal))
- var/mob/living/simple_animal/S = speaker
- message = pick(S.speak)
- else
- message = stars(message)
-
- if(language)
- verb = language.speech_verb
- style = language.colour
-
- if(hard_to_hear)
- message = stars(message)
-
- var/speaker_name = speaker.name
- if(istype(speaker, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = speaker
- if(H.voice)
- speaker_name = H.voice
-
- if(hard_to_hear)
- speaker_name = "unknown"
-
- if(istype(src, /mob/living/silicon/ai) && !hard_to_hear)
- var/jobname // the mob's "job"
- if (ishuman(speaker))
- var/mob/living/carbon/human/H = speaker
- jobname = H.get_assignment()
- else if (iscarbon(speaker)) // Nonhuman carbon mob
- jobname = "No id"
- else if (isAI(speaker))
- jobname = "AI"
- else if (isrobot(speaker))
- jobname = "Cyborg"
- else if (istype(speaker, /mob/living/silicon/pai))
- jobname = "Personal AI"
- else
- jobname = "Unknown"
-
- track = "[speaker_name] ([jobname])"
-
- if(istype(src, /mob/dead/observer))
- if(speaker_name != speaker.real_name)
- speaker_name = "[speaker.real_name] ([speaker_name])"
- track = "[speaker_name] (follow)"
-
- if(sdisabilities & DEAF || ear_deaf)
- if(prob(20))
- src << "You feel your headset vibrate but can hear nothing from it!"
- else if(track)
- src << "[part_a][track][part_b] [verb], \"[message]\""
- else
- src << "[part_a][speaker_name][part_b] [verb], \"[message]\""
-
-/mob/proc/hear_sleep(var/message)
- if(prob(15))
- var/list/punctuation = list(",", "!", ".", ";", "?")
- var/list/messages = text2list(message, " ")
- var/R = rand(1, messages.len)
- var/heardword = messages[R]
- if(copytext(heardword,1, 1) in punctuation)
- heardword = copytext(heardword,2)
- if(copytext(heardword,-1) in punctuation)
- heardword = copytext(heardword,1,lentext(heardword))
- var/heard = "...You hear something about...[heardword]"
-
- src << heard
- else
- var/heard = "...You almost hear someone talking..."
-
- src << heard
-
-
-
-
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index e6769c8b72b..1c61af73353 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -144,7 +144,6 @@
UpdateDamageIcon()
hud_updateflag |= 1 << HEALTH_HUD
updatehealth()
- speech_problem_flag = 1
//Heal MANY external organs, in random order
@@ -166,7 +165,6 @@
parts -= picked
updatehealth()
hud_updateflag |= 1 << HEALTH_HUD
- speech_problem_flag = 1
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index db45524ebb5..6d672f1a78b 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -46,10 +46,6 @@
var/icon/stand_icon = null
var/icon/lying_icon = null
- var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
-
- var/speech_problem_flag = 0
-
var/miming = null //Toggle for the mime's abilities.
var/special_voice = "" // For changing our voice. Used by a symptom.
var/said_last_words=0
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3b886e570b2..59915be2aa2 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -79,8 +79,6 @@
if(life_tick%30==15)
hud_updateflag = 1022
- voice = GetVoice()
-
//No need to update all of these procs if the guy is dead.
if(stat != DEAD && !in_stasis)
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath
@@ -174,6 +172,7 @@
/mob/living/carbon/human
+
proc/handle_disabilities()
if (disabilities & EPILEPSY)
if ((prob(1) && paralysis < 1))
@@ -195,7 +194,6 @@
drop_item()
emote("cough")
if (disabilities & TOURETTES)
- speech_problem_flag = 1
if ((prob(10) && paralysis <= 1))
Stun(10)
switch(rand(1, 3))
@@ -208,7 +206,6 @@
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
animate(pixel_x = pixel_x - x_offset, pixel_y = pixel_y - y_offset, time = 1)
if (disabilities & NERVOUS)
- speech_problem_flag = 1
if (prob(10))
stuttering = max(10, stuttering)
@@ -269,7 +266,6 @@
if(gene.is_active(src))
if (prob(10) && prob(gene.instability))
adjustCloneLoss(1)
- speech_problem_flag = 1
gene.OnMobLife(src)
if (radiation)
@@ -1127,7 +1123,6 @@
if(halloss > 0)
adjustHalLoss(-3)
else if(sleeping)
- speech_problem_flag = 1
handle_dreams()
adjustHalLoss(-3)
if (mind)
@@ -1229,21 +1224,18 @@
//Other
if(stunned)
- speech_problem_flag = 1
AdjustStunned(-1)
if(weakened)
weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times
if(stuttering)
- speech_problem_flag = 1
stuttering = max(stuttering-1, 0)
if (slurring)
slurring = max(slurring-(1*sober_str), 0)
if(silent)
- speech_problem_flag = 1
silent = max(silent-1, 0)
if(druggy)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 387e3e72209..e7cf18a51c1 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,135 +1,94 @@
/mob/living/carbon/human/say(var/message)
- var/verb = "says"
- var/alt_name = ""
- var/message_range = world.view
- var/italics = 0
-
- if(client)
- if(client.prefs.muted & MUTE_IC)
- src << "\red You cannot speak in IC (Muted)."
- return
-
- if(stat == 2)
- return say_dead(message)
-
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
-
- if(name != GetVoice())
- alt_name = "(as [get_id_name("Unknown")])"
-
- var/message_mode = null
- var/datum/language/speaking = null
-
- if(copytext(message,1,2) == ";")
- message_mode = "headset"
- message = copytext(message,2)
-
- if(length(message) >= 2)
- var/channel_prefix = copytext(message, 1 ,3)
- var/check_language_and_radio = copytext(message,3,5)
- if(languages.len)
- for(var/datum/language/L in languages)
- if(lowertext(channel_prefix) == ":[L.key]" || lowertext(check_language_and_radio) == ":[L.key]")
- verb = L.speech_verb
- speaking = L
- break
- if(!message_mode)
- message_mode = department_radio_keys[channel_prefix]
-
- if(speaking || copytext(message,1,2) == ":")
- var/positioncut = 3
- if(speaking && (message_mode && copytext(message,3,4)==":"))
- positioncut += 2
- message = trim(copytext(message,positioncut))
-
-
- message = capitalize(trim_left(message))
-
- if(speech_problem_flag)
- var/list/handle_r = handle_speech_problems(message)
- message = handle_r[1]
- verb = handle_r[2]
- speech_problem_flag = handle_r[3]
-
- if(!message || stat)
- return
-
- var/ending = copytext(message, length(message))
- if(ending=="!")
- verb=pick("exclaims","shouts","yells")
- if(ending=="?")
- verb="asks"
-
- var/list/obj/item/used_radios = new
-
- switch (message_mode)
- if("headset")
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = l_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = r_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += r_ear
-
- if("right_ear")
- if(r_ear && istype(r_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = r_ear
- R.talk_into(src,message,verb,speaking)
- used_radios += r_ear
-
- if("left_ear")
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = l_ear
- R.talk_into(src,message,verb,speaking)
- used_radios += l_ear
-
- if("intercom")
- for(var/obj/item/device/radio/intercom/I in view(1, null))
- I.talk_into(src, message, verb, speaking)
- used_radios += I
- if("whisper")
- whisper(message)
- return
- if("binary")
- if(robot_talk_understand || binarycheck())
- robot_talk(message)
- return
- if("changeling")
+ if(miming)
+ if(length(message) >= 2)
if(mind && mind.changeling)
- for(var/mob/Changeling in mob_list)
- if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
- Changeling << "[mind.changeling.changelingID]: [message]"
- return
- else
- if(message_mode)
- if(message_mode in radiochannels)
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- l_ear.talk_into(src,message, message_mode, verb, speaking)
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- r_ear.talk_into(src,message, message_mode, verb, speaking)
- used_radios += r_ear
+ if(copytext(message, 1, 2) != "*" && department_radio_keys[copytext(message, 1, 3)] != "changeling")
+ return
+ else
+ return ..(message)
+ if(stat == DEAD)
+ return ..(message)
+
+ if(length(message) >= 1) //In case people forget the '*help' command, this will slow them the message and prevent people from saying one letter at a time
+ if (copytext(message, 1, 2) != "*")
+ return
+
+ if(dna)
+ if(length(message) >= 2)
+ if (copytext(message, 1, 2) != "*" && department_radio_keys[copytext(message, 1, 3)] != "changeling")
+ for(var/datum/dna/gene/gene in dna_genes)
+ if(!gene.block)
+ continue
+ if(gene.is_active(src))
+ message = gene.OnSay(src,message)
+ /*
+ if(dna.mutantrace == "lizard")
+ if(copytext(message, 1, 2) != "*")
+ message = replacetext(message, "s", stutter("ss"))
+
+ if(dna.mutantrace == "slime" && prob(5))
+ if(copytext(message, 1, 2) != "*")
+ if(copytext(message, 1, 2) == ";")
+ message = ";"
+ else
+ message = ""
+ message += "SKR"
+ var/imax = rand(5,20)
+ for(var/i = 0,i= 25 && length(message))
+ if(copytext(message, 1, 2) != "*")
+ message = "[uppertext(message)]!!" //because I don't know how to code properly in getting vars from other files -Bro
+
+ if (src.slurring)
+ if(copytext(message, 1, 2) != "*")
+ message = slur(message)
+ ..(message)
- if(used_radios.len)
- italics = 1
- message_range = 3
-
- var/datum/gas_mixture/environment = loc.return_air()
- if(environment)
- var/pressure = environment.return_pressure()
- if(pressure < SAY_MINIMUM_PRESSURE)
- italics = 1
- message_range =1
-
- ..(message, speaking, verb, alt_name, italics, message_range, used_radios)
-
-
-/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
+/mob/living/carbon/human/say_understands(var/other,var/datum/language/speaking = null)
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
@@ -139,11 +98,6 @@
return 1
if (istype(other, /mob/living/carbon/slime))
return 1
- if (istype(other, /mob/living/simple_animal))
- if(other.universal_speak || src.universal_speak || src.universal_understand)
- return 1
- return 0
-
return ..()
/mob/living/carbon/human/GetVoice()
@@ -170,47 +124,3 @@
/mob/living/carbon/human/proc/GetSpecialVoice()
return special_voice
-
-/mob/living/carbon/human/proc/handle_speech_problems(var/message)
- var/list/returns[3]
- var/verb = "says"
- var/handled = 0
- if(silent)
- message = ""
- handled = 1
- if(sdisabilities & MUTE)
- message = ""
- handled = 1
- if(wear_mask)
- if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
- var/obj/item/clothing/mask/horsehead/hoers = wear_mask
- if(hoers.voicechange)
- if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")
- message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
- verb = pick("whinnies","neighs", "says")
- handled = 1
-
- if((M_HULK in mutations) && health >= 25 && length(message))
- message = "[uppertext(message)]!!!"
- verb = pick("yells","roars","hollers")
- handled = 1
- if(slurring)
- message = slur(message)
- verb = pick("stammers","stutters")
- handled = 1
-
- var/braindam = getBrainLoss()
- if(braindam >= 60)
- handled = 1
- if(prob(braindam/4))
- message = stutter(message)
- verb = pick("stammers", "stutters")
- if(prob(braindam))
- message = uppertext(message)
- verb = pick("yells like an idiot","says rather loudly")
-
- returns[1] = message
- returns[2] = verb
- returns[3] = handled
-
- return returns
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 95833f0b0f6..6b5dbc96cfd 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -82,52 +82,415 @@ var/list/department_radio_keys = list(
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
-/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
+/mob/living/say(var/message)
+
+ /*
+ Formatting and sanitizing.
+ */
+
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+
+ /*
+ Sanity checking and speech failure.
+ */
+
+ if (!message)
+ return
+
+ if(silent)
+ return
+
+ if (stat == 2) // Dead.
+ return say_dead(message)
+ else if (stat) // Unconcious.
+ return
+
+ if (src.client)
+ if(client.prefs.muted & MUTE_IC)
+ src << "\red You cannot speak in IC (muted)."
+ return
+ if (src.client.handle_spam_prevention(message,MUTE_IC))
+ return
+ // undo last word status.
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/H=src
+ if(H.said_last_words)
+ H.said_last_words=0
+
+ // Mute disability
+ if (sdisabilities & MUTE)
+ return
+
+ // Muzzled.
+ if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
+ return
+
+ // Emotes.
+ if (copytext(message, 1, 2) == "*" && !stat)
+ return emote(copytext(message, 2))
+
+ /*
+ Identity hiding.
+ */
+ var/alt_name = ""
+ if (istype(src, /mob/living/carbon/human) && name != GetVoice())
+ var/mob/living/carbon/human/H = src
+ alt_name = " (as [H.get_id_name("Unknown")])"
+
+ /*
+ Now we get into the real meat of the say processing. Determining the message mode.
+ */
+
+ 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()
+ if (braindam >= 60)
+ if(prob(braindam/4))
+ message = stutter(message)
+ if(prob(braindam))
+ message = uppertext(message)
+
+ // General public key. Special message handling
+ var/mmode
+ var/cprefix = ""
+ if(length(message) >= 2)
+ cprefix = copytext(message, 1, 3)
+ if(cprefix in department_radio_keys)
+ mmode = department_radio_keys[cprefix]
+ if (copytext(message, 1, 2) == ";" || (prob(braindam/2) && !mmode))
+ message_mode = "headset"
+ message = copytext(message, 2)
+ // Begin checking for either a message mode or a language to speak.
+ else if (length(message) >= 2)
+ var/channel_prefix = copytext(message, 1, 3)
+
+ //Check if the person is speaking a language that they know.
+ if(languages.len)
+ for(var/datum/language/L in languages)
+ if(lowertext(channel_prefix) == ":[L.key]")
+ speaking = L
+ break
+ 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))))
+ message_mode = null //only humans can use headsets
+
+ if(src.stunned > 2 || (traumatic_shock > 61 && prob(50)))
+ message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
+
+ message = capitalize(message)
+
+ if (!message)
+ return
+
+ if (stuttering)
+ message = stutter(message)
+
+ ///////////////////////////////////////////////////////////
+ // VIDEO KILLED THE RADIO STAR V2.0
+ //
+ // EXPERIMENTAL CODE BY YOUR PALS AT /vg/
+ ///////////////////////////////////////////////////////////
+
+ var/list/obj/item/used_radios = new
+
+ // Actually speaking on the radio?
+ var/is_speaking_radio = 0
+
+ // Devices selected
+ var/list/devices=list()
+
+ // Select all always_talk devices
+ // Carbon lifeforms
+ //if(istype(src, /mob/living/carbon))
+ for(var/obj/item/device/radio/R in contents)
+ if(R.always_talk)
+ devices += R
+
+ //src << "Speaking on [message_mode]: [message]"
+ if(message_mode)
+ switch (message_mode)
+ if ("right ear")
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ if(C:r_ear) devices += C:r_ear
+ message_mode="headset"
+ message_range = 1
+ italics = 1
+
+ if ("left ear")
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ if(C:l_ear) devices += C:l_ear
+ message_mode="headset"
+ message_range = 1
+ italics = 1
+
+ // Select a headset and speak into it without actually sending a message
+ if ("fake")
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ if(C:l_ear) used_radios += C:l_ear
+ if(C:r_ear) used_radios += C:r_ear
+ if(issilicon(src))
+ var/mob/living/silicon/Ro=src
+ if(Ro:radio) devices += Ro:radio
+ message_range = 1
+ italics = 1
+ if ("fake left ear")
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ if(C:l_ear) used_radios += C:l_ear
+ message_range = 1
+ italics = 1
+ if ("fake right ear")
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ if(C:r_ear) used_radios += C:r_ear
+ message_range = 1
+ italics = 1
+
+ if ("intercom")
+ for (var/obj/item/device/radio/intercom/I in view(1, null))
+ devices += I
+ message_mode=null
+ message_range = 1
+ italics = 1
+
+ //I see no reason to restrict such way of whispering
+ if ("whisper")
+ whisper(message)
+ return
+
+ if ("binary")
+ if(robot_talk_understand || binarycheck())
+ //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
+ robot_talk(message)
+ return
+
+ if ("alientalk")
+ if(alien_talk_understand || hivecheck())
+ //message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
+ alien_talk(message)
+ return
+
+ if ("pAI")
+ message_range = 1
+ italics = 1
+
+
+ if("changeling")
+ if(mind && mind.changeling)
+ log_say("[key_name(src)] ([mind.changeling.changelingID]): [message]")
+ for(var/mob/Changeling in mob_list)
+ if(istype(Changeling, /mob/living/silicon)) continue //WHY IS THIS NEEDED?
+ if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
+ Changeling << "[mind.changeling.changelingID]: [message]"
+ else if(istype(Changeling,/mob/dead/observer) && (Changeling.client && Changeling.client.prefs.toggles & CHAT_GHOSTEARS))
+ Changeling << "[mind.changeling.changelingID] (: (Follow) [message]"
+ return
+ else // headset, department channels.
+ if(iscarbon(src))
+ var/mob/living/carbon/C=src
+ 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(Ro:radio)
+ devices += Ro:radio
+ else
+ warning("[src] has no radio!")
+ message_range = 1
+ italics = 1
+ if(devices.len>0)
+ for(var/obj/item/device/radio/R in devices)
+ if(istype(R))
+ R.talk_into(src, message, message_mode)
+ used_radios += R
+ is_speaking_radio = 1
+
+ /////////////////////////////////////////////////////////////////
+ //
+ /////////////////////////////////////////////////////////////////
+
+ var/datum/gas_mixture/environment = loc.return_air()
+ if(environment)
+ var/pressure = environment.return_pressure()
+ if (pressure < SAY_MINIMUM_PRESSURE) //in space no one can hear you scream
+ italics = 1
+ message_range = 1
+
+ var/list/listening
+
+ listening = get_mobs_in_view(message_range, src)
+ var/list/onscreen = viewers()
+ for(var/mob/M in player_list)
+ if (!M.client)
+ continue //skip monkeys and leavers
+ if (istype(M, /mob/new_player))
+ continue
+ if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice
+ listening|=M
var/turf/T = get_turf(src)
+ var/list/W = hear(message_range, T)
- var/list/listening = list()
- if(T)
+ for (var/obj/O in ((W | contents)-used_radios))
+ W |= O
- var/list/hear = hear(message_range, T)
- var/list/hearturfs = list()
+ for (var/mob/M in W)
+ W |= M.contents
- for(var/I in hear)
- if(istype(I, /mob/))
- var/mob/M = I
- listening += M
- hearturfs += M.locs[1]
- for(var/obj/item/device/radio/R in contents)
- spawn(0)
- R.hear_talk(src, message, verb, speaking)
- else if(istype(I, /obj/))
- var/obj/O = I
- hearturfs += O.locs[1]
- if(istype(O, /obj/item/device/radio))
- spawn(0)
- O.hear_talk(src, message, verb, speaking)
- for(var/mob/M in player_list)
- if(M.stat == DEAD && client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
- listening |= M
- continue
- if(M.locs[1] in hearturfs)
- listening |= M
+ for (var/atom/A in W)
+ if(istype(A, /mob/living/simple_animal/parrot)) //Parrot speech mimickry
+ if(A == src)
+ continue //Dont imitate ourselves
+
+ var/mob/living/simple_animal/parrot/P = A
+ if(P.speech_buffer.len >= 10)
+ P.speech_buffer.Remove(pick(P.speech_buffer))
+ P.speech_buffer.Add(message)
+
+ if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
+ var/obj/O = A
+ spawn (0)
+ if(O && !istype(O.loc, /obj/item/weapon/storage))
+ O.hear_talk(src, message)
+
+
+ var/list/heard_a = list() // understood us
+ var/list/heard_b = list() // didn't understand us
+
+ for (var/M in listening)
+ if(hascall(M,"say_understands"))
+ if (M:say_understands(src,speaking))
+ heard_a += M
+ else
+ heard_b += M
+ else
+ heard_a += M
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
spawn(30) del(speech_bubble)
- if(used_radios.len)
- for(var/mob/living/M in hearers(5, src))
- if(M != src)
- M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "radio"]")
+ for(var/mob/M in hearers(5, src))
+ if(M != src && is_speaking_radio)
+ M:show_message("[src] talks into [used_radios.len ? used_radios[1] : "radio"]")
+/* if(message_mode == null)
+ var/accent = "en-us"
+ var/voice = "m7"
+ var/speed = 175
+ var/pitch = 0
+ var/echo = 10
+ if(istype(src, /mob/living/silicon/ai))
+ echo = 90
+ if(istype(src, /mob/living/silicon/robot))
+ echo = 60
+ if(src.client && src.client.prefs)
+ accent = src.client.prefs.accent
+ voice = src.client.prefs.voice
+ speed = src.client.prefs.talkspeed
+ pitch = src.client.prefs.pitch
+ src:texttospeech(message, speed, pitch, accent, "+[voice]", echo)*/
- for(var/mob/M in listening)
- if(M.client)
- M << speech_bubble
- M.hear_say(message,verb,speaking,alt_name, italics, src)
+ var/rendered = null
+ if (length(heard_a))
+ var/message_a = say_quote(message,speaking)
+
+ if (italics)
+ message_a = "[message_a]"
+
+ var/message_ghost = "[message_a]" // bold so ghosts know the person is in view.
+ rendered = "[GetVoice()][alt_name] [message_a]"
+ var/rendered2 = null
+
+ for (var/mob/M in heard_a)
+ //BEGIN TELEPORT CHANGES
+/* if(message_mode == null && fexists("sound/playervoices/[src.ckey].ogg"))
+ if(M.client)
+ if(M.client.prefs)
+ if(M.client.prefs.sound & SOUND_VOICES)
+ M.playsound_local(get_turf(src), "sound/playervoices/[src.ckey].ogg", 70, 0, 5, 1)*/
+ if(!istype(M, /mob/new_player))
+ if(M && M.stat == DEAD)
+ if (M.client && M.client.prefs && (M.client.prefs.toggles & CHAT_GHOSTEARS) && M in onscreen)
+ rendered2 = "[GetVoice()] [alt_name] (Follow) [message_ghost]"
+ else
+ rendered2 = "[GetVoice()] [alt_name] (Follow) [message_a]"
+ M:show_message(rendered2, 2)
+ continue
+ //END CHANGES
+
+ if(hascall(M,"show_message"))
+ var/deaf_message = ""
+ var/deaf_type = 1
+ if(M != src)
+ deaf_message = "[name][alt_name] talks but you cannot hear them."
+ else
+ deaf_message = "You cannot hear yourself!"
+ deaf_type = 2 // Since you should be able to hear yourself without looking
+ M:show_message(rendered, 2, deaf_message, deaf_type)
+ M << speech_bubble
+
+ if (length(heard_b))
+
+ var/message_b
+ message_b = stars(message)
+ message_b = say_quote(message_b,speaking)
+
+ if (italics)
+ message_b = "[message_b]"
+
+ rendered = "[name][alt_name] [message_b]" //Voice_name isn't too useful. You'd be able to tell who was talking presumably.
+ var/rendered2 = null
+
+ for (var/M in heard_b)
+ var/mob/MM
+ if(istype(M, /mob))
+ MM = M
+ if(!istype(MM, /mob/new_player) && MM)
+ if(MM && MM.stat == DEAD)
+ rendered2 = "[voice_name] (Follow) [message_b]"
+ MM:show_message(rendered2, 2)
+ continue
+ if(hascall(M,"show_message"))
+ M:show_message(rendered, 2)
+ M << speech_bubble
+
+ /*
+ if(M.client)
+
+ if(!M.client.bubbles || M == src)
+ var/image/I = image('icons/effects/speechbubble.dmi', B, "override")
+ I.override = 1
+ M << I
+ */ /*
+
+ flick("[presay]say", B)
+
+ if(istype(loc, /turf))
+ B.loc = loc
+ else
+ B.loc = loc.loc
+
+ spawn()
+ sleep(11)
+ del(B)
+ */
+
+ //talking items
+ for(var/obj/item/weapon/O in view(3,src))
+ if(O.listening_to_players)
+ O.catchMessage(message, src)
log_say("[name]/[key] : [message]")
@@ -136,3 +499,5 @@ var/list/department_radio_keys = list(
/mob/living/proc/GetVoice()
return name
+
+
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index d63078c05e6..24c827c46ad 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -433,13 +433,9 @@ var/list/ai_list = list()
if (href_list["track"])
var/mob/target = locate(href_list["track"]) in mob_list
-/*
var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
if(A && target)
A.ai_actual_track(target)
-*/
- if(target)
- ai_actual_track(target)
return
else if (href_list["faketrack"])
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 562c2c06fcf..a7ad5045bae 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -2,15 +2,11 @@
var/ending = copytext(text, length(text))
if (ending == "?")
- return "queries"
+ return "queries, \"[text]\"";
else if (ending == "!")
- return "declares"
+ return "declares, \"[text]\"";
- return "states"
-
-#define IS_AI 1
-#define IS_ROBOT 2
-#define IS_PAI 3
+ return "states, \"[text]\"";
/mob/living/silicon/say(var/message)
if (!message)
@@ -27,98 +23,45 @@
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
return say_dead(message)
- var/bot_type = 0 //Let's not do a fuck ton of type checks, thanks.
- if(istype(src, /mob/living/silicon/ai))
- bot_type = IS_AI
- else if(istype(src, /mob/living/silicon/robot))
- bot_type = IS_ROBOT
- else if(istype(src, /mob/living/silicon/pai))
- bot_type = IS_PAI
-
- var/mob/living/silicon/ai/AI = src //and let's not declare vars over and over and over for these guys.
- var/mob/living/silicon/robot/R = src
- var/mob/living/silicon/pai/P = src
-
-
//Must be concious to speak
if (stat)
return
- var/verb = say_quote(message)
- var/message_mode = null
+ if (length(message) >= 2)
+ var/prefix = copytext(message, 1, 3)
+ if (department_radio_keys[prefix] == "binary")
+ if(istype(src, /mob/living/silicon/pai))
+ return ..(message)
+ message = copytext(message, 3)
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
-
- if(copytext(message,1,2) == ";")
- message_mode = "general" // I don't know why but regular radio = fuck you we ain't broadcasting, pAI mode was what was in old say code.
- message = trim(copytext(message,2))
-
- else if(length(message) >= 2)
- var/channel_prefix = copytext(message, 1 ,3)
- if(!message_mode)
- message_mode = department_radio_keys[channel_prefix]
-
- if(message_mode && bot_type == IS_ROBOT)
- if(message_mode != "binary" && !R.is_component_functioning("radio"))
- src << "\red Your radio isn't functional at this time."
- return
-
-
- if(message_mode && message_mode != "general")
- message = trim(copytext(message,3))
-
- switch(message_mode)
- if("department")
- switch(bot_type)
- if(IS_AI)
- AI.holopad_talk(message)
- if(IS_ROBOT)
- log_say("[key_name(src)] : [message]")
- R.radio.talk_into(src,message,message_mode,verb)
- if(IS_PAI)
- log_say("[key_name(src)] : [message]")
- P.radio.talk_into(src,message,message_mode,verb)
- return
-
- if("binary")
- switch(bot_type)
- if(IS_ROBOT)
- if(!R.is_component_functioning("comms"))
- src << "\red Your binary communications component isn't functional."
- return
- if(IS_PAI)
- src << "You do not appear to have that function"
+ // TODO: move the component system up to silicon so we don't have to use this ugly hack..
+ if(istype(src, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = src
+ if(!R.is_component_functioning("comms"))
+ src << "\red Your binary communications component isn't functional."
return
-
robot_talk(message)
- return
- if("general")
- switch(bot_type)
- if(IS_AI)
- src << "Yeah, not yet, sorry"
- if(IS_ROBOT)
- log_say("[key_name(src)] : [message]")
- R.radio.talk_into(src,message,null,verb)
- if(IS_PAI)
- log_say("[key_name(src)] : [message]")
- P.radio.talk_into(src,message,null,verb)
- return
- else
- if(message_mode && message_mode in radiochannels)
- switch(bot_type)
- if(IS_AI)
- src << "You don't have this function yet, I'm working on it"
- return
- if(IS_ROBOT)
- log_say("[key_name(src)] : [message]")
- R.radio.talk_into(src,message,message_mode,verb)
- if(IS_PAI)
- log_say("[key_name(src)] : [message]")
- P.radio.talk_into(src,message,message_mode,verb)
+ else if (department_radio_keys[prefix] == "alientalk")
+ if(!alien_talk_understand) return
+ message = copytext(message, 3)
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+ alien_talk(message)
+ else if (department_radio_keys[prefix] == "department")
+ if(isAI(src)&&client)//For patching directly into AI holopads.
+ var/mob/living/silicon/ai/U = src
+ message = copytext(message, 3)
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+ U.holopad_talk(message)
+ else//Will not allow anyone by an active AI to use this function.
+ src << "This function is not available to you."
return
-
-
- return ..(message,null,verb)
+ else
+ return ..(message)
+ else
+ return ..(message)
//For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(var/message)
@@ -171,6 +114,9 @@
if(istype(S , /mob/living/silicon/ai))
var/renderedAI = "Robotic Talk, [name] [message_a]"
S.show_message(renderedAI, 2)
+ else if(istype(S , /mob/dead/observer) && S.stat == DEAD)
+ var/rendered2 = "Robotic Talk, [name] (Follow) [message_a]"
+ S.show_message(rendered2, 2)
else
S.show_message(rendered, 2)
@@ -179,6 +125,9 @@
if(istype(S , /mob/living/silicon/ai))
var/renderedAI = "Robotic Talk, [name] [message_a]"
S.show_message(renderedAI, 2)
+ else if(istype(S , /mob/dead/observer) && S.stat == DEAD)
+ var/rendered2 = "Robotic Talk, [name] (Follow) [message_a]"
+ S.show_message(rendered2, 2)
else
S.show_message(rendered, 2)
@@ -205,12 +154,10 @@
message = say_quote(message)
- rendered = "Robotic Talk, [name] [message_a]"
+// rendered = "Robotic Talk, [name] [message_a]"
+ rendered = null
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
- M.show_message(rendered, 2)
-
-#undef IS_AI
-#undef IS_ROBOT
-#undef IS_PAI
+ rendered = "Robotic Talk, [name] (Follow) [message_a]"
+ M.show_message(rendered, 2)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 6ee6b1f975c..13f320472ba 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -13,7 +13,6 @@
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
- universal_speak = 1
attack_sound = 'sound/weapons/punch1.ogg'
min_oxy = 0
max_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm
index 9b12edb4ed6..fdf381f279a 100644
--- a/code/modules/mob/living/simple_animal/head.dm
+++ b/code/modules/mob/living/simple_animal/head.dm
@@ -8,7 +8,6 @@
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
- universal_speak = 1
speak_chance = 1
turns_per_move = 5
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
@@ -57,4 +56,4 @@
src.say(msg)
else
var/msg = pick(comments)
- src.say(msg)
+ src.say(msg)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 22378a85779..a8f575c64ee 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -48,7 +48,6 @@
response_disarm = "gently moves aside the"
response_harm = "swats the"
stop_automated_movement = 1
- universal_speak = 1
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index ae0fc99e5db..7c31082bba2 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -8,7 +8,6 @@
icon_dead = "shade_dead"
maxHealth = 50
health = 50
- universal_speak = 1
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
response_help = "puts their hand through"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 93752329e03..3a8fae11f1f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -17,7 +17,7 @@
var/turns_per_move = 1
var/turns_since_move = 0
- universal_speak = 0 //No, just no.
+ universal_speak = 0
var/meat_amount = 0
var/meat_type
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
@@ -531,14 +531,3 @@
if (M.occupant)
return 0
return 1
-
-
-/mob/living/simple_animal/say(var/message, var/datum/language/speaking= null, var/verb = "says")
-
- if(stat)
- return
- if(speak_emote.len)
- verb = pick(speak_emote)
-
- ..(message, null, verb)
-
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index 389e5bad53b..80868dc19e6 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -19,8 +19,6 @@
maxHealth = 30
health = 30
- universal_speak =1
-
stop_automated_movement = 1
animate_movement = SYNC_STEPS
@@ -196,4 +194,4 @@
for(var/atom/movable/stomachContent in contents) //or poop it out
loc.contents += stomachContent
- return
+ return
\ No newline at end of file
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index e6f7e0a20d5..ceabbc244e8 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -475,12 +475,4 @@
src << browse(null, "window=playersetup") //closes the player setup window
src << browse(null, "window=preferences") //closes job selection
src << browse(null, "window=mob_occupation")
-
-
-
-/mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
- return
-
-/mob/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
- return
-
+ src << browse(null, "window=latechoices") //closes late job selection