From 32a37c6001d3db3aa37bfff1ac1d3dddc08bd06a Mon Sep 17 00:00:00 2001 From: CaelAislinn Date: Mon, 6 Feb 2012 21:27:27 +1000 Subject: [PATCH] fixed taj speak and taj whisper (not working over radio chat). use :j after the radio/headset commands to speak or whisper in tajaran (only taj mobs can speak / understand it) Signed-off-by: CaelAislinn --- baystation12.dme | 1 + .../WorkInProgress/Cael_Aislinn/Tajara/say.dm | 60 ++---- .../Cael_Aislinn/Tajara/tajaran.dm | 4 + .../Cael_Aislinn/Tajara/whisper.dm | 171 ++++++++++++++++++ code/WorkInProgress/organs/organs.dm | 1 + code/defines/mob/mob.dm | 1 + code/modules/mob/living/say.dm | 1 - 7 files changed, 197 insertions(+), 42 deletions(-) create mode 100644 code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm 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)