diff --git a/aurora.dme b/aurora.dme
index c4a6d612..858cb0a4 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -605,6 +605,7 @@
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
+#include "code\game\objects\items\weapons\cards.dm"
#include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
diff --git a/code/modules/aurora/bluespacetech.dm b/code/modules/aurora/bluespacetech.dm
index 725a3325..0de534d1 100644
--- a/code/modules/aurora/bluespacetech.dm
+++ b/code/modules/aurora/bluespacetech.dm
@@ -80,16 +80,23 @@
//Add the rest of the languages
//Because universal speak doesn't work right.
- bst.add_language("Sol Common")
bst.add_language("Sinta'unathi")
bst.add_language("Siik'Maas")
bst.add_language("Skrellian")
bst.add_language("Vox-pidgin")
bst.add_language("Rootspeak")
+ bst.add_language("Ceti Basic")
+ bst.add_language("Sol Common")
bst.add_language("Tradeband")
bst.add_language("Gutter")
bst.add_language("Sini")
bst.add_language("Sign language")
+ bst.add_language("Xenomorph")
+ bst.add_language("Hivemind")
+ bst.add_language("Changeling")
+ bst.add_language("Cortical Link")
+ bst.add_language("Robot Talk")
+ bst.add_language("Drone Talk")
/* bst.bluespace_trail.set_up(src)
bst.bluespace_trail.start()
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index cbe883fe..e58e193a 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -1,68 +1,37 @@
/mob/living/carbon/alien/say(var/message)
+ var/verb = "says"
+ var/message_range = world.view
- if (silent)
+ if(client)
+ if(client.prefs.muted & MUTE_IC)
+ src << "\red You cannot speak in IC (Muted)."
+ return
+
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+ if(stat == 2)
+ return say_dead(message)
+
+ if(copytext(message,1,2) == "*")
+ return emote(copytext(message,2))
+
+ var/datum/language/speaking = null
+
+ if(length(message) >= 2)
+ var/channel_prefix = copytext(message, 1 ,3)
+ if(languages.len)
+ for(var/datum/language/L in languages)
+ if(lowertext(channel_prefix) == ":[L.key]")
+ verb = L.speech_verb
+ speaking = L
+ break
+
+ if(speaking)
+ message = trim(copytext(message,3))
+
+ message = capitalize(trim_left(message))
+
+ if(!message || stat)
return
- if (length(message) >= 2)
- if (department_radio_keys[copytext(message, 1, 3)] == "alientalk")
- message = copytext(message, 3)
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
- if (stat == 2)
- return say_dead(message)
- else
- alien_talk(message)
- else
- if (copytext(message, 1, 2) != "*" && !stat)
- playsound(loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N
- return ..(message)
- else
-
-/mob/living/proc/alien_talk(var/message)
-
- log_say("[key_name(src)] : [message]")
- message = trim(message)
-
- if (!message)
- return
-
- var/message_a = say_quote(message)
- var/rendered = "Hivemind, [name] [message_a]"
- for (var/mob/living/S in player_list)
- if(!S.stat)
- if(S.alien_talk_understand)
- if(S.alien_talk_understand == alien_talk_understand)
- S.show_message(rendered, 2)
- else if (S.hivecheck())
- S.show_message(rendered, 2)
-
- var/list/listening = hearers(1, src)
- listening -= src
- listening += src
-
- var/list/heard = list()
- for (var/mob/M in listening)
- if(!istype(M, /mob/living/carbon/alien) && !M.alien_talk_understand)
- heard += M
-
-
- if (length(heard))
- var/message_b
-
- message_b = "hsssss"
- message_b = say_quote(message_b)
- message_b = "[message_b]"
-
- rendered = "[voice_name] [message_b]"
-
- for (var/mob/M in heard)
- M.show_message(rendered, 2)
-
- message = say_quote(message)
-
- rendered = "Hivemind, [name] [message_a]"
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- if (M.stat > 1)
- M.show_message(rendered, 2)
\ No newline at end of file
+ ..(message, speaking, verb, null, null, message_range, null)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index be7ac21e..34078cee 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -132,11 +132,11 @@
/obj/item/device/mmi/posibrain/New()
src.brainmob = new(src)
+ src.brainmob.add_language("Binary")
src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
src.brainmob.real_name = src.brainmob.name
src.brainmob.loc = src
src.brainmob.container = src
- src.brainmob.robot_talk_understand = 1
src.brainmob.stat = 0
src.brainmob.silent = 0
// src.brainmob.brain_op_stage = 4.0
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index 3425633c..6f8de199 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -1,3 +1,4 @@
+//TODO: Convert this over for languages.
/mob/living/carbon/brain/say(var/message)
if (silent)
return
@@ -5,11 +6,6 @@
if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/mmi/posibrain))))
return //No MMI, can't speak, bucko./N
else
- if ((department_radio_keys[copytext(message, 1, 3)] == "binary") && (container && istype(container, /obj/item/device/mmi/posibrain)))
- message = copytext(message, 3)
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
- robot_talk(message)
- return
if(prob(emp_damage*4))
if(prob(10))//10% chane to drop the message entirely
return
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 3b39b61b..83f483dc 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -15,9 +15,9 @@
var/message_mode = parse_message_mode(message, "headset")
- if (istype(wear_mask, /obj/item/clothing/mask/muzzle) && message_mode != "changeling") //Todo: Add this to speech_problem_flag checks.
- return
-
+// if (istype(wear_mask, /obj/item/clothing/mask/muzzle) && message_mode != "changeling") //Todo: Add this to speech_problem_flag checks.
+// return
+//
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
@@ -33,9 +33,28 @@
//parse the language code and consume it
var/datum/language/speaking = parse_language(message)
- if (speaking)
- verb = speaking.speech_verb
+ if(speaking)
message = copytext(message,3)
+ else if(species.default_language)
+ speaking = all_languages[species.default_language]
+
+ var/ending = copytext(message, length(message))
+ if (speaking)
+ // This is broadcast to all mobs with the language,
+ // irrespective of distance or anything else.
+ if(speaking.flags & HIVEMIND)
+ speaking.broadcast(src,trim(message))
+ return
+ //If we've gotten this far, keep going!
+ verb = speaking.get_spoken_verb(ending)
+ else
+ if(ending=="!")
+ verb=pick("exclaims","shouts","yells")
+ if(ending=="?")
+ verb="asks"
+
+ if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
+ return
message = capitalize(trim(message))
@@ -48,13 +67,6 @@
if(!message || stat)
return
- if (!speaking)
- var/ending = copytext(message, length(message))
- if(ending=="!")
- verb=pick("exclaims","shouts","yells")
- if(ending=="?")
- verb="asks"
-
if(speaking && speaking.flags & SIGNLANG)
message_mode = null
..(message, speaking, verb, alt_name, italics, message_range)
@@ -111,7 +123,7 @@
if("whisper")
whisper_say(message, speaking, alt_name)
return
- if("binary")
+/* if("binary")
if(robot_talk_understand || binarycheck())
robot_talk(message)
return
@@ -121,6 +133,7 @@
if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
Changeling << "[mind.changeling.changelingID]: [message]"
return
+*/
else
if(!(stunned >= 4))
if(message_mode)
@@ -134,21 +147,67 @@
var/sound/speech_sound
var/sound_vol
- if((species.name == "Vox" || species.name == "Vox Armalis") && prob(20))
- speech_sound = sound('sound/voice/shriek1.ogg')
+ if(species.speech_sounds && prob(species.speech_chance))
+ speech_sound = sound(pick(species.speech_sounds))
sound_vol = 50
- ..(message, speaking, verb, alt_name, italics, message_range, used_radios, speech_sound, sound_vol) //ohgod we should really be passing a datum here.
+ //speaking into radios
+ if(used_radios.len)
+ italics = 1
+ message_range = 1
+
+ for(var/mob/living/M in hearers(5, src))
+ if(M != src)
+ M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "the radio."]")
+ if (speech_sound)
+ sound_vol *= 0.5
+
+ ..(message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol) //ohgod we should really be passing a datum here.
+
+/mob/living/carbon/human/proc/forcesay(list/append)
+ if(stat == CONSCIOUS)
+ if(client)
+ var/virgin = 1 //has the text been modified yet?
+ var/temp = winget(client, "input", "text")
+ if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //case sensitive means
+
+ temp = replacetext(temp, ";", "") //general radio
+
+ if(findtext(trim_left(temp), ":", 6, 7)) //dept radio
+ temp = copytext(trim_left(temp), 8)
+ virgin = 0
+
+ if(virgin)
+ temp = copytext(trim_left(temp), 6) //normal speech
+ virgin = 0
+
+ while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary)
+ temp = copytext(trim_left(temp), 3)
+
+ if(findtext(temp, "*", 1, 2)) //emotes
+ return
+ temp = copytext(trim_left(temp), 1, rand(5,8))
+
+ var/trimmed = trim_left(temp)
+ if(length(trimmed))
+ if(append)
+ temp += pick(append)
+
+ say(temp)
+ winset(client, "input", "text=[null]")
/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
+ if(species.can_understand(other))
+ return 1
+
//These only pertain to common. Languages are handled by mob/say_understands()
if (!speaking)
- if (istype(other, /mob/living/carbon/monkey/diona))
- if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
+ if (istype(other, /mob/living/carbon/alien/diona))
+ if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
return 1
if (istype(other, /mob/living/silicon))
return 1
@@ -203,16 +262,17 @@
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null)
var/verb = "says"
var/ending = copytext(message, length(message))
- if(ending=="!")
- verb=pick("exclaims","shouts","yells")
- else if(ending=="?")
- verb="asks"
+
+ if(speaking)
+ verb = speaking.get_spoken_verb(ending)
+ else
+ if(ending == "!")
+ verb=pick("exclaims","shouts","yells")
+ else if(ending == "?")
+ verb="asks"
return verb
-
-
-
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
var/list/returns[3]
var/verb = "says"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 467b2e4f..e0d94d25 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -10,12 +10,12 @@ var/list/department_radio_keys = list(
":e" = "Engineering", "#e" = "Engineering", ".e" = "Engineering",
":s" = "Security", "#s" = "Security", ".s" = "Security",
":w" = "whisper", "#w" = "whisper", ".w" = "whisper",
- ":b" = "binary", "#b" = "binary", ".b" = "binary",
- ":a" = "alientalk", "#a" = "alientalk", ".a" = "alientalk",
+// ":b" = "binary", "#b" = "binary", ".b" = "binary",
+// ":a" = "alientalk", "#a" = "alientalk", ".a" = "alientalk",
":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate",
":u" = "Supply", "#u" = "Supply", ".u" = "Supply",
- ":g" = "changeling", "#g" = "changeling", ".g" = "changeling",
- ":d" = "dronechat", "#d" = "dronechat", ".d" = "dronechat",
+// ":g" = "changeling", "#g" = "changeling", ".g" = "changeling",
+// ":d" = "dronechat", "#d" = "dronechat", ".d" = "dronechat",
":R" = "right ear", "#R" = "right ear", ".R" = "right ear",
":L" = "left ear", "#L" = "left ear", ".L" = "left ear",
@@ -27,12 +27,12 @@ var/list/department_radio_keys = list(
":E" = "Engineering", "#E" = "Engineering", ".E" = "Engineering",
":S" = "Security", "#S" = "Security", ".S" = "Security",
":W" = "whisper", "#W" = "whisper", ".W" = "whisper",
- ":B" = "binary", "#B" = "binary", ".B" = "binary",
- ":A" = "alientalk", "#A" = "alientalk", ".A" = "alientalk",
+// ":B" = "binary", "#B" = "binary", ".B" = "binary",
+// ":A" = "alientalk", "#A" = "alientalk", ".A" = "alientalk",
":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate",
":U" = "Supply", "#U" = "Supply", ".U" = "Supply",
- ":G" = "changeling", "#G" = "changeling", ".G" = "changeling",
- ":D" = "dronechat", "#D" = "dronechat", ".D" = "dronechat",
+// ":G" = "changeling", "#G" = "changeling", ".G" = "changeling",
+// ":D" = "dronechat", "#D" = "dronechat", ".D" = "dronechat",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -46,20 +46,21 @@ var/list/department_radio_keys = list(
":ó" = "Engineering", "#ó" = "Engineering", ".ó" = "Engineering",
":û" = "Security", "#û" = "Security", ".û" = "Security",
":ö" = "whisper", "#ö" = "whisper", ".ö" = "whisper",
- ":è" = "binary", "#è" = "binary", ".è" = "binary",
- ":ô" = "alientalk", "#ô" = "alientalk", ".ô" = "alientalk",
+// ":è" = "binary", "#è" = "binary", ".è" = "binary",
+// ":ô" = "alientalk", "#ô" = "alientalk", ".ô" = "alientalk",
":å" = "Syndicate", "#å" = "Syndicate", ".å" = "Syndicate",
":é" = "Supply", "#é" = "Supply", ".é" = "Supply",
- ":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling"
+// ":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling"
)
/mob/living/proc/binarycheck()
if (istype(src, /mob/living/silicon/pai))
return
- if (issilicon(src))
- return 1
+// if (issilicon(src))
+// return 1
if (!ishuman(src))
return
+
var/mob/living/carbon/human/H = src
if (H.l_ear || H.r_ear)
var/obj/item/device/radio/headset/dongle
@@ -70,20 +71,7 @@ var/list/department_radio_keys = list(
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
-/mob/living/proc/hivecheck()
- if (isalien(src)) return 1
- if (!ishuman(src)) return
- var/mob/living/carbon/human/H = src
- if (H.l_ear || H.r_ear)
- var/obj/item/device/radio/headset/dongle
- if(istype(H.l_ear,/obj/item/device/radio/headset))
- dongle = H.l_ear
- else
- dongle = H.r_ear
- if(!istype(dongle)) return
- if(dongle.translate_binary) return 1
-
-/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list(), var/sound/speech_sound, var/sound_vol)
+/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/sound/speech_sound, var/sound_vol)
var/turf/T = get_turf(src)
@@ -98,20 +86,6 @@ var/list/department_radio_keys = list(
log_say("[name]/[key] : [message]")
return 1
- //speaking into radios
- if(used_radios.len)
- italics = 1
- message_range = 1
-
- if (!istype(src, /mob/living/silicon/ai)) // Atlantis: Prevents nearby people from hearing the AI when it talks using it's integrated radio.
- for(var/mob/living/M in hearers(5, src))
- if(M != src)
- M.show_message("[src] talks into [used_radios.len ? used_radios[1] : "the radio."]")
- if (speech_sound)
- src.playsound_local(get_turf(src), speech_sound, sound_vol * 0.5, 1)
-
- speech_sound = null //so we don't play it twice.
-
//make sure the air can transmit speech
var/datum/gas_mixture/environment = T.return_air()
if(environment)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 7a622d83..961b5969 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -82,7 +82,7 @@ var/list/ai_verbs_default = list(
var/centcomm_message_cooldown = 0
/mob/living/silicon/ai/proc/add_ai_verbs()
- src.verbs += ai_verbs_default
+ src.verbs |= ai_verbs_default
/mob/living/silicon/ai/proc/remove_ai_verbs()
src.verbs -= ai_verbs_default
@@ -130,11 +130,17 @@ var/list/ai_verbs_default = list(
add_ai_verbs(src)
//Languages
- add_language("Sol Common", 0)
+
+
+ add_language("Robot Talk", 1)
add_language("Sinta'unathi", 0)
- add_language("Siik'tajr", 0)
+ add_language("Siik'Maas", 0)
add_language("Skrellian", 0)
- add_language("Tradeband", 1)
+ add_language("Vox-pidgin", 0)
+ add_language("Rootspeak", 0)
+ add_language("Ceti Basic", 0)
+ add_language("Sol Common", 0)
+ add_language("Tradeband", 0)
add_language("Gutter", 0)
if(!safety)//Only used by AIize() to successfully spawn an AI.
@@ -504,41 +510,7 @@ var/list/ai_verbs_default = list(
updatehealth()
return 2
-/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
-
- switch(M.a_intent)
-
- if ("help")
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1)
-
- else //harm
- var/damage = rand(10, 20)
- if (prob(90))
- playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] has slashed at []!", M, src), 1)
- if(prob(8))
- flick("noise", flash)
- adjustBruteLoss(damage)
- updatehealth()
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [] took a swipe at []!", M, src), 1)
- return
-
-/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob)
+/mob/living/silicon/ai/attack_animal(mob/living/M as mob)
if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]")
else
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index c85349c4..6c5ffb73 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -3,7 +3,6 @@
icon = 'icons/mob/pai.dmi'
icon_state = "repairbot"
- robot_talk_understand = 0
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
small = 1
pass_flags = 1
@@ -473,4 +472,8 @@
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
- usr << msg
\ No newline at end of file
+ usr << msg
+
+// No binary for pAIs.
+/mob/living/silicon/pai/binarycheck()
+ return 0
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index 93ae8771..3aaf837a 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -229,7 +229,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
M << browse(dat, "window=paiRecruit;size=580x580;")
/datum/paiController/proc/findPAI(var/obj/item/device/paicard/p, var/mob/user)
- requestRecruits()
+ requestRecruits(user)
var/list/available = list()
for(var/datum/paiCandidate/c in paiController.pai_candidates)
if(c.ready)
@@ -345,7 +345,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates
user << browse(dat, "window=findPai")
-/datum/paiController/proc/requestRecruits()
+/datum/paiController/proc/requestRecruits(var/mob/user)
+ inquirer = user
for(var/mob/dead/observer/O in player_list)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
continue
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 87ac26d0..a5b20456 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -693,13 +693,16 @@
if(translator_on)
translator_on = 0
+ remove_language("Sign language")
remove_language("Sinta'unathi")
-// remove_language("Siik'tajr")
remove_language("Siik'Maas")
remove_language("Skrellian")
remove_language("Vox-pidgin")
remove_language("Rootspeak")
- remove_language("Sign language")
+ remove_language("Ceti Basic")
+ remove_language("Sol Common")
+ remove_language("Tradeband")
+ remove_language("Gutter")
src << "\blue Translator Module toggled OFF."
@@ -707,11 +710,14 @@
translator_on = 1
add_language("Sinta'unathi")
-// add_language("Siik'tajr")
add_language("Siik'Maas")
add_language("Skrellian")
add_language("Vox-pidgin")
add_language("Rootspeak")
- add_language("Sign language")
+ add_language("Ceti Basic")
+ add_language("Sol Common")
+ add_language("Tradeband")
+ add_language("Gutter")
+ add_language("Sign language", 0)
src << "\blue Translator Module toggled ON."
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index a28187c5..6927f837 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -130,6 +130,10 @@
var/datum/robot_component/C = components[module_name]
return C && C.installed == 1 && C.toggled && C.is_powered()
+// Returns component by it's string name
+/mob/living/silicon/robot/proc/get_component(var/component_name)
+ var/datum/robot_component/C = components[component_name]
+ return C
/obj/item/broken_device
name = "broken component"
icon = 'icons/obj/robot_component.dmi'
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index c56ed383..fad6704c 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -13,6 +13,7 @@
lawupdate = 0
density = 1
req_access = list(access_engine, access_robotics)
+ local_transmit = 1
// We need to keep track of a few module items so we don't need to do list operations
// every time we need them. These get set in New() after the module is chosen.
@@ -31,6 +32,9 @@
..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
+ remove_language("Robot Talk")
+ add_language("Robot Talk", 0)
+ add_language("Drone Talk", 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Engineering")
@@ -89,57 +93,6 @@
/mob/living/silicon/robot/drone/pick_module()
return
-//Drones can only use binary and say emotes. NOTHING else.
-//TBD, fix up boilerplate. ~ Z
-/mob/living/silicon/robot/drone/say(var/message)
-
- if (!message)
- return
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- src << "You cannot send IC messages (muted)."
- return
- if (src.client.handle_spam_prevention(message,MUTE_IC))
- return
-
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
-
- if (stat == 2)
- return say_dead(message)
-
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
- else if(length(message) >= 2)
-
- if(parse_message_mode(message, "NONE") == "dronechat")
-
- if(!is_component_functioning("radio"))
- src << "\red Your radio transmitter isn't functional."
- return
-
- for (var/mob/living/S in living_mob_list)
- if(istype(S, /mob/living/silicon/robot/drone))
- S << "Drone Talk, [name] transmits, \"[trim(copytext(message,3))]\""
-
- for (var/mob/M in dead_mob_list)
- if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
- M << "Drone Talk, [name] transmits, \"[trim(copytext(message,3))]\""
-
- else
-
- var/list/listeners = hearers(5,src)
- listeners |= src
-
- for(var/mob/living/silicon/robot/drone/D in listeners)
- if(D.client) D << "[src] transmits, \"[message]\""
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
- if(M.client) M << "[src] transmits, \"[message]\""
-
//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..().
/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 29dcbe23..bf1532c0 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -71,6 +71,8 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
+ add_language("Robot Talk", 1)
+
ident = rand(1, 999)
updatename("Default")
updateicon()
@@ -1302,3 +1304,10 @@
return
else
src << "Your icon has been set. You now require a module reset to change it."
+
+/mob/living/silicon/robot/binarycheck()
+ if(is_component_functioning("comms"))
+ var/datum/robot_component/RC = get_component("comms")
+ use_power(RC.energy_consumption)
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 5b3c8b3d..9f4cdb23 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -58,11 +58,12 @@
/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R)
//full set of languages
R.add_language("Sol Common", 1)
- R.add_language("Tradeband", 1)
+ R.add_language("Tradeband", 0)
R.add_language("Sinta'unathi", 0)
- R.add_language("Siik'tajr", 0)
+ R.add_language("Siik'Maas", 0)
R.add_language("Skrellian", 0)
R.add_language("Gutter", 0)
+ R.add_language("Rootspeak", 0)
/obj/item/weapon/robot_module/standard
@@ -317,8 +318,7 @@
//full set of languages
R.add_language("Sol Common", 1)
R.add_language("Sinta'unathi", 1)
- R.add_language("Siik'maas", 1)
- R.add_language("Siik'tajr", 0)
+ R.add_language("Siik'Maas", 1)
R.add_language("Skrellian", 1)
R.add_language("Rootspeak", 1)
R.add_language("Tradeband", 1)
@@ -339,8 +339,7 @@
add_languages(var/mob/living/silicon/robot/R)
R.add_language("Sol Common", 1)
R.add_language("Sinta'unathi", 1)
- R.add_language("Siik'maas", 1)
- R.add_language("Siik'tajr", 0)
+ R.add_language("Siik'Maas", 1)
R.add_language("Skrellian", 1)
R.add_language("Rootspeak", 1)
R.add_language("Tradeband", 1)
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index c57dbdcd..c5ee9978 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -54,7 +54,6 @@
var/mob/living/silicon/robot/R = src
var/mob/living/silicon/pai/P = src
-
//Must be concious to speak
if (stat)
return
@@ -69,17 +68,35 @@
else
message = trim(copytext(message,3))
- if(message_mode && bot_type == IS_ROBOT && message_mode != "binary" && !R.is_component_functioning("radio"))
- src << "\red Your radio isn't functional at this time."
- return
-
-
//parse language key and consume it
var/datum/language/speaking = parse_language(message)
if (speaking)
verb = speaking.speech_verb
message = copytext(message,3)
+ if(speaking.flags & HIVEMIND)
+ speaking.broadcast(src,trim(message))
+ return
+
+ // Currently used by drones.
+ if(local_transmit)
+ var/list/listeners = hearers(5,src)
+ listeners |= src
+
+ for(var/mob/living/silicon/D in listeners)
+ if(D.client && istype(D,src.type))
+ D << "[src] transmits, \"[message]\""
+
+ for (var/mob/M in player_list)
+ if (istype(M, /mob/new_player))
+ continue
+ else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
+ if(M.client) M << "[src] transmits, \"[message]\""
+ return
+
+ if(message_mode && bot_type == IS_ROBOT && !R.is_component_functioning("radio"))
+ src << "\red Your radio isn't functional at this time."
+ return
switch(message_mode)
if("department")
@@ -94,17 +111,6 @@
P.radio.talk_into(src,message,message_mode,verb,speaking)
return 1
- if("binary")
- switch(bot_type)
- if(IS_ROBOT)
- if(!R.is_component_functioning("comms"))
- src << "\red Your binary communications component isn't functional."
- return
- if(IS_PAI)
- src << "You do not appear to have that function"
- return
-
- robot_talk(message)
return 1
if("general")
switch(bot_type)
@@ -124,7 +130,7 @@
return 1
else
- if(message_mode && message_mode in radiochannels)
+ if(message_mode)
switch(bot_type)
if(IS_AI)
if (AI.aiRadio.disabledAi)
@@ -177,59 +183,6 @@
return
return 1
-/mob/living/proc/robot_talk(var/message)
-
- log_say("[key_name(src)] : [message]")
-
- message = trim(message)
-
- if (!message)
- return
-
- var/verb = say_quote(message)
-
-
- var/rendered = "Robotic Talk, [name] [verb], \"[message]\""
-
- for (var/mob/living/S in living_mob_list)
- if(S.robot_talk_understand && (S.robot_talk_understand == robot_talk_understand)) // This SHOULD catch everything caught by the one below, but I'm not going to change it.
- if(istype(S , /mob/living/silicon/ai))
- var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\""
- S.show_message(renderedAI, 2)
- else
- S.show_message(rendered, 2)
-
-
- else if (S.binarycheck())
- if(istype(S , /mob/living/silicon/ai))
- var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\""
- S.show_message(renderedAI, 2)
- else
- S.show_message(rendered, 2)
-
- var/list/listening = hearers(1, src)
- listening -= src
-
- var/list/heard = list()
- for (var/mob/M in listening)
- if(!istype(M, /mob/living/silicon) && !M.robot_talk_understand)
- heard += M
- if (length(heard))
- var/message_beep
- verb = "beeps"
- message_beep = "beep beep beep"
-
- rendered = "[voice_name] [verb], \"[message_beep]\""
-
- for (var/mob/M in heard)
- M.show_message(rendered, 2)
-
- rendered = "Robotic Talk, [name] [verb], \"[message]\""
-
- for (var/mob/M in dead_mob_list)
- if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
- M.show_message(rendered, 2)
-
#undef IS_AI
#undef IS_ROBOT
#undef IS_PAI
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 575465ac..ca4fadba 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -1,6 +1,5 @@
/mob/living/silicon
gender = NEUTER
- robot_talk_understand = 1
voice_name = "synthesized voice"
var/syndicate = 0
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
@@ -14,6 +13,10 @@
var/speak_query = "queries"
var/pose //Yes, now AIs can pose too.
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
+ var/local_transmit //If set, can only speak to others of the same type within a short range.
+/mob/living/silicon/New()
+ ..()
+ add_language("Ceti Basic")
/mob/living/silicon/proc/show_laws()
return
@@ -164,6 +167,7 @@
/mob/living/silicon/add_language(var/language, var/can_speak=1)
if (..(language) && can_speak)
speech_synthesizer_langs.Add(all_languages[language])
+ return 1
/mob/living/silicon/remove_language(var/rem_language)
..(rem_language)
@@ -197,4 +201,7 @@
set desc = "Sets an extended description of your character's features."
set category = "IC"
- flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
\ No newline at end of file
+ flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
+
+/mob/living/silicon/binarycheck()
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index bc4f666e..c7a968a1 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -87,8 +87,6 @@
return 1
if (istype(other, src.type) || istype(src, other.type))
return 1
- if(src.alien_talk_understand && other.alien_talk_understand)
- return 1
return 0
//Language check.