Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-26952
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
/datum/language/draconic
|
||||
name = "Draconic"
|
||||
desc = "The common language of lizard-people, composed of sibilant hisses and rattles."
|
||||
speech_verb = "hisses"
|
||||
ask_verb = "hisses"
|
||||
exclaim_verb = "roars"
|
||||
key = "o"
|
||||
flags = TONGUELESS_SPEECH
|
||||
space_chance = 40
|
||||
syllables = list(
|
||||
"za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz",
|
||||
"ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh",
|
||||
"la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl",
|
||||
"ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk",
|
||||
"sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss",
|
||||
"ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr",
|
||||
"a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s"
|
||||
)
|
||||
icon_state = "lizard"
|
||||
default_priority = 90
|
||||
@@ -12,7 +12,8 @@
|
||||
var/exclaim_verb = "exclaims" // Used when sentence ends in a !
|
||||
var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead.
|
||||
var/list/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
|
||||
var/key = "x" // Character used to speak in language
|
||||
var/key // Character used to speak in language
|
||||
// If key is null, then the language isn't real or learnable.
|
||||
var/flags // Various language flags.
|
||||
var/list/syllables // Used when scrambling text for a non-speaker.
|
||||
var/list/sentence_chance = 5 // Likelihood of making a new sentence after each syllable.
|
||||
@@ -108,13 +109,3 @@
|
||||
return speech_verb
|
||||
|
||||
#undef SCRAMBLE_CACHE_LEN
|
||||
|
||||
/proc/get_language_instance(langtype)
|
||||
if(!ispath(langtype, /datum/language))
|
||||
return
|
||||
|
||||
if(!GLOB.language_datums[langtype])
|
||||
var/datum/language/langdatum = new langtype
|
||||
GLOB.language_datums[langtype] = langdatum
|
||||
|
||||
. = GLOB.language_datums[langtype]
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/datum/language_holder
|
||||
var/list/languages = list(/datum/language/common)
|
||||
var/list/shadow_languages = list()
|
||||
var/only_speaks_language = null
|
||||
var/selected_default_language = null
|
||||
var/datum/language_menu/language_menu
|
||||
|
||||
var/omnitongue = FALSE
|
||||
var/owner
|
||||
|
||||
/datum/language_holder/New(owner)
|
||||
src.owner = owner
|
||||
|
||||
languages = typecacheof(languages)
|
||||
shadow_languages = typecacheof(shadow_languages)
|
||||
|
||||
/datum/language_holder/Destroy()
|
||||
owner = null
|
||||
QDEL_NULL(language_menu)
|
||||
|
||||
/datum/language_holder/proc/copy(newowner)
|
||||
var/datum/language_holder/copy = new(newowner)
|
||||
copy.languages = src.languages.Copy()
|
||||
// shadow languages are not copied.
|
||||
copy.only_speaks_language = src.only_speaks_language
|
||||
copy.selected_default_language = src.selected_default_language
|
||||
// language menu is not copied, that's tied to the holder.
|
||||
copy.omnitongue = src.omnitongue
|
||||
return copy
|
||||
|
||||
/datum/language_holder/proc/grant_language(datum/language/dt)
|
||||
languages[dt] = TRUE
|
||||
|
||||
/datum/language_holder/proc/grant_all_languages(omnitongue=FALSE)
|
||||
for(var/la in GLOB.all_languages)
|
||||
grant_language(la)
|
||||
|
||||
if(omnitongue)
|
||||
src.omnitongue = TRUE
|
||||
|
||||
/datum/language_holder/proc/get_random_understood_language()
|
||||
var/list/possible = list()
|
||||
for(var/dt in languages)
|
||||
possible += dt
|
||||
. = safepick(possible)
|
||||
|
||||
/datum/language_holder/proc/remove_language(datum/language/dt)
|
||||
languages -= dt
|
||||
|
||||
/datum/language_holder/proc/remove_all_languages()
|
||||
languages.Cut()
|
||||
|
||||
/datum/language_holder/proc/has_language(datum/language/dt)
|
||||
if(is_type_in_typecache(dt, languages))
|
||||
return LANGUAGE_KNOWN
|
||||
else
|
||||
var/atom/movable/AM = get_atom()
|
||||
var/datum/language_holder/L = AM.get_language_holder(shadow=FALSE)
|
||||
if(L != src)
|
||||
if(is_type_in_typecache(dt, L.shadow_languages))
|
||||
return LANGUAGE_SHADOWED
|
||||
return FALSE
|
||||
|
||||
/datum/language_holder/proc/open_language_menu(mob/user)
|
||||
if(!language_menu)
|
||||
language_menu = new(src)
|
||||
language_menu.ui_interact(user)
|
||||
|
||||
/datum/language_holder/proc/get_atom()
|
||||
if(istype(owner, /atom/movable))
|
||||
. = owner
|
||||
else if(istype(owner, /datum/mind))
|
||||
var/datum/mind/M = owner
|
||||
if(M.current)
|
||||
. = M.current
|
||||
|
||||
/datum/language_holder/alien
|
||||
languages = list(/datum/language/xenocommon)
|
||||
|
||||
/datum/language_holder/monkey
|
||||
languages = list(/datum/language/monkey)
|
||||
|
||||
/datum/language_holder/swarmer
|
||||
languages = list(/datum/language/swarmer)
|
||||
|
||||
/datum/language_holder/clockmob
|
||||
languages = list(/datum/language/common, /datum/language/ratvar)
|
||||
only_speaks_language = /datum/language/ratvar
|
||||
|
||||
/datum/language_holder/drone
|
||||
languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine)
|
||||
only_speaks_language = /datum/language/drone
|
||||
|
||||
/datum/language_holder/drone/syndicate
|
||||
only_speaks_language = null
|
||||
|
||||
/datum/language_holder/slime
|
||||
languages = list(/datum/language/common, /datum/language/slime)
|
||||
|
||||
/datum/language_holder/lightbringer
|
||||
// TODO change to a lightbringer specific sign language
|
||||
languages = list(/datum/language/slime)
|
||||
|
||||
/datum/language_holder/synthetic
|
||||
languages = list(/datum/language/common)
|
||||
shadow_languages = list(/datum/language/machine, /datum/language/draconic)
|
||||
|
||||
/datum/language_holder/universal/New()
|
||||
..()
|
||||
grant_all_languages(omnitongue=TRUE)
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/language_menu
|
||||
var/mob/living/owner
|
||||
var/datum/language_holder/language_holder
|
||||
|
||||
/datum/language_menu/New(new_owner)
|
||||
owner = new_owner
|
||||
/datum/language_menu/New(language_holder)
|
||||
src.language_holder = language_holder
|
||||
|
||||
/datum/language_menu/Destroy()
|
||||
owner = null
|
||||
language_holder = null
|
||||
. = ..()
|
||||
|
||||
/datum/language_menu/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.language_menu_state)
|
||||
@@ -17,28 +17,38 @@
|
||||
/datum/language_menu/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
var/datum/language/mob_default_language = owner.get_default_language()
|
||||
var/atom/movable/AM = language_holder.get_atom()
|
||||
if(isliving(AM))
|
||||
data["is_living"] = TRUE
|
||||
else
|
||||
data["is_living"] = FALSE
|
||||
|
||||
data["languages"] = list()
|
||||
for(var/ld in owner.languages)
|
||||
for(var/ld in GLOB.all_languages)
|
||||
var/result = language_holder.has_language(ld)
|
||||
if(!result)
|
||||
continue
|
||||
var/shadow = result == LANGUAGE_SHADOWED
|
||||
var/datum/language/LD = ld
|
||||
var/list/L = list()
|
||||
|
||||
L["name"] = initial(LD.name)
|
||||
L["desc"] = initial(LD.desc)
|
||||
L["key"] = initial(LD.key)
|
||||
L["is_default"] = (LD == mob_default_language)
|
||||
L["can_speak"] = owner.can_speak_in_language(LD)
|
||||
L["is_default"] = (LD == language_holder.selected_default_language)
|
||||
L["shadow"] = shadow
|
||||
if(AM)
|
||||
L["can_speak"] = AM.can_speak_in_language(LD)
|
||||
|
||||
data["languages"] += list(L)
|
||||
|
||||
if(check_rights_for(user.client, R_ADMIN))
|
||||
if(check_rights_for(user.client, R_ADMIN) || isobserver(AM))
|
||||
data["admin_mode"] = TRUE
|
||||
data["omnitongue"] = HAS_SECONDARY_FLAG(owner, OMNITONGUE)
|
||||
data["omnitongue"] = language_holder.omnitongue
|
||||
|
||||
data["unknown_languages"] = list()
|
||||
for(var/ld in subtypesof(/datum/language))
|
||||
if(owner.has_language(ld))
|
||||
for(var/ld in GLOB.all_languages)
|
||||
if(language_holder.has_language(ld))
|
||||
continue
|
||||
var/datum/language/LD = ld
|
||||
var/list/L = list()
|
||||
@@ -54,10 +64,11 @@
|
||||
if(..())
|
||||
return
|
||||
var/mob/user = usr
|
||||
var/atom/movable/AM = language_holder.get_atom()
|
||||
|
||||
var/language_name = params["language_name"]
|
||||
var/datum/language/language_datum
|
||||
for(var/ld in subtypesof(/datum/language))
|
||||
for(var/ld in GLOB.all_languages)
|
||||
var/datum/language/LD = ld
|
||||
if(language_name == initial(LD.name))
|
||||
language_datum = LD
|
||||
@@ -66,23 +77,26 @@
|
||||
switch(action)
|
||||
if("select_default")
|
||||
if(language_datum)
|
||||
owner.selected_default_language = language_datum
|
||||
language_holder.selected_default_language = language_datum
|
||||
. = TRUE
|
||||
if("grant_language")
|
||||
if(is_admin && language_datum)
|
||||
owner.grant_language(language_datum)
|
||||
message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(owner)].")
|
||||
log_admin("[key_name(user)] granted the language [language_name] to [key_name(owner)].")
|
||||
if((is_admin || isobserver(AM)) && language_datum)
|
||||
language_holder.grant_language(language_datum)
|
||||
if(is_admin)
|
||||
message_admins("[key_name_admin(user)] granted the [language_name] language to [key_name_admin(AM)].")
|
||||
log_admin("[key_name(user)] granted the language [language_name] to [key_name(AM)].")
|
||||
. = TRUE
|
||||
if("remove_language")
|
||||
if(is_admin && language_datum)
|
||||
owner.remove_language(language_datum)
|
||||
message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(owner)].")
|
||||
log_admin("[key_name(user)] removed the language [language_name] to [key_name(owner)].")
|
||||
if((is_admin || isobserver(AM)) && language_datum)
|
||||
language_holder.remove_language(language_datum)
|
||||
if(is_admin)
|
||||
message_admins("[key_name_admin(user)] removed the [language_name] language to [key_name_admin(AM)].")
|
||||
log_admin("[key_name(user)] removed the language [language_name] to [key_name(AM)].")
|
||||
. = TRUE
|
||||
if("toggle_omnitongue")
|
||||
if(is_admin)
|
||||
TOGGLE_SECONDARY_FLAG(owner, OMNITONGUE)
|
||||
message_admins("[key_name_admin(user)] [HAS_SECONDARY_FLAG(owner, OMNITONGUE) ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(owner)].")
|
||||
log_admin("[key_name(user)] [HAS_SECONDARY_FLAG(owner, OMNITONGUE) ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(owner)].")
|
||||
if(is_admin || isobserver(AM))
|
||||
language_holder.omnitongue = !language_holder.omnitongue
|
||||
if(is_admin)
|
||||
message_admins("[key_name_admin(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(AM)].")
|
||||
log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(AM)].")
|
||||
. = TRUE
|
||||
|
||||
Reference in New Issue
Block a user