Merge upstream

This commit is contained in:
Cyberboss
2017-04-02 22:27:22 -04:00
165 changed files with 152811 additions and 8563 deletions
+2 -2
View File
@@ -19,8 +19,6 @@ var/global/static/observer_default_invisibility = INVISIBILITY_OBSERVER
see_invisible = SEE_INVISIBLE_OBSERVER
see_in_dark = 100
invisibility = INVISIBILITY_OBSERVER
languages_spoken = ALL
languages_understood = ALL
var/can_reenter_corpse
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
@@ -123,6 +121,8 @@ var/global/static/observer_default_invisibility = INVISIBILITY_OBSERVER
verbs -= /mob/dead/observer/verb/possess
animate(src, pixel_y = 2, time = 10, loop = -1)
grant_all_languages()
..()
/mob/dead/observer/narsie_act()
+7 -4
View File
@@ -8,15 +8,18 @@
. = src.say_dead(message)
/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans)
var/atom/movable/to_follow = speaker
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
if(isAI(V.source))
var/mob/living/silicon/ai/S = V.source
speaker = S.eyeobj
to_follow = S.eyeobj
else
speaker = V.source
var/link = FOLLOW_LINK(src, speaker)
to_follow = V.source
var/link = FOLLOW_LINK(src, to_follow)
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans)
to_chat(src, "[link] [message]")
-2
View File
@@ -1,5 +1,3 @@
/obj/item/device/mmi
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity, that nevertheless has become standard-issue on Nanotrasen stations."
+1 -3
View File
@@ -1,8 +1,6 @@
/mob/living/brain
languages_spoken = HUMAN
languages_understood = HUMAN
var/obj/item/device/mmi/container = null
var/timeofhostdeath = 0
var/emp_damage = 0//Handles a type of MMI damage
@@ -64,4 +62,4 @@
/mob/living/brain/fully_replace_character_name(oldname,newname)
..()
if(stored_dna)
stored_dna.real_name = real_name
stored_dna.real_name = real_name
+5 -2
View File
@@ -25,7 +25,7 @@ var/global/posibrain_notif_cooldown = 0
Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.</b>"
var/new_mob_message = "<span class='notice'>The positronic brain chimes quietly.</span>"
var/dead_message = "<span class='deadsay'>It appears to be completely inactive. The reset light is blinking.</span>"
var/list/fluff_names = list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD")
var/list/fluff_names
var/picked_fluff_name //which fluff name we picked
@@ -135,7 +135,10 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/New()
brainmob = new(src)
picked_fluff_name = pick(fluff_names)
if(!fluff_names || !fluff_names.len)
picked_fluff_name = pick(posibrain_names)
else
picked_fluff_name = pick(fluff_names)
brainmob.name = "[picked_fluff_name]-[rand(100, 999)]"
brainmob.real_name = brainmob.name
brainmob.loc = src
+13 -4
View File
@@ -1,4 +1,4 @@
/mob/living/brain/say(message)
/mob/living/brain/say(message, language)
if(!(container && istype(container, /obj/item/device/mmi)))
return //No MMI, can't speak, bucko./N
else
@@ -7,16 +7,17 @@
return
else
message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
..()
/mob/living/brain/get_spans()
return ..() | SPAN_ROBOT
/mob/living/brain/radio(message, message_mode, list/spans)
/mob/living/brain/radio(message, message_mode, list/spans, language)
if(message_mode && istype(container, /obj/item/device/mmi))
var/obj/item/device/mmi/R = container
if(R.radio)
R.radio.talk_into(src, message, , spans)
R.radio.talk_into(src, message, , get_spans(), language)
return ITALICS | REDUCE_RANGE
/mob/living/brain/lingcheck()
@@ -24,4 +25,12 @@
/mob/living/brain/treat_message(message)
message = capitalize(message)
return message
return message
/mob/living/brain/can_speak_in_language(datum/language/dt)
if(HAS_SECONDARY_FLAG(src, OMNITONGUE))
. = has_language(dt)
else if(istype(container, /obj/item/device/mmi/posibrain/soul_vessel))
. = has_language(dt) && ispath(dt, /datum/language/ratvar)
else
. = ..()
@@ -11,11 +11,10 @@
dna = null
faction = list("alien")
ventcrawler = VENTCRAWLER_ALWAYS
languages_spoken = ALIEN
languages_understood = ALIEN
sight = SEE_MOBS
see_in_dark = 4
verb_say = "hisses"
initial_languages = list(/datum/language/xenocommon)
bubble_icon = "alien"
type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
var/nightvision = 1
@@ -42,6 +42,8 @@
handcrafting = new()
grant_language(/datum/language/common) // ME TARZAN, YOU JANEBOT
..()
/mob/living/carbon/human/create_internal_organs()
@@ -1,7 +1,6 @@
var/global/default_martial_art = new/datum/martial_art
/mob/living/carbon/human
languages_spoken = HUMAN
languages_understood = HUMAN
initial_languages = list(/datum/language/common)
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD)
possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
pressure_resistance = 25
+4 -4
View File
@@ -75,7 +75,7 @@
if(!istype(dongle)) return 0
if(dongle.translate_binary) return 1
/mob/living/carbon/human/radio(message, message_mode, list/spans)
/mob/living/carbon/human/radio(message, message_mode, list/spans, language)
. = ..()
if(. != 0)
return .
@@ -83,17 +83,17 @@
switch(message_mode)
if(MODE_HEADSET)
if (ears)
ears.talk_into(src, message, , spans)
ears.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
if(MODE_DEPARTMENT)
if (ears)
ears.talk_into(src, message, message_mode, spans)
ears.talk_into(src, message, message_mode, spans, language)
return ITALICS | REDUCE_RANGE
if(message_mode in radiochannels)
if(ears)
ears.talk_into(src, message, message_mode, spans)
ears.talk_into(src, message, message_mode, spans, language)
return ITALICS | REDUCE_RANGE
return 0
@@ -1,8 +1,13 @@
/mob/living/carbon/human/whisper(message as text)
/mob/living/carbon/human/whisper_verb(message as text)
whisper(message)
/mob/living/carbon/human/whisper(message, datum/language/language=null)
if(!IsVocal())
return
if(!message)
return
if(!language)
language = get_default_language()
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
@@ -73,14 +78,14 @@
for(var/atom/movable/AM in listening)
if(istype(AM,/obj/item/device/radio))
continue
AM.Hear(rendered, src, languages_spoken, message, , spans)
AM.Hear(rendered, src, language, message, , spans)
message = stars(message)
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] [whispers], <span class='message'>\"[attach_spans(message, spans)]\"</span></span>"
for(var/atom/movable/AM in eavesdropping)
if(istype(AM,/obj/item/device/radio))
continue
AM.Hear(rendered, src, languages_spoken, message, , spans)
AM.Hear(rendered, src, language, message, , spans)
if(critical) //Dying words.
succumb(1)
+1 -1
View File
@@ -130,7 +130,7 @@
if(prob(20))
emote("gasp")
if(O2_partialpressure > 0)
var/ratio = safe_oxy_min/O2_partialpressure
var/ratio = 1 - O2_partialpressure/safe_oxy_min
adjustOxyLoss(min(5*ratio, 3))
failed_last_breath = 1
oxygen_used = breath_gases["o2"][MOLES]*ratio
@@ -2,12 +2,11 @@
name = "monkey"
voice_name = "monkey"
verb_say = "chimpers"
initial_languages = list(/datum/language/monkey)
icon = 'icons/mob/monkey.dmi'
icon_state = ""
gender = NEUTER
pass_flags = PASSTABLE
languages_spoken = MONKEY
languages_understood = MONKEY
ventcrawler = VENTCRAWLER_NUDE
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
type_of_meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey
@@ -159,4 +158,4 @@
if(prob(10))
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
equip_to_slot_or_del(helmet,slot_head)
helmet.attack_self(src) // todo encapsulate toggle
helmet.attack_self(src) // todo encapsulate toggle
+12
View File
@@ -28,3 +28,15 @@
var/obj/item/I = get_active_held_item()
if(I)
. |= I.get_held_item_speechspans(src)
/mob/living/carbon/can_speak_in_language(datum/language/dt)
if(HAS_SECONDARY_FLAG(src, OMNITONGUE))
. = has_language(dt)
else if(has_language(dt))
var/obj/item/organ/tongue/T = getorganslot("tongue")
if(T)
. = T.can_speak_in_language(dt)
else
. = initial(dt.flags) & TONGUELESS_SPEECH
else
. = FALSE
+6 -1
View File
@@ -17,6 +17,8 @@
medhud.add_to_hud(src)
faction += "\ref[src]"
language_menu = new(src)
/mob/living/prepare_huds()
..()
@@ -41,6 +43,8 @@
staticOverlays.len = 0
remove_from_all_data_huds()
QDEL_NULL(language_menu)
return ..()
/mob/living/ghostize(can_reenter_corpse = 1)
@@ -665,7 +669,8 @@
if(what && Adjacent(who) && what.mob_can_equip(who, src, final_where, TRUE))
if(temporarilyRemoveItemFromInventory(what))
if(where_list)
who.put_in_hand(what, where_list[2])
if(!who.put_in_hand(what, where_list[2]))
what.forceMove(get_turf(who))
else
who.equip_to_slot(what, where, TRUE)
+4 -3
View File
@@ -1,7 +1,5 @@
/mob/living
see_invisible = SEE_INVISIBLE_LIVING
languages_spoken = HUMAN
languages_understood = HUMAN
sight = 0
see_in_dark = 2
hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD)
@@ -74,4 +72,7 @@
var/list/implants = null
var/tesla_ignore = FALSE
var/datum/riding/riding_datum
var/datum/riding/riding_datum
var/datum/language/selected_default_language
var/datum/language_menu/language_menu
+68 -16
View File
@@ -64,7 +64,7 @@ var/list/department_radio_keys = list(
var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE)
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
if(sanitize)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(!message || message == "")
@@ -103,7 +103,26 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(stat && !(message_mode in crit_allowed_modes))
return
if(handle_inherent_channels(message, message_mode)) //Hiveminds, binary chat & holopad.
// language comma detection.
var/datum/language/message_language = get_message_language(message)
if(message_language)
// No, you cannot speak in xenocommon just because you know the key
if(can_speak_in_language(message_language))
language = message_language
message = copytext(message, 3)
// Trim the space if they said ",0 I LOVE LANGUAGES"
if(findtext(message, " ", 1, 2))
message = copytext(message, 2)
if(!language)
language = get_default_language()
// Detection of language needs to be before inherent channels, because
// AIs use inherent channels for the holopad. Most inherent channels
// ignore the language argument however.
if(handle_inherent_channels(message, message_mode, language)) //Hiveminds, binary chat & holopad.
return
if(!can_speak_vocal(message))
@@ -117,11 +136,19 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
spans += get_spans()
if(language)
var/datum/language/L = language_datums[language]
if(!istype(L))
L = new language
language_datums[language] = L
spans |= L.spans
//Log what we've said with an associated timestamp, using the list's len for safety/to prevent overwriting messages
log_message(message, INDIVIDUAL_SAY_LOG)
var/message_range = 7
var/radio_return = radio(message, message_mode, spans)
var/radio_return = radio(message, message_mode, spans, language)
if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called
return
if(radio_return & ITALICS)
@@ -139,12 +166,12 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message
spans |= SPAN_ITALICS
send_speech(message, message_range, src, bubble_type, spans)
send_speech(message, message_range, src, bubble_type, spans, message_language=language)
log_say("[name]/[key] : [message]")
return 1
/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans)
if(!client)
return
var/deaf_message
@@ -156,20 +183,21 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
else
deaf_message = "<span class='notice'>You can't hear yourself!</span>"
deaf_type = 2 // Since you should be able to hear yourself without looking
if(!(message_langs & languages_understood) || force_compose) //force_compose is so AIs don't end up without their hrefs.
message = compose_message(speaker, message_langs, raw_message, radio_freq, spans)
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans)
show_message(message, 2, deaf_message, deaf_type)
return message
/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type = bubble_icon, list/spans)
/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null)
var/list/listening = get_hearers_in_view(message_range, source)
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && ((M.client.prefs.chat_toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7 && M.z == z)) && client) // client is so that ghosts don't have to listen to mice
listening |= M
var/rendered = compose_message(src, languages_spoken, message, , spans)
var/rendered = compose_message(src, message_language, message, , spans)
for(var/atom/movable/AM in listening)
AM.Hear(rendered, src, languages_spoken, message, , spans)
AM.Hear(rendered, src, message_language, message, , spans, message_language)
//speech bubble
var/list/speech_bubble_recipients = list()
@@ -178,8 +206,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
speech_bubble_recipients.Add(M.client)
var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
spawn(0)
flick_overlay(I, speech_bubble_recipients, 30)
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
/mob/proc/binarycheck()
return 0
@@ -221,6 +248,19 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
else if(length(message) > 2)
return department_radio_keys[copytext(message, 1, 3)]
/mob/living/proc/get_message_language(message)
var/static/list/langlist
if(!langlist)
langlist = subtypesof(/datum/language)
if(copytext(message, 1, 2) == ",")
var/key = copytext(message, 2, 3)
for(var/ld in langlist)
var/datum/language/LD = ld
if(initial(LD.key) == key)
return LD
return null
/mob/living/proc/handle_inherent_channels(message, message_mode)
if(message_mode == MODE_CHANGELING)
switch(lingcheck())
@@ -289,22 +329,22 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
return message
/mob/living/proc/radio(message, message_mode, list/spans)
/mob/living/proc/radio(message, message_mode, list/spans, language)
switch(message_mode)
if(MODE_R_HAND)
for(var/obj/item/r_hand in get_held_items_for_side("r", all = TRUE))
if (r_hand)
return r_hand.talk_into(src, message, , spans)
return r_hand.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
if(MODE_L_HAND)
for(var/obj/item/l_hand in get_held_items_for_side("l", all = TRUE))
if (l_hand)
return l_hand.talk_into(src, message, , spans)
return l_hand.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
if(MODE_INTERCOM)
for (var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, , spans)
I.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
if(MODE_BINARY)
@@ -333,3 +373,15 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if (getBrainLoss() >= 60)
return "gibbers, \"[tempinput]\""
return ..()
/mob/living/get_default_language()
if(selected_default_language)
if(has_language(selected_default_language))
return selected_default_language
else
selected_default_language = null
. = ..()
/mob/living/proc/open_language_menu(mob/user)
language_menu.ui_interact(user)
+3 -4
View File
@@ -22,7 +22,6 @@ var/list/ai_list = list()
canmove = 0
status_flags = CANSTUN|CANPUSH
a_intent = INTENT_HARM //so we always get pushed instead of trying to swap
force_compose = 1 //This ensures that the AI always composes it's own hear message. Needed for hrefs and job display.
sight = SEE_TURFS | SEE_MOBS | SEE_OBJS
see_in_dark = 8
med_hud = DATA_HUD_MEDICAL_BASIC
@@ -831,8 +830,8 @@ var/list/ai_list = list()
return
return 1
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
raw_message = lang_treat(speaker, message_langs, raw_message, spans)
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans)
raw_message = lang_treat(speaker, message_language, raw_message, spans)
var/name_used = speaker.GetVoice()
var/rendered = "<i><span class='game say'>Relayed Speech: <span class='name'>[name_used]</span> <span class='message'>[raw_message]</span></span></i>"
show_message(rendered, 2)
@@ -985,4 +984,4 @@ var/list/ai_list = list()
/mob/living/silicon/ai/spawned/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
if(!target_ai)
target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct
..()
..()
@@ -104,6 +104,6 @@
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
/mob/camera/aiEye/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans)
if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker))
ai.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans)
ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans)
+16 -8
View File
@@ -1,6 +1,6 @@
/mob/living/silicon/ai/say(message)
/mob/living/silicon/ai/say(message, language)
if(parent && istype(parent) && parent.stat != 2) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
parent.say(message)
parent.say(message, language)
return
..(message)
@@ -17,7 +17,7 @@
/mob/living/silicon/ai/IsVocal()
return !config.silent_ai
/mob/living/silicon/ai/radio(message, message_mode, list/spans)
/mob/living/silicon/ai/radio(message, message_mode, list/spans, language)
if(!radio_enabled || aiRestorePowerRoutine || stat) //AI cannot speak if radio is disabled (via intellicard) or depowered.
to_chat(src, "<span class='danger'>Your radio transmitter is offline!</span>")
return 0
@@ -29,17 +29,17 @@
else
return ..()
/mob/living/silicon/ai/handle_inherent_channels(message, message_mode)
/mob/living/silicon/ai/handle_inherent_channels(message, message_mode, language)
. = ..()
if(.)
return .
if(message_mode == MODE_HOLOPAD)
holopad_talk(message)
holopad_talk(message, language)
return 1
//For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(message)
/mob/living/silicon/ai/proc/holopad_talk(message, language)
log_say("[key_name(src)] : [message]")
message = trim(message)
@@ -49,11 +49,10 @@
var/obj/machinery/holopad/T = current
if(istype(T) && T.masters[src])//If there is a hologram and its master is the user.
send_speech(message, 7, T, "robot", get_spans())
send_speech(message, 7, T, "robot", get_spans(), message_language=language)
to_chat(src, "<i><span class='game say'>Holopad transmitted, <span class='name'>[real_name]</span> <span class='message robot'>\"[message]\"</span></span></i>")
else
to_chat(src, "No holopad connected.")
return
// Make sure that the code compiles with AI_VOX undefined
@@ -167,3 +166,12 @@ var/const/VOX_DELAY = 600
return 0
#endif
/mob/living/silicon/ai/can_speak_in_language(datum/language/dt)
if(HAS_SECONDARY_FLAG(src, OMNITONGUE))
. = has_language(dt)
else if(is_servant_of_ratvar(src))
// Ratvarian AIs can only speak Ratvarian
. = ispath(dt, /datum/language/ratvar) && has_language(dt)
else
. = ..()
@@ -110,10 +110,13 @@
var/datum/action/innate/pai/chassis/AC = new /datum/action/innate/pai/chassis
var/datum/action/innate/pai/rest/AR = new /datum/action/innate/pai/rest
var/datum/action/innate/pai/light/AL = new /datum/action/innate/pai/light
var/datum/action/language_menu/ALM = new
AS.Grant(src)
AC.Grant(src)
AR.Grant(src)
AL.Grant(src)
ALM.Grant(src)
emittersemicd = TRUE
addtimer(CALLBACK(src, .proc/emittercool), 600)
@@ -102,4 +102,4 @@
/mob/living/silicon/pai/movement_delay()
. = ..()
. += 1 //A bit slower than humans, so they're easier to smash
. += 1 //A bit slower than humans, so they're easier to smash
@@ -253,9 +253,9 @@
med.remove_hud_from(src)
if("translator")
if(href_list["toggle"])
var/on_already = ((languages_understood == ALL) && (languages_spoken == ALL))
languages_spoken = on_already ? (HUMAN | ROBOT) : ALL
languages_understood = on_already ? (HUMAN | ROBOT) : ALL
if(!HAS_SECONDARY_FLAG(src, OMNITONGUE))
grant_all_languages(TRUE)
// this is PERMAMENT.
if("doorjack")
if(href_list["jack"])
if(src.cable && src.cable.machine)
@@ -313,7 +313,8 @@
if(s == "medical HUD")
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Medical Analysis Suite</a>[(src.medHUD) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
if(s == "universal translator")
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a>[((languages_spoken == ALL) && (languages_understood == ALL)) ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
var/translator_on = HAS_SECONDARY_FLAG(src, OMNITONGUE)
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a>[translator_on ? "<font color=#55FF55> On</font>" : "<font color=#FF5555> Off</font>"] <br>"
if(s == "projection array")
dat += "<a href='byond://?src=\ref[src];software=projectionarray;sub=0'>Projection Array</a> <br>"
if(s == "camera jack")
@@ -464,11 +465,10 @@
// Universal Translator
/mob/living/silicon/pai/proc/softwareTranslator()
var/translator_on = HAS_SECONDARY_FLAG(src, OMNITONGUE)
. = {"<h3>Universal Translator</h3><br>
When enabled, this device will automatically convert all spoken and written language into a format that any known recipient can understand.<br><br>
The device is currently [ ((languages_spoken == ALL) && (languages_understood == ALL)) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>
<a href='byond://?src=\ref[src];software=translator;sub=0;toggle=1'>Toggle Device</a><br>
"}
When enabled, this device will permamently be able to speak and understand all known forms of communication.<br><br>
The device is currently [translator_on ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled.</font><br>[translator_on ? "" : "<a href='byond://?src=\ref[src];software=translator;sub=0;toggle=1'>Activate Translation Module</a><br>"]"}
return .
// Security HUD
+3 -3
View File
@@ -33,19 +33,19 @@
/mob/living/silicon/lingcheck()
return 0 //Borged or AI'd lings can't speak on the ling channel.
/mob/living/silicon/radio(message, message_mode, list/spans)
/mob/living/silicon/radio(message, message_mode, list/spans, language)
. = ..()
if(. != 0)
return .
if(message_mode == "robot")
if (radio)
radio.talk_into(src, message, , spans)
radio.talk_into(src, message, , spans, language)
return REDUCE_RANGE
else if(message_mode in radiochannels)
if(radio)
radio.talk_into(src, message, message_mode, spans)
radio.talk_into(src, message, message_mode, spans, language)
return ITALICS | REDUCE_RANGE
return 0
+1 -2
View File
@@ -1,13 +1,12 @@
/mob/living/silicon
gender = NEUTER
voice_name = "synthesized voice"
languages_spoken = ROBOT | HUMAN
languages_understood = ROBOT | HUMAN
has_unlimited_silicon_privilege = 1
verb_say = "states"
verb_ask = "queries"
verb_exclaim = "declares"
verb_yell = "alarms"
initial_languages = list(/datum/language/common, /datum/language/machine)
see_in_dark = 8
bubble_icon = "machine"
weather_immunities = list("ash")
@@ -20,6 +20,7 @@
verb_ask = "queries"
verb_exclaim = "declares"
verb_yell = "alarms"
initial_languages = list(/datum/language/common, /datum/language/machine)
bubble_icon = "machine"
faction = list("neutral", "silicon" , "turret")
@@ -140,6 +141,9 @@
//Gives a HUD view to player bots that use a HUD.
activate_data_hud()
grant_language(/datum/language/common)
grant_language(/datum/language/machine)
/mob/living/simple_animal/bot/update_canmove()
. = ..()
@@ -323,30 +327,29 @@
if((!on) || (!message))
return
if(channel && Radio.channels[channel])// Use radio if we have channel key
Radio.talk_into(src, message, channel, get_spans())
Radio.talk_into(src, message, channel, get_spans(), get_default_language())
else
say(message)
return
/mob/living/simple_animal/bot/get_spans()
return ..() | SPAN_ROBOT
/mob/living/simple_animal/bot/radio(message, message_mode, list/spans)
/mob/living/simple_animal/bot/radio(message, message_mode, list/spans, language)
. = ..()
if(. != 0)
return .
switch(message_mode)
if(MODE_HEADSET)
Radio.talk_into(src, message, , spans)
Radio.talk_into(src, message, , spans, language)
return REDUCE_RANGE
if(MODE_DEPARTMENT)
Radio.talk_into(src, message, message_mode, spans)
Radio.talk_into(src, message, message_mode, spans, language)
return REDUCE_RANGE
if(message_mode in radiochannels)
Radio.talk_into(src, message, message_mode, spans)
Radio.talk_into(src, message, message_mode, spans, language)
return REDUCE_RANGE
return 0
@@ -39,6 +39,16 @@
weaponscheck = 0
auto_patrol = 1
/mob/living/simple_animal/bot/secbot/beepsky/jr
name = "Officer Pipsqueak"
desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak."
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize()
..()
resize = 0.8
update_transform()
/mob/living/simple_animal/bot/secbot/beepsky/explode()
var/turf/Tsec = get_turf(src)
new /obj/item/weapon/stock_parts/cell/potato(Tsec)
@@ -37,8 +37,8 @@
voice_name = "synthesized chirp"
speak_emote = list("chirps")
bubble_icon = "machine"
languages_spoken = DRONE
languages_understood = DRONE|HUMAN
initial_languages = list(/datum/language/common, /datum/language/machine, /datum/language/drone)
only_speaks_language = /datum/language/drone
mob_size = MOB_SIZE_SMALL
has_unlimited_silicon_privilege = 1
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
@@ -97,8 +97,6 @@
icon_living = "drone_clock"
icon_dead = "drone_clock_dead"
picked = TRUE
languages_spoken = RATVAR
languages_understood = HUMAN|RATVAR
pass_flags = PASSTABLE
health = 50
maxHealth = 50
@@ -112,6 +110,8 @@
verb_exclaim = "proclaims"
verb_yell = "harangues"
bubble_icon = "clock"
initial_languages = list(/datum/language/common, /datum/language/ratvar)
only_speaks_language = /datum/language/ratvar
light_color = "#E42742"
heavy_emp_damage = 0
laws = "0. Purge all untruths and honor Ratvar."
@@ -139,6 +139,8 @@
verbs -= /mob/living/simple_animal/drone/verb/toggle_light
verbs -= /mob/living/simple_animal/drone/verb/drone_ping
grant_language(/datum/language/ratvar)
/mob/living/simple_animal/drone/cogscarab/Login()
..()
add_servant_of_ratvar(src, TRUE)
@@ -27,7 +27,7 @@
else
to_chat(M, msg)
if(dead_can_hear && (M in dead_mob_list))
var/link = FOLLOW_LINK(M, src)
var/link = FOLLOW_LINK(M, faction_checked_mob)
to_chat(M, "[link] [msg]")
@@ -369,8 +369,6 @@ Difficulty: Very Hard
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
use_power = 0
density = 1
languages_spoken = ALL
languages_understood = ALL
flags = HEAR
var/activation_method = "touch"
var/activation_damage_type = null
@@ -618,8 +616,6 @@ Difficulty: Very Hard
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
light_range = 4
faction = list("neutral")
languages_spoken = SLIME
languages_understood = ALL
del_on_death = 1
unsuitable_atmos_damage = 0
movement_type = FLYING
@@ -45,7 +45,7 @@
mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
/mob/living/simple_animal/hostile/megafauna/Destroy()
qdel(internal)
QDEL_NULL(internal)
. = ..()
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
@@ -86,10 +86,7 @@
if(!.)
return
var/turf/newloc = loc
message_admins("Megafauna [src] \
(<A HREF='?_src_=holder;adminplayerobservefollow=\ref[src]'>FLW</A>) \
moved via shuttle from ([oldloc.x],[oldloc.y],[oldloc.z]) to \
([newloc.x],[newloc.y],[newloc.z])")
message_admins("Megafauna [src] [ADMIN_FLW(src)] moved via shuttle from [ADMIN_COORDJMP(oldloc)] to [ADMIN_COORDJMP(newloc)]")
/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L)
if(!L)
@@ -4,7 +4,7 @@
icon_state = "frog"
icon_living = "frog"
icon_dead = "frog_dead"
speak = list("ribbits","croaks")
speak = list("ribbit","croak")
emote_see = list("hops in a circle.", "shakes.")
speak_chance = 1
turns_per_move = 5
@@ -39,4 +39,4 @@
if(!stat && isliving(AM))
var/mob/living/L = AM
if(L.mob_size > MOB_SIZE_TINY)
playsound(src, 'sound/effects/Huuu.ogg', 50, 1)
playsound(src, 'sound/effects/Huuu.ogg', 50, 1)
@@ -154,7 +154,7 @@
return message
..()
/mob/living/simple_animal/parrot/radio(message, message_mode, list/spans) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be.
/mob/living/simple_animal/parrot/radio(message, message_mode, list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be.
. = ..()
if(. != 0)
return .
@@ -162,17 +162,17 @@
switch(message_mode)
if(MODE_HEADSET)
if (ears)
ears.talk_into(src, message, , spans)
ears.talk_into(src, message, , spans, language)
return ITALICS | REDUCE_RANGE
if(MODE_DEPARTMENT)
if (ears)
ears.talk_into(src, message, message_mode, spans)
ears.talk_into(src, message, message_mode, spans, language)
return ITALICS | REDUCE_RANGE
if(message_mode in radiochannels)
if(ears)
ears.talk_into(src, message, message_mode, spans)
ears.talk_into(src, message, message_mode, spans, language)
return ITALICS | REDUCE_RANGE
return 0
@@ -894,6 +894,7 @@
desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!"
else
speak += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!")
..()
/mob/living/simple_animal/parrot/Poly/Life()
@@ -95,6 +95,9 @@
if(!loc)
stack_trace("Simple animal being instantiated in nullspace")
// goats bray, cows go moo, and the fox says Geckers
grant_language(/datum/language/common)
/mob/living/simple_animal/Login()
if(src && src.client)
src.client.screen = list()
@@ -170,8 +170,6 @@
var/mob/living/simple_animal/slime/new_slime = pick(babies)
new_slime.a_intent = INTENT_HARM
new_slime.languages_spoken = languages_spoken
new_slime.languages_understood = languages_understood
if(src.mind)
src.mind.transfer_to(new_slime)
else
@@ -13,8 +13,6 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
gender = NEUTER
var/is_adult = 0
var/docile = 0
languages_spoken = SLIME | HUMAN
languages_understood = SLIME | HUMAN
faction = list("slime","neutral")
harm_intent_damage = 5
@@ -94,6 +92,7 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
E.Grant(src)
create_reagents(100)
set_colour(new_colour)
grant_language(/datum/language/slime)
..()
/mob/living/simple_animal/slime/proc/set_colour(new_colour)
@@ -424,4 +423,4 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
return 3
/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult)
. = ..(mapload, pick(slime_colours), prob(50))
. = ..(mapload, pick(slime_colours), prob(50))
-2
View File
@@ -131,8 +131,6 @@
var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics
var/force_compose = 0 //If this is nonzero, the mob will always compose it's own hear message instead of using the one given in the arguments.
var/obj/control_object //Used by admins to possess objects. All mobs should have this var
var/atom/movable/remote_control //Calls relaymove() to whatever it is
+1 -12
View File
@@ -464,17 +464,6 @@ var/static/regex/firstname = new("^\[^\\s-\]+") //First word before whitespace o
message_admins("No ghosts were willing to take control of [key_name_admin(M)])")
return FALSE
//toggles the talk wheel
/mob/verb/toggle_talk_wheel()
set name = "talk-wheel"
set hidden = 1
if(isliving(src))
var/mob/living/L = src
if(L.hud_used)
for(var/obj/screen/wheel/talk/TW in L.hud_used.wheels)
TW.Click()
/mob/proc/is_flying(mob/M = src)
if(M.movement_type & FLYING)
return 1
@@ -499,4 +488,4 @@ var/static/regex/firstname = new("^\[^\\s-\]+") //First word before whitespace o
var/list/timestamped_message = list("[LAZYLEN(logging[message_type]) + 1]\[[time_stamp()]\] [key_name(src)]" = message)
logging[message_type] += timestamped_message
logging[message_type] += timestamped_message
+6 -2
View File
@@ -7,13 +7,17 @@
return
usr.say(message)
/mob/verb/whisper(message as text)
/mob/verb/whisper_verb(message as text)
set name = "Whisper"
set category = "IC"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
say(message) //only carbons actually whisper, everything else just talks
whisper(message)
/mob/proc/whisper(message, datum/language/language=null)
say(message, language) //only carbons actually whisper, everything else just talks
/mob/verb/me_verb(message as text)
set name = "Me"