diff --git a/baystation12.dme b/baystation12.dme
index 8b044669b18..cda3ce85bb3 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1028,6 +1028,7 @@
#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm"
#include "code\WorkInProgress\Cael_Aislinn\Tajara\say.dm"
#include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm"
+#include "code\WorkInProgress\Cael_Aislinn\Tajara\whisper.dm"
#include "code\WorkInProgress\mapload\dmm_suite.dm"
#include "code\WorkInProgress\mapload\reader.dm"
#include "code\WorkInProgress\Mini\atmos_control.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
index de9cf148e0a..0e597ac2405 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
@@ -1,18 +1,8 @@
//their language needs to hook into radios as well
-/mob/living/carbon/human/tajaran/say_quote(var/text)
+/mob/living/carbon/human/tajaran/say_quote(var/text,var/is_speaking_taj)
//work out if the listener can understand or not
- var/is_decipherable = 0
- var/n = length(text)
- var/p = 0
- while(p < n)
- if (copytext(text, p, p + 1) in tajspeak_letters)
- p++
- continue
- is_decipherable = 1
- break
-
var/ending = copytext(text, length(text))
if (src.disease_symptoms & DISEASE_HOARSE)
return "rasps, \"[text]\"";
@@ -23,7 +13,7 @@
if (src.brainloss >= 60)
return "gibbers, \"[text]\"";
- if(!is_decipherable)
+ if(is_speaking_taj)
return "mewls, \"[text]\""//pick("yowls, \"[text]\"", "growls, \"[text]\"","mewls, \"[text]\"", "mrowls, \"[text]\"", "meows, \"[text]\"", "purrs, \"[text]\"");
if (ending == "?")
@@ -35,6 +25,7 @@
//convert message to an indecipherable series of sounds for anyone who isnt tajaran
/mob/living/carbon/human/tajaran/proc/tajspeak(var/message)
+ return stars(message)
var/te = html_decode(message)
var/t = ""
var/n = length(message)
@@ -65,7 +56,6 @@
return html_encode(t)*/
/mob/living/carbon/human/tajaran/say(var/message)
- world << "\blue check1:\"[message]\")"
var/message_old = message
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
@@ -170,11 +160,16 @@
if (!ishuman(src) && (message_mode=="department" || (message_mode in radiochannels)))
message_mode = null //only humans can use headsets
- world << "\blue check2:\"[message]\")"
-
if (!message)
return
+ //work out if we're speaking tajaran or not
+ var/is_speaking_taj = 0
+ if(copytext(message, 1, 4) == ":j ")
+ message = copytext(message, 4)
+ if(taj_talk_understand)
+ is_speaking_taj = 1
+
if( !message_mode && (disease_symptoms & DISEASE_WHISPER))
message_mode = "whisper"
@@ -217,15 +212,13 @@
*/
var/list/obj/item/used_radios = new
- world << "\blue check3:\"[message]\")"
-
switch (message_mode)
if ("headset")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
- src:l_ear.talk_into(src, message)
+ src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:l_ear
else if (src:r_ear)
- src:r_ear.talk_into(src, message)
+ src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:r_ear
message_range = 1
@@ -234,10 +227,10 @@
if ("secure headset")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
- src:l_ear.talk_into(src, message, 1)
+ src:l_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:l_ear
else if (src:r_ear)
- src:r_ear.talk_into(src, message, 1)
+ src:r_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:r_ear
message_range = 1
@@ -245,7 +238,7 @@
if ("right ear")
if (src:r_ear)
- src:r_ear.talk_into(src, message)
+ src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:r_ear
message_range = 1
@@ -253,7 +246,7 @@
if ("left ear")
if (src:l_ear)
- src:l_ear.talk_into(src, message)
+ src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += src:l_ear
message_range = 1
@@ -261,7 +254,7 @@
if ("intercom")
for (var/obj/item/device/radio/intercom/I in view(1, null))
- I.talk_into(src, message)
+ I.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "universal"]")
used_radios += I
message_range = 1
@@ -313,16 +306,6 @@
italics = 1
/////SPECIAL HEADSETS END
- world << "\blue check4:\"[message]\")"
-
- //work out if we're speaking tajaran or not
- var/is_speaking_taj = 0
- if(copytext(message, 1, 3) == ":j")
- is_speaking_taj = 1
- message = trim(copytext(message, 1, 3))
-
- world << "\blue check5:\"[message]\")"
-
var/list/listening
/*
if(istype(loc, /obj/item/device/aicard)) // -- TLE
@@ -405,7 +388,7 @@
var/rendered = null
if (length(heard_a))
- var/message_a = say_quote(message)
+ var/message_a = say_quote(message,0)
if (italics)
message_a = "[message_a]"
if (!istype(src, /mob/living/carbon/human))
@@ -437,7 +420,6 @@
if(istype(src, /mob/living/carbon/metroid))
presay = "metroid"
*/
- world << "\blue check6:\"[message]\")"
for (var/mob/M in heard_a)
M.show_message(rendered, 2)
@@ -454,8 +436,6 @@
M << I
*/
- world << "\blue check7:\"[message]\")"
-
/*
// find the suffix, if bot, human or monkey
var/punctuation = ""
@@ -488,7 +468,7 @@
message_b = voice_message
else
message_b = tajspeak(message)
- message_b = say_quote(message_b)
+ message_b = say_quote(message_b,1)
if (italics)
message_b = "[message_b]"
@@ -540,5 +520,3 @@
sleep(11)
del(B)
*/
-
- world << "\blue check8:\"[message]\")"
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
index 04a8adfc780..8fef089b43a 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
@@ -4,6 +4,10 @@
voice_name = "tajaran"
icon = 'tajaran.dmi'
var/list/tajspeak_letters
+ //
+ universal_speak = 1
+ taj_talk_understand = 1
+ voice_message = "mrowls"
/mob/living/carbon/human/tajaran/New()
tajspeak_letters = new/list("~","*","-")
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm
new file mode 100644
index 00000000000..8818ed5aaa4
--- /dev/null
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm
@@ -0,0 +1,171 @@
+/mob/living/carbon/human/tajaran/whisper(message as text)
+ //Figured it out. If you use say :w (message) it HTML encodes it, THEN passes it to the whisper code, which does so again. Jeez. --SkyMarshal
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+ if (!message)
+ return
+
+ log_whisper("[src.name]/[src.key] : [message]")
+
+ if (src.client && (src.client.muted || src.client.muted_complete))
+ src << "You are muted."
+ return
+
+ if (src.stat == 2)
+ return src.say_dead(message)
+
+ if (src.stat)
+ return
+
+ var/alt_name = ""
+ if (istype(src, /mob/living/carbon/human) && src.name != src.real_name)
+ var/mob/living/carbon/human/H = src
+ alt_name = " (as [H.get_visible_name()])"
+ // Mute disability
+ if (src.sdisabilities & 2)
+ return
+
+ if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
+ return
+
+ var/italics = 1
+ var/message_range = 1
+
+ //work out if we're speaking tajaran or not
+ var/is_speaking_taj = 0
+ if(copytext(message, 1, 4) == ":j ")
+ message = copytext(message, 4)
+ if(taj_talk_understand)
+ is_speaking_taj = 1
+
+ if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)&&src.wear_mask:voice=="Unknown")
+ if(copytext(message, 1, 2) != "*")
+ var/list/temp_message = dd_text2list(message, " ")
+ var/list/pick_list = list()
+ for(var/i = 1, i <= temp_message.len, i++)
+ pick_list += i
+ for(var/i=1, i <= abs(temp_message.len/3), i++)
+ var/H = pick(pick_list)
+ if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
+ temp_message[H] = ninjaspeak(temp_message[H])
+ pick_list -= H
+ message = dd_list2text(temp_message, " ")
+ message = dd_replaceText(message, "o", "¤")
+ message = dd_replaceText(message, "p", "þ")
+ message = dd_replaceText(message, "l", "£")
+ message = dd_replaceText(message, "s", "§")
+ message = dd_replaceText(message, "u", "µ")
+ message = dd_replaceText(message, "b", "ß")
+
+ message = capitalize(message)
+
+ if (src.stuttering)
+ message = stutter(message)
+ if (src.slurring)
+ message = slur(message)
+
+ for (var/obj/O in view(message_range, src))
+ spawn (0)
+ if (O)
+ O.hear_talk(src, message)
+
+ var/list/listening = hearers(message_range, src)
+ listening -= src
+ listening += src
+ var/list/eavesdropping = hearers(2, src)
+ eavesdropping -= src
+ eavesdropping -= listening
+ var/list/watching = hearers(5, src)
+ watching -= src
+ watching -= listening
+ watching -= eavesdropping
+
+ var/list/heard_a = list() // understood us
+ var/list/heard_b = list() // didn't understand us
+
+ for (var/mob/M in listening)
+ if (M.say_understands(src))
+ heard_a += M
+ else
+ heard_b += M
+
+ var/rendered = null
+
+ for (var/mob/M in watching)
+ if ( (M.say_understands(src) && !is_speaking_taj) || istype(M,/mob/living/carbon/human/tajaran) )
+ rendered = "[src.name] whispers something."
+ else
+ rendered = "[src.voice_name] whispers something."
+ M.show_message(rendered, 2)
+
+ if (length(heard_a))
+ var/message_a = message
+
+ if (italics)
+ message_a = "[message_a]"
+ //This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically.
+ if (!istype(src, /mob/living/carbon/human))
+ rendered = "[name] whispers, \"[message_a]\""
+ else if (istype(wear_mask, /obj/item/clothing/mask/gas/voice))
+ if (wear_mask:vchange)
+ rendered = "[wear_mask:voice] whispers, \"[message_a]\""
+ else
+ rendered = "[name] whispers, \"[message_a]\""
+ else
+ rendered = "[real_name][alt_name] whispers, \"[message_a]\""
+
+ for (var/mob/M in heard_a)
+ M.show_message(rendered, 2)
+
+ if (length(heard_b))
+ var/message_b
+
+ if (src.voice_message)
+ message_b = src.voice_message
+ else
+ message_b = stars(message)
+
+ if (italics)
+ message_b = "[message_b]"
+
+ rendered = "[src.voice_name] whispers, \"[message_b]\""
+
+ for (var/mob/M in heard_b)
+ M.show_message(rendered, 2)
+
+ for (var/mob/M in eavesdropping)
+ if (M.say_understands(src))
+ var/message_c
+ message_c = stars(message)
+ if (!istype(src, /mob/living/carbon/human))
+ rendered = "[name] whispers, \"[message_c]\""
+ else if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
+ if(wear_mask:vchange)
+ rendered = "[wear_mask:voice] whispers, \"[message_c]\""
+ else
+ rendered = "[name] whispers, \"[message_c]\""
+ else
+ rendered = "[real_name][alt_name] whispers, \"[message_c]\""
+ M.show_message(rendered, 2)
+ else
+ rendered = "[src.voice_name] whispers something."
+ M.show_message(rendered, 2)
+
+ if (italics)
+ message = "[message]"
+
+ if (!istype(src, /mob/living/carbon/human))
+ rendered = "[name] whispers, \"[message]\""
+ else if (istype(src.wear_mask, /obj/item/clothing/mask/gas/voice))
+ if(wear_mask:vchange)
+ rendered = "[wear_mask:voice] whispers, \"[message]\""
+ else
+ rendered = "[name] whispers, \"[message]\""
+ else
+ rendered = "[real_name][alt_name] whispers, \"[message]\""
+
+ for (var/mob/M in world)
+ if (istype(M, /mob/new_player))
+ continue
+ if (M.stat > 1 && !(M in heard_a))
+ M.show_message(rendered, 2)
diff --git a/code/WorkInProgress/organs/organs.dm b/code/WorkInProgress/organs/organs.dm
index f2011005b45..a7b7c16d079 100644
--- a/code/WorkInProgress/organs/organs.dm
+++ b/code/WorkInProgress/organs/organs.dm
@@ -265,6 +265,7 @@ the mob is also allowed to move without any sort of restriction. For instance, i
var/brainloss = 0//Carbon
var/robot_talk_understand = 0
var/alien_talk_understand = 0
+ var/taj_talk_understand = 0
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
var/ear_deaf = null//Carbon
var/eye_blind = null//Carbon
diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm
index 0119cbbf265..0b8320cc8cd 100644
--- a/code/defines/mob/mob.dm
+++ b/code/defines/mob/mob.dm
@@ -231,6 +231,7 @@
var/robot_talk_understand = 0
var/alien_talk_understand = 0
+ var/taj_talk_understand = 0
/*For ninjas and others. This variable is checked when a mob moves and I guess it was supposed to allow the mob to move
through dense areas, such as walls. Setting density to 0 does the same thing. The difference here is that
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index f94090c71a7..f701ba2a0ab 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -387,7 +387,6 @@
if(istype(src, /mob/living/carbon/metroid))
presay = "metroid"
*/
- world << "\blue rendered: \"[rendered]\""
for (var/mob/M in heard_a)
M.show_message(rendered, 2)