From a92e058b6c72a9ddf408a2df7f0327059aeadda6 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Tue, 14 Apr 2015 19:18:02 -0700 Subject: [PATCH 1/2] Selectable default languages This commit allows any mob which can speak to choose one of their known languages as 'default', which makes anything that they say with no prefix (EG; say 'lol'), use that language. This commit also changes the 'galactic common' language to use :9 instead of :0, as :0 does not work due to BYOND.. strangeness. Implements two new IC-tab verbs and updates the check-known-languages panel to also integrate with this system. --- code/modules/mob/language.dm | 36 ++++++++++++++++++- .../living/carbon/alien/humanoid/humanoid.dm | 4 +-- code/modules/mob/living/carbon/alien/say.dm | 16 +++++++-- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 9 +++++ code/modules/mob/living/carbon/human/say.dm | 6 ++-- code/modules/mob/living/default_language.dm | 25 +++++++++++++ code/modules/mob/living/say.dm | 3 ++ code/modules/mob/living/silicon/say.dm | 11 ++++-- code/modules/mob/living/silicon/silicon.dm | 12 ++++++- paradise.dme | 1 + 11 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 code/modules/mob/living/default_language.dm 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..78542a79fc8 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -15,11 +15,21 @@ if(copytext(message,1,2) == "*") return emote(copytext(message,2)) + var/needtohack = 1 //hacky way to get around stupid byond shit var/datum/language/speaking = parse_language(message) + + if(speaking == null) + var/quickcheck = get_default_language() + if(quickcheck == null) + speaking = all_languages["Xenomorph"] //this is the hackiest thing, no clue how to avoid it + needtohack = 0 + else + speaking = get_default_language() + needtohack = 0 + if(speaking) - message = copytext(message,2+length(speaking.key)) - else - speaking = all_languages["Xenomorph"] + if(needtohack) + message = copytext(message,2+length(speaking.key)) 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 87eecd202a9..3bb366c7a50 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -631,4 +631,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 56d0f59048d..6f97235ec2e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1392,6 +1392,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..c5aa2467674 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -69,10 +69,17 @@ message = trim(copytext(message,3)) //parse language key and consume it + var/needtohack = 1 //hacky way to get around stupid byond shit var/datum/language/speaking = parse_language(message) - if (speaking) + + if(speaking == null) + speaking = get_default_language() + needtohack = 0 + + if (speaking && !(speaking == null)) verb = speaking.speech_verb - message = trim(copytext(message,2+length(speaking.key))) + if(needtohack) + message = trim(copytext(message,2+length(speaking.key))) if(speaking.flags & HIVEMIND) speaking.broadcast(src,trim(message)) 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 f4bdc02c04c..28f6a5795f6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1147,6 +1147,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" From b8f5fd50311733c546f3914729aed48968f92a84 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 15 Apr 2015 19:31:17 -0700 Subject: [PATCH 2/2] Cleanup code and remove needtohack insanity code This cleans up the code and properly integrates a few things, instead of the absolutely tragic and insane code bypassing it, literally named var/needtohack. --- code/modules/mob/living/carbon/alien/say.dm | 19 +++++++------------ code/modules/mob/living/silicon/say.dm | 13 ++++++------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 78542a79fc8..8d2e77a0601 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -15,21 +15,16 @@ if(copytext(message,1,2) == "*") return emote(copytext(message,2)) - var/needtohack = 1 //hacky way to get around stupid byond shit var/datum/language/speaking = parse_language(message) - if(speaking == null) - var/quickcheck = get_default_language() - if(quickcheck == null) - speaking = all_languages["Xenomorph"] //this is the hackiest thing, no clue how to avoid it - needtohack = 0 - else - speaking = get_default_language() - needtohack = 0 - if(speaking) - if(needtohack) - message = copytext(message,2+length(speaking.key)) + message = copytext(message,2+length(speaking.key)) + else + 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/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index c5aa2467674..125dc9ea992 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -69,18 +69,17 @@ message = trim(copytext(message,3)) //parse language key and consume it - var/needtohack = 1 //hacky way to get around stupid byond shit var/datum/language/speaking = parse_language(message) + if (speaking) - if(speaking == null) + message = trim(copytext(message,2+length(speaking.key))) + else speaking = get_default_language() - needtohack = 0 - if (speaking && !(speaking == null)) + if (speaking) verb = speaking.speech_verb - if(needtohack) - message = trim(copytext(message,2+length(speaking.key))) - + // 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