mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-29 16:10:02 +01:00
Merge branch 'master' into final_shuttle_touches_and_stuff
This commit is contained in:
@@ -1784,7 +1784,14 @@ Follow by example and make good judgement based on length which list to include
|
||||
skrell_spots
|
||||
name = "Skrell Spots"
|
||||
icon_state = "skrell_gradient_spots"
|
||||
species_allowed = list(/datum/species/skrell, /datum/species/skrell/axiori)
|
||||
species_allowed = list(/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell)
|
||||
|
||||
skrell_stripes
|
||||
name = "Skrell Headtail Blotches"
|
||||
icon_state = "skr_headtail_stripes"
|
||||
species_allowed = list(/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell)
|
||||
|
||||
|
||||
|
||||
bulwark_default
|
||||
name = "Bulwark Horn"
|
||||
@@ -1809,7 +1816,7 @@ Follow by example and make good judgement based on length which list to include
|
||||
icon_state = "bald"
|
||||
gender = NEUTER
|
||||
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi,
|
||||
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell,/datum/species/diona,
|
||||
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell,/datum/species/diona,
|
||||
/datum/species/diona/coeu, /datum/species/bug/type_b)
|
||||
|
||||
threeOclock
|
||||
@@ -2578,7 +2585,7 @@ Follow by example and make good judgement based on length which list to include
|
||||
icon_state = "hair_swoop"
|
||||
length = 2
|
||||
chatname = "styled mane"
|
||||
|
||||
|
||||
taj_ears_swoop_alt
|
||||
name = "Tajara Swoop Alt"
|
||||
icon_state = "hair_swoop_alt"
|
||||
@@ -2971,14 +2978,14 @@ Follow by example and make good judgement based on length which list to include
|
||||
icon_state = "bully_inj_left"
|
||||
chatname = "antenna"
|
||||
length = 1
|
||||
|
||||
bulwark_damaged_right
|
||||
|
||||
bulwark_damaged_right
|
||||
name = "Bulwark Injured Antenna, Right"
|
||||
icon_state = "bully_inj_right"
|
||||
chatname = "antenna"
|
||||
length = 1
|
||||
|
||||
bulwark_knight
|
||||
bulwark_knight
|
||||
name = "Bulwark Knight Antennae"
|
||||
icon_state = "bully_knight"
|
||||
chatname = "antennae"
|
||||
@@ -3542,11 +3549,11 @@ Follow by example and make good judgement based on length which list to include
|
||||
name = "Bulldog Mandibles"
|
||||
icon_state = "vaurca_bulldog"
|
||||
|
||||
mantis
|
||||
mantis
|
||||
name = "Mantis Mandibles"
|
||||
icon_state = "vaurca_mantis"
|
||||
|
||||
stag
|
||||
stag
|
||||
name = "Stag Mandibles"
|
||||
icon_state = "vaurca_stag"
|
||||
|
||||
@@ -3554,11 +3561,11 @@ Follow by example and make good judgement based on length which list to include
|
||||
name = "Ectatomma Mandibles"
|
||||
icon_state = "vaurca_ectatomma"
|
||||
|
||||
horridus
|
||||
horridus
|
||||
name = "Horridus Mandibles"
|
||||
icon_state = "vaurca_horridus"
|
||||
|
||||
tusks
|
||||
tusks
|
||||
name = "Tusk Mandibles"
|
||||
icon_state = "vaurca_tusks"
|
||||
|
||||
@@ -3566,7 +3573,7 @@ Follow by example and make good judgement based on length which list to include
|
||||
name = "Acanthognathus Mandibles"
|
||||
icon_state = "vaurca_acanthognathus"
|
||||
|
||||
myrmoteras
|
||||
myrmoteras
|
||||
name = "Myrmoteras Mandibles"
|
||||
icon_state = "vaurca_myrmoteras"
|
||||
|
||||
@@ -4562,7 +4569,7 @@ Follow by example and make good judgement based on length which list to include
|
||||
name = "Axiori Eyes"
|
||||
icon_state = "skr_axiori_eyes"
|
||||
body_parts = list(BP_HEAD)
|
||||
species_allowed = list(/datum/species/skrell, /datum/species/zombie/skrell)
|
||||
species_allowed = list(/datum/species/skrell, /datum/species/zombie/skrell,/datum/species/zombie/skrell)
|
||||
do_colouration = FALSE
|
||||
|
||||
skr_arms
|
||||
@@ -4571,6 +4578,41 @@ Follow by example and make good judgement based on length which list to include
|
||||
body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
skr_blotch_arms
|
||||
name = "Skrell Arm Blotches"
|
||||
icon = 'icons/mob/human_races/markings_skrell.dmi'
|
||||
icon_state = "skr_blotch_arms"
|
||||
body_parts = list(BP_L_ARM,BP_R_ARM)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
skr_blotch_leg
|
||||
name = "Skrell Leg Blotches"
|
||||
icon = 'icons/mob/human_races/markings_skrell.dmi'
|
||||
icon_state = "skr_blotch_legs"
|
||||
body_parts = list(BP_L_LEG,BP_R_LEG)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
skr_back_stripes
|
||||
name = "Skrell Back Stripes"
|
||||
icon = 'icons/mob/human_races/markings_skrell.dmi'
|
||||
icon_state = "skr_back_stripes"
|
||||
body_parts = list(BP_CHEST)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
skr_stomach
|
||||
name = "Skrell Stomach"
|
||||
icon = 'icons/mob/human_races/markings_skrell.dmi'
|
||||
icon_state = "skr_stomach"
|
||||
body_parts = list(BP_CHEST)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
skr_chin
|
||||
name = "Skrell Chin"
|
||||
icon = 'icons/mob/human_races/markings_skrell.dmi'
|
||||
icon_state = "skr_chin"
|
||||
body_parts = list(BP_HEAD)
|
||||
species_allowed = list(/datum/species/skrell,/datum/species/skrell/axiori,/datum/species/zombie/skrell)
|
||||
|
||||
diona_leaves
|
||||
name = "Diona Leaves"
|
||||
icon = 'icons/mob/human_races/markings_diona.dmi'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/abstract/observer/say(var/message)
|
||||
/mob/abstract/observer/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if (!message)
|
||||
return
|
||||
|
||||
|
||||
@@ -156,10 +156,12 @@
|
||||
/datum/language/proc/check_special_condition(var/mob/other)
|
||||
return 1
|
||||
|
||||
/datum/language/proc/get_spoken_verb(var/msg_end, var/pre_end, var/singing = FALSE)
|
||||
/datum/language/proc/get_spoken_verb(var/msg_end, var/pre_end, var/singing = FALSE, var/whisper = FALSE)
|
||||
var/chosen_verb = speech_verb
|
||||
if(singing)
|
||||
return pick(sing_verb)
|
||||
if(whisper)
|
||||
return pick(whisper_verb)
|
||||
switch(msg_end)
|
||||
if("!")
|
||||
if(pre_end == "!" || pre_end == "?")
|
||||
|
||||
@@ -161,10 +161,8 @@
|
||||
return
|
||||
return attack_hand(user)
|
||||
|
||||
/mob/living/bot/say(var/message)
|
||||
var/verb = "beeps"
|
||||
|
||||
..(message, null, verb)
|
||||
/mob/living/bot/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
..(message, null, "beeps")
|
||||
|
||||
/mob/living/bot/Collide(atom/A)
|
||||
if(on && botcard && istype(A, /obj/machinery/door))
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
//TODO: Convert this over for languages.
|
||||
/mob/living/carbon/brain/say(var/message)
|
||||
/mob/living/carbon/brain/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if (silent)
|
||||
return
|
||||
|
||||
if(!(container && istype(container, /obj/item/device/mmi)))
|
||||
return //No MMI, can't speak, bucko./N
|
||||
else
|
||||
var/datum/language/speaking = parse_language(message)
|
||||
speaking = parse_language(message)
|
||||
if(speaking)
|
||||
message = copytext(message, 2+length(speaking.key))
|
||||
var/verb = "says"
|
||||
var/ending = copytext(message, length(message))
|
||||
var/pre_ending = copytext(message, length(message) - 1, length(message))
|
||||
if (speaking)
|
||||
|
||||
@@ -109,12 +109,12 @@
|
||||
for it but just ignore it.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE)
|
||||
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE, var/whisper = FALSE)
|
||||
var/ending = copytext(message, length(message))
|
||||
var/pre_ending = copytext(message, length(message) - 1, length(message))
|
||||
|
||||
if(speaking)
|
||||
. = speaking.get_spoken_verb(ending, pre_ending, singing)
|
||||
. = speaking.get_spoken_verb(ending, pre_ending, singing, whisper)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -161,9 +161,9 @@
|
||||
return headsets[headsets[1]]
|
||||
return null
|
||||
|
||||
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio)
|
||||
if(paralysis || InStasis())
|
||||
whisper_say(message, speaking, alt_name)
|
||||
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
if(!whisper && (paralysis || InStasis()))
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
switch(message_mode)
|
||||
if("intercom")
|
||||
@@ -218,8 +218,8 @@
|
||||
if(R.talk_into(src,message,null,verb,speaking))
|
||||
successful_radio += R
|
||||
if("whisper")
|
||||
whisper_say(message, speaking, alt_name)
|
||||
return 1
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
else if(message_mode)
|
||||
var/obj/item/device/radio/R = get_radio()
|
||||
if(R)
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
BP_KIDNEYS = /obj/item/organ/internal/kidneys/skrell,
|
||||
BP_BRAIN = /obj/item/organ/internal/brain/skrell,
|
||||
BP_STOMACH = /obj/item/organ/internal/stomach,
|
||||
BP_APPENDIX = /obj/item/organ/internal/appendix,
|
||||
BP_EYES = /obj/item/organ/internal/eyes/skrell
|
||||
)
|
||||
|
||||
|
||||
@@ -1,159 +0,0 @@
|
||||
//Lallander was here
|
||||
/mob/living/carbon/human/whisper(message as text)
|
||||
var/alt_name = ""
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
message = sanitize(message)
|
||||
|
||||
if (client && client.handle_spam_prevention(message,MUTE_IC))
|
||||
return
|
||||
|
||||
if (src.stat == 2)
|
||||
return src.say_dead(message)
|
||||
|
||||
if (src.stat)
|
||||
return
|
||||
|
||||
if(name != GetVoice())
|
||||
alt_name = "(as [get_id_name("Unknown")])"
|
||||
|
||||
//parse the language code and consume it
|
||||
var/datum/language/speaking = parse_language(message)
|
||||
if (speaking)
|
||||
message = copytext(message,2+length(speaking.key))
|
||||
|
||||
whisper_say(message, speaking, alt_name)
|
||||
|
||||
|
||||
//This is used by both the whisper verb and human/say() to handle whispering
|
||||
/mob/living/carbon/human/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/whisper_text = "whispers")
|
||||
|
||||
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
return
|
||||
|
||||
var/message_range = 1
|
||||
var/eavesdropping_range = 2
|
||||
var/watching_range = 5
|
||||
var/italics = 1
|
||||
|
||||
var/not_heard //the message displayed to people who could not hear the whispering
|
||||
if(speaking)
|
||||
if(speaking.whisper_verb)
|
||||
whisper_text = pick(speaking.whisper_verb)
|
||||
not_heard = "[whisper_text] something"
|
||||
else
|
||||
var/adverb = pick("quietly", "softly")
|
||||
whisper_text = "[speaking.speech_verb] [adverb]"
|
||||
not_heard = "[speaking.speech_verb] something [adverb]"
|
||||
else
|
||||
not_heard = "[whisper_text] something"
|
||||
|
||||
message = capitalize(trim(message))
|
||||
|
||||
if(speech_problem_flag)
|
||||
var/list/handle_r = handle_speech_problems(message)
|
||||
message = handle_r[1]
|
||||
whisper_text = handle_r[2]
|
||||
var/adverb = pick("quietly", "softly")
|
||||
whisper_text = "[whisper_text] [adverb]"
|
||||
|
||||
speech_problem_flag = handle_r[3]
|
||||
|
||||
if(!message || message=="")
|
||||
return
|
||||
|
||||
log_whisper("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src))
|
||||
|
||||
//looks like this only appears in whisper. Should it be elsewhere as well? Maybe handle_speech_problems?
|
||||
var/voice_sub
|
||||
if(istype(back,/obj/item/rig))
|
||||
var/obj/item/rig/rig = back
|
||||
// todo: fix this shit
|
||||
if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice)
|
||||
voice_sub = rig.speech.voice_holder.voice
|
||||
else
|
||||
for(var/obj/item/gear in list(wear_mask,wear_suit,head))
|
||||
if(!gear)
|
||||
continue
|
||||
var/obj/item/voice_changer/changer = locate() in gear
|
||||
if(changer && changer.active && changer.voice)
|
||||
voice_sub = changer.voice
|
||||
|
||||
if(voice_sub == "Unknown")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
var/list/temp_message = 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 = jointext(temp_message, " ")
|
||||
message = replacetext(message, "o", "¤")
|
||||
message = replacetext(message, "p", "ž")
|
||||
message = replacetext(message, "l", "£")
|
||||
message = replacetext(message, "s", "§")
|
||||
message = replacetext(message, "u", "µ")
|
||||
message = replacetext(message, "b", "ß")
|
||||
|
||||
var/list/listening = hearers(message_range, src)
|
||||
listening |= src
|
||||
|
||||
//ghosts
|
||||
for (var/mob/M in dead_mob_list) //does this include players who joined as observers as well?
|
||||
if (!(M.client))
|
||||
continue
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
|
||||
listening |= M
|
||||
|
||||
//Pass whispers on to anything inside the immediate listeners.
|
||||
for(var/mob/L in listening)
|
||||
for(var/mob/C in L.contents)
|
||||
if(istype(C,/mob/living))
|
||||
listening += C
|
||||
|
||||
//pass on the message to objects that can hear us.
|
||||
for (var/obj/O in view(message_range, src))
|
||||
spawn (0)
|
||||
if (O)
|
||||
O.hear_talk(src, message, whisper_text, speaking)
|
||||
|
||||
var/list/eavesdropping = hearers(eavesdropping_range, src)
|
||||
eavesdropping -= src
|
||||
eavesdropping -= listening
|
||||
|
||||
var/list/watching = hearers(watching_range, src)
|
||||
watching -= src
|
||||
watching -= listening
|
||||
watching -= eavesdropping
|
||||
|
||||
//now mobs
|
||||
|
||||
var/list/listening_clients = list() // The clients we're going to show the speech bubble to.
|
||||
|
||||
for(var/mob/M in listening)
|
||||
M.hear_say(message, whisper_text, speaking, alt_name, italics, src)
|
||||
if (M.client)
|
||||
listening_clients += M.client
|
||||
|
||||
if (eavesdropping.len)
|
||||
var/new_message = stars(message) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less.
|
||||
for(var/mob/M in eavesdropping)
|
||||
M.hear_say(new_message, whisper_text, speaking, alt_name, italics, src)
|
||||
if (M.client)
|
||||
listening_clients += M.client
|
||||
|
||||
var/speech_bubble_test = say_test(message)
|
||||
var/image/speech_bubble = image(get_talk_bubble(),src,"h[speech_bubble_test]")
|
||||
INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, speech_bubble, listening_clients, 30)
|
||||
|
||||
if (watching.len)
|
||||
var/rendered = "<span class='game say'><span class='name'>[src.name]</span> [not_heard].</span>"
|
||||
for (var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/carbon/slime/say(var/message)
|
||||
|
||||
var/verb = say_quote(message)
|
||||
/mob/living/carbon/slime/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
verb = say_quote(message)
|
||||
|
||||
if(copytext(message,1,2) == "*")
|
||||
return emote(copytext(message,2))
|
||||
|
||||
@@ -103,7 +103,7 @@ var/controlling
|
||||
qdel(src)
|
||||
|
||||
// When a meme speaks, it speaks through its host
|
||||
/mob/living/parasite/meme/say(message as text)
|
||||
/mob/living/parasite/meme/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(dormant)
|
||||
to_chat(src, "<span class='notice'>You are dormant! </span>")
|
||||
return
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
real_name = "host brain"
|
||||
universal_understand = 1
|
||||
|
||||
/mob/living/parasite/captive_brain/say(var/message)
|
||||
/mob/living/parasite/captive_brain/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(istype(src.loc,/mob/living/parasite/meme))
|
||||
|
||||
if (!message)
|
||||
|
||||
@@ -124,12 +124,15 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
returns[4] = world.view
|
||||
return returns
|
||||
|
||||
/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio)
|
||||
/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
if(message_mode == "intercom")
|
||||
for(var/obj/item/device/radio/intercom/I in view(1, null))
|
||||
used_radios += I
|
||||
if(I.talk_into(src, message, verb, speaking))
|
||||
successful_radio += I
|
||||
if(message_mode == "whisper" && !whisper)
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
return 0
|
||||
|
||||
/mob/living/proc/handle_speech_sound()
|
||||
@@ -153,7 +156,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
return FONT_SIZE_LARGE
|
||||
return null
|
||||
|
||||
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR)
|
||||
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(stat)
|
||||
if(stat == DEAD)
|
||||
return say_dead(message)
|
||||
@@ -177,13 +180,15 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
message = trim(message)
|
||||
message = formalize_text(message)
|
||||
|
||||
var/had_speaking = !!speaking
|
||||
//parse the language code and consume it
|
||||
if(!speaking || speaking.always_parse_language)
|
||||
speaking = parse_language(message)
|
||||
if(speaking)
|
||||
message = copytext(message,2+length(speaking.key))
|
||||
else
|
||||
speaking = get_default_language()
|
||||
if(!had_speaking)
|
||||
if(speaking)
|
||||
message = copytext(message,2+length(speaking.key))
|
||||
else
|
||||
speaking = get_default_language()
|
||||
|
||||
if(speaking)
|
||||
var/list/speech_mod = speaking.handle_message_mode(message_mode)
|
||||
@@ -205,7 +210,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
speaking.broadcast(src,trim(message))
|
||||
return 1
|
||||
|
||||
verb = say_quote(message, speaking, is_singing)
|
||||
verb = say_quote(message, speaking, is_singing, whisper)
|
||||
|
||||
if(is_muzzled())
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
@@ -240,7 +245,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
|
||||
var/list/obj/item/used_radios = new
|
||||
var/list/successful_radio = new // passes a list because standard vars don't work when passed
|
||||
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio))
|
||||
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper))
|
||||
return 1
|
||||
|
||||
var/list/handle_v = handle_speech_sound()
|
||||
@@ -269,6 +274,10 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
var/list/listening_obj = list()
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
if(whisper)
|
||||
message_range = 1
|
||||
italics = TRUE
|
||||
|
||||
if(T)
|
||||
if(!speaking || !(speaking.flags & PRESSUREPROOF))
|
||||
//make sure the air can transmit speech - speaker's side
|
||||
@@ -305,7 +314,11 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
if(mind)
|
||||
mind.last_words = message
|
||||
|
||||
log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src))
|
||||
if(whisper)
|
||||
log_whisper("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src))
|
||||
else
|
||||
log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src))
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/proc/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/pai/say(var/msg)
|
||||
/mob/living/silicon/pai/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(silence_time)
|
||||
to_chat(src, "<font color=green>Communication circuits remain uninitialized.</font>")
|
||||
else
|
||||
..(msg)
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
|
||||
/mob/living/silicon/robot/handle_speech_problems(var/message, var/verb, var/message_mode)
|
||||
var/speech_problem_flag = FALSE
|
||||
//Handle gibberish when components are damaged
|
||||
@@ -23,22 +20,28 @@
|
||||
returns[4] = world.view
|
||||
return returns
|
||||
|
||||
/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
..()
|
||||
/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
if(message_mode == "whisper" && !whisper)
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
if(message_mode)
|
||||
if(!is_component_functioning("radio"))
|
||||
to_chat(src, SPAN_WARNING("Your radio isn't functional at this time."))
|
||||
return 0
|
||||
if(message_mode == "general")
|
||||
message_mode = null
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
return common_radio.talk_into(src, message, message_mode, verb, speaking)
|
||||
|
||||
/mob/living/silicon/robot/drone/handle_message_mode()
|
||||
return null
|
||||
|
||||
/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
..()
|
||||
/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
if(message_mode == "whisper" && !whisper)
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
if(message_mode == "department")
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
return holopad_talk(message, verb, speaking)
|
||||
else if(message_mode)
|
||||
if(ai_radio.disabledAi || ai_restore_power_routine || stat)
|
||||
@@ -46,16 +49,24 @@
|
||||
return FALSE
|
||||
if(message_mode == "general")
|
||||
message_mode = null
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
return ai_radio.talk_into(src, message, message_mode, verb, speaking)
|
||||
|
||||
/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
..()
|
||||
/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
if(message_mode)
|
||||
if(message_mode == "whisper" && !whisper)
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
if(message_mode == "general")
|
||||
message_mode = null
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
return radio.talk_into(src, message, message_mode, verb, speaking)
|
||||
|
||||
/mob/living/silicon/say_quote(var/text)
|
||||
/mob/living/silicon/say_quote(var/text, var/datum/language/speaking = null, var/singing = FALSE, var/whisper = FALSE)
|
||||
if(singing)
|
||||
return "sings"
|
||||
if(whisper)
|
||||
return "whispers"
|
||||
var/ending = copytext(text, length(text))
|
||||
if(ending == "?")
|
||||
return speak_query
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/datum/progressbar/resist_bar
|
||||
var/resist_start_time = 0
|
||||
|
||||
/mob/living/captive_brain/say(var/message)
|
||||
/mob/living/captive_brain/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(istype(src.loc,/mob/living/simple_animal/borer))
|
||||
if(!message)
|
||||
return
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/simple_animal/borer/say(var/message)
|
||||
/mob/living/simple_animal/borer/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
message = capitalize(message)
|
||||
|
||||
if(!message)
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
var/health_prefix = ""
|
||||
appearance_flags = NO_CLIENT_COLOR|KEEP_TOGETHER
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/cultify()
|
||||
return
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
speak_emote = list("beeps","clicks","chirps")
|
||||
universal_understand = TRUE
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/spiderbot/Initialize()
|
||||
. = ..()
|
||||
add_language(LANGUAGE_TCB)
|
||||
@@ -314,8 +316,12 @@
|
||||
/mob/living/simple_animal/spiderbot/get_bullet_impact_effect_type(var/def_zone)
|
||||
return BULLET_IMPACT_METAL
|
||||
|
||||
/mob/living/simple_animal/spiderbot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
/mob/living/simple_animal/spiderbot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
|
||||
switch(message_mode)
|
||||
if("whisper")
|
||||
if(!whisper)
|
||||
whisper(message, speaking)
|
||||
return TRUE
|
||||
if("headset")
|
||||
radio.talk_into(src, message, null, verb, speaking)
|
||||
used_radios += radio
|
||||
@@ -345,4 +351,4 @@
|
||||
|
||||
/mob/living/simple_animal/spiderbot/ai/Initialize()
|
||||
. = ..()
|
||||
internal_id.access = get_all_station_access()
|
||||
internal_id.access = get_all_station_access()
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
destroy_surroundings = FALSE
|
||||
attack_emote = "blares a tiny siren"
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/commanded/baby_harvester/get_bullet_impact_effect_type(var/def_zone)
|
||||
return BULLET_IMPACT_METAL
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
|
||||
flying = TRUE
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/Allow_Spacemove(var/check_drift = 0)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
pass_flags = PASSTABLE
|
||||
attack_emote = "focuses on"
|
||||
var/mob/living/simple_animal/hostile/hivebotbeacon/linked_parent = null
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override)
|
||||
INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration)
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
var/list/close_destinations = list()
|
||||
var/area/latest_area
|
||||
attack_emote = "focuses on"
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebotbeacon/incendiary
|
||||
projectiletype = /obj/item/projectile/beam/hivebot/incendiary
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
mob_bump_flag = HEAVY
|
||||
mob_swap_flags = ~HEAVY
|
||||
mob_push_flags = 0
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/hivebotharvester/Initialize(mapload,mob/living/simple_animal/hostile/hivebot/hivebotbeacon)
|
||||
if(hivebotbeacon)
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_NOLIGHTING
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/icarus_drone/Initialize()
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
var/is_punishing = FALSE
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/krampus/death(gibbed)
|
||||
..()
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
light_range = 10
|
||||
light_wedge = LIGHT_WIDE
|
||||
see_in_dark = 8
|
||||
psi_pingable = FALSE
|
||||
|
||||
faction = "sol"
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
mob_size = MOB_TINY
|
||||
var/image/eye_overlay
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/rogue_drone/Initialize()
|
||||
. = ..()
|
||||
name = "[initial(name)] ([rand(100, 999)])"
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
faction = "carp"
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
|
||||
var/crystal_harvested = FALSE
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/vannatusk/Initialize()
|
||||
. = ..()
|
||||
set_light(1.2, 3, LIGHT_COLOR_BLUE)
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
flying = TRUE
|
||||
attack_emote = "buzzes at"
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator/death()
|
||||
..(null,"is smashed into pieces!")
|
||||
var/T = get_turf(src)
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
var/atom/movable/copying = null // The thing we're trying to look like.
|
||||
var/realistic = FALSE // If true, things like bullets and weapons will hit it, to be a bit more convincing from a distance.
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/illusion/update_icon() // We don't want the appearance changing AT ALL unless by copy_appearance().
|
||||
return
|
||||
|
||||
|
||||
@@ -694,12 +694,11 @@
|
||||
available_channels = list(":e")
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/parrot/say(var/message)
|
||||
/mob/living/simple_animal/parrot/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
|
||||
if(stat)
|
||||
return
|
||||
|
||||
var/verb = "says"
|
||||
if(speak_emote.len)
|
||||
verb = pick(speak_emote)
|
||||
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
appearance_flags = NO_CLIENT_COLOR|KEEP_TOGETHER
|
||||
var/obj/item/residue = /obj/item/ectoplasm
|
||||
|
||||
psi_pingable = FALSE
|
||||
|
||||
/mob/living/simple_animal/shade/cultify()
|
||||
return
|
||||
|
||||
@@ -208,7 +210,7 @@
|
||||
heard_dying_message = 0
|
||||
to_chat(src, "<span class='notice'>The soothing echoes of life reinvigorate you.</span>")
|
||||
|
||||
/mob/living/simple_animal/shade/bluespace/say(var/message)
|
||||
/mob/living/simple_animal/shade/bluespace/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(!possessive)
|
||||
var/list/words_in_memory = dd_text2List(last_message_heard, " ")
|
||||
var/list/words_in_message = dd_text2List(message, " ")
|
||||
|
||||
@@ -134,6 +134,8 @@
|
||||
|
||||
var/list/butchering_products //if anything else is created when butchering this creature, like bones and leather
|
||||
|
||||
var/psi_pingable = TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/proc/update_nutrition_stats()
|
||||
nutrition_step = mob_size * 0.03 * metabolic_factor
|
||||
@@ -752,8 +754,7 @@
|
||||
/mob/living/simple_animal/proc/reset_sound_time()
|
||||
sound_time = TRUE
|
||||
|
||||
/mob/living/simple_animal/say(var/message)
|
||||
var/verb = "says"
|
||||
/mob/living/simple_animal/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
if(speak_emote.len)
|
||||
verb = pick(speak_emote)
|
||||
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/mob/living/verb/whisper_verb(message as text)
|
||||
set name = "Whisper"
|
||||
set category = "IC"
|
||||
|
||||
if(say_disabled)
|
||||
to_chat(usr, SPAN_WARNING("Speech is currently admin-disabled."))
|
||||
return
|
||||
|
||||
message = sanitize(message)
|
||||
message = formalize_text(message)
|
||||
|
||||
set_typing_indicator(0)
|
||||
|
||||
if(client.handle_spam_prevention(message, MUTE_IC))
|
||||
return
|
||||
|
||||
whisper(message)
|
||||
|
||||
/mob/living/proc/whisper(var/message, var/datum/language/speaking)
|
||||
if(is_muzzled())
|
||||
to_chat(src, SPAN_DANGER("You're muzzled and cannot speak!"))
|
||||
return
|
||||
|
||||
speaking = speaking ? speaking : parse_language(message)
|
||||
|
||||
var/message_range = 1
|
||||
var/eavesdropping_range = 2
|
||||
var/watching_range = 5
|
||||
|
||||
var/whisper_text = "whispers"
|
||||
var/not_heard = "[whisper_text] something"
|
||||
if(speaking)
|
||||
if(speaking.whisper_verb)
|
||||
whisper_text = pick(speaking.whisper_verb)
|
||||
not_heard = "[whisper_text] something"
|
||||
else
|
||||
var/adverb = pick("quietly", "softly")
|
||||
whisper_text = "[speaking.speech_verb] [adverb]"
|
||||
not_heard = "[speaking.speech_verb] something [adverb]"
|
||||
|
||||
var/list/listening = list(src)
|
||||
|
||||
//ghosts
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
|
||||
listening |= M
|
||||
|
||||
//Pass whispers on to anything inside the immediate listeners.
|
||||
for(var/mob/L in listening)
|
||||
for(var/mob/living/C in L.contents)
|
||||
listening += C
|
||||
|
||||
var/list/eavesdropping = list()
|
||||
var/list/watching = list()
|
||||
|
||||
var/list/all_in_range = hearers(watching_range, src)
|
||||
for(var/mob/M as anything in all_in_range)
|
||||
if(get_dist(src, M) <= message_range)
|
||||
listening |= M
|
||||
else if(get_dist(src, M) <= eavesdropping_range)
|
||||
eavesdropping += M
|
||||
else if(get_dist(src, M) <= watching_range)
|
||||
watching += M
|
||||
|
||||
if(length(eavesdropping))
|
||||
var/new_message = stars(message)
|
||||
for(var/mob/M in eavesdropping)
|
||||
M.hear_say(new_message, "whispers", speaking, "", TRUE, src)
|
||||
|
||||
if(length(watching))
|
||||
var/rendered = "<span class='game say'><span class='name'>[src.name]</span> [not_heard].</span>"
|
||||
for (var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
say(message, speaking, whisper_text, whisper = TRUE)
|
||||
@@ -1,9 +1,4 @@
|
||||
/mob/proc/say()
|
||||
return
|
||||
|
||||
/mob/verb/whisper()
|
||||
set name = "Whisper"
|
||||
set category = "IC"
|
||||
/mob/proc/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
|
||||
return
|
||||
|
||||
/mob/verb/say_verb(message as text)
|
||||
@@ -11,7 +6,7 @@
|
||||
set category = "IC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>")
|
||||
to_chat(usr, SPAN_WARNING("Speech is currently admin-disabled."))
|
||||
return
|
||||
|
||||
message = sanitize(message)
|
||||
@@ -101,10 +96,12 @@
|
||||
for it but just ignore it.
|
||||
*/
|
||||
|
||||
/mob/proc/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE)
|
||||
/mob/proc/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE, var/whisper = FALSE)
|
||||
. = "says"
|
||||
if(singing)
|
||||
return "sings"
|
||||
if(whisper)
|
||||
return "whispers"
|
||||
var/ending = copytext(message, length(message))
|
||||
var/pre_ending = copytext(message, length(message) - 1, length(message))
|
||||
if(ending == "!")
|
||||
|
||||
Reference in New Issue
Block a user