diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 177d189cb2c..fa5725faf19 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -260,7 +260,7 @@
desc = "The common galactic tongue."
speech_verb = "says"
whisper_verb = "whispers"
- key = "0"
+ key = "9"
flags = RESTRICTED
syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah")
@@ -468,6 +468,12 @@
. = (L in languages)
languages.Remove(L)
+/mob/living/remove_language(rem_language)
+ var/datum/language/L = all_languages[rem_language]
+ if(default_language == L)
+ default_language = null
+ return ..()
+
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
@@ -488,4 +494,32 @@
src << browse(dat, "window=checklanguage")
return
+/mob/living/check_languages()
+ var/dat = "Known Languages
"
+
+ if(default_language)
+ dat += "Current default language: [default_language] - reset
"
+
+ for(var/datum/language/L in languages)
+ if(!(L.flags & NONGLOBAL))
+ if(L == default_language)
+ dat += "[L.name] (:[L.key]) - default - reset
[L.desc]
"
+ else
+ dat += "[L.name] (:[L.key]) - set default
[L.desc]
"
+
+ src << browse(dat, "window=checklanguage")
+
+/mob/living/Topic(href, href_list)
+ if(href_list["default_lang"])
+ if(href_list["default_lang"] == "reset")
+ set_default_language(null)
+ else
+ var/datum/language/L = all_languages[href_list["default_lang"]]
+ if(L)
+ set_default_language(L)
+ check_languages()
+ return 1
+ else
+ return ..()
+
#undef SCRAMBLE_CACHE_LEN
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index c3e0022ff00..3d346f83941 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -65,9 +65,9 @@
return (tally + move_delay_add + config.alien_delay)
/mob/living/carbon/alien/humanoid/Process_Spacemove(var/check_drift = 0)
- if(..())
+ if(..())
return 1
-
+
return 0
///mob/living/carbon/alien/humanoid/bullet_act(var/obj/item/projectile/Proj) taken care of in living
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index 4aeace5be7b..8d2e77a0601 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -16,10 +16,15 @@
return emote(copytext(message,2))
var/datum/language/speaking = parse_language(message)
+
if(speaking)
message = copytext(message,2+length(speaking.key))
else
- speaking = all_languages["Xenomorph"]
+ var/quickcheck = get_default_language()
+ if(quickcheck)
+ speaking = get_default_language()
+ else //because no clue how to actually set xeno's default language since they aren't a species, just do it here
+ speaking = all_languages["Xenomorph"]
var/ending = copytext(message, length(message))
if (speaking)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3584fe94a7f..c52ba708661 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -634,4 +634,4 @@
return 0
/mob/living/carbon/is_muzzled()
- return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
+ return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4448798c28a..68e7d680862 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1397,6 +1397,15 @@
else
return 0
+/mob/living/carbon/human/get_default_language()
+ if(default_language)
+ return default_language
+
+ if(!species)
+ return null
+ return species.default_language ? all_languages[species.default_language] : null
+
+
/mob/living/carbon/human/proc/bloody_doodle()
set category = "IC"
set name = "Write in blood"
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 1eda618789a..53d6689d36e 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -16,7 +16,7 @@
if(stat == 2)
return say_dead(message)
return
-
+
if (is_muzzled())
src << "You're muzzled and cannot speak!"
return
@@ -40,8 +40,8 @@
var/datum/language/speaking = parse_language(message)
if(speaking)
message = copytext(message,2+length(speaking.key))
- else if(species.default_language)
- speaking = all_languages[species.default_language]
+ else
+ speaking = get_default_language()
var/ending = copytext(message, length(message))
if (speaking)
diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm
new file mode 100644
index 00000000000..b0de6465aff
--- /dev/null
+++ b/code/modules/mob/living/default_language.dm
@@ -0,0 +1,25 @@
+/mob/living
+ var/datum/language/default_language
+
+/mob/living/verb/set_default_language(language as null|anything in languages)
+ set name = "Set Default Language"
+ set category = "IC"
+
+ if(language)
+ src << "You will now speak [language] if you do not specify a language when speaking."
+ else
+ src << "You will now speak whatever your standard default language is if you do not specify one when speaking."
+ default_language = language
+
+// Silicons can't neccessarily speak everything in their languages list
+/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs)
+ ..()
+
+/mob/living/verb/check_default_language()
+ set name = "Check Default Language"
+ set category = "IC"
+
+ if(default_language)
+ src << "You are currently speaking [default_language] by default."
+ else
+ src << "Your current default language is your species or mob type default."
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b5ec333f1fa..6d6706a056a 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -64,6 +64,9 @@ proc/get_radio_key_from_channel(var/channel)
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
+/mob/living/proc/get_default_language()
+ return default_language
+
/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)
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index ba5b0ad4f82..125dc9ea992 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -71,9 +71,15 @@
//parse language key and consume it
var/datum/language/speaking = parse_language(message)
if (speaking)
- verb = speaking.speech_verb
- message = trim(copytext(message,2+length(speaking.key)))
+ message = trim(copytext(message,2+length(speaking.key)))
+ else
+ speaking = get_default_language()
+
+ if (speaking)
+ verb = speaking.speech_verb
+ // 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 1
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index e1dfc6907bb..6d0b1768f03 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -237,9 +237,19 @@
var/dat = "Known Languages
"
+ if(default_language)
+ dat += "Current default language: [default_language] - reset
"
+
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
- dat += "[L.name] (:[L.key])
Speech Synthesizer: [(L in speech_synthesizer_langs)? "YES":"NOT SUPPORTED"]
[L.desc]
"
+ var/default_str
+ if(L == default_language)
+ default_str = " - default - reset"
+ else
+ default_str = " - set default"
+
+ var/synth = (L in speech_synthesizer_langs)
+ dat += "[L.name] (:[L.key])[synth ? default_str : null]
Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"]
[L.desc]
"
src << browse(dat, "window=checklanguage")
return
diff --git a/paradise.dme b/paradise.dme
index 899cc7bde06..47cb9cbd971 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1148,6 +1148,7 @@
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\dead\observer\spells.dm"
#include "code\modules\mob\living\damage_procs.dm"
+#include "code\modules\mob\living\default_language.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"