mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-20 09:36:34 +01:00
123 lines
4.7 KiB
Plaintext
123 lines
4.7 KiB
Plaintext
/datum/category_item/player_setup_item/background/language
|
|
name = "Language"
|
|
sort_order = 1.5
|
|
save_key = CHARACTER_DATA_LANGUAGES
|
|
load_order = PREFERENCE_LOAD_ORDER_LANGUAGE
|
|
|
|
/datum/category_item/player_setup_item/background/language/content(datum/preferences/prefs, mob/user, data)
|
|
. = list()
|
|
var/list/innate_names = list()
|
|
for(var/id in prefs.innate_language_ids())
|
|
var/datum/prototype/language/L = RSlanguages.fetch(id)
|
|
innate_names += L.name
|
|
. += "<center><b>Languages</b></center>"
|
|
. += "<div class='statusDisplay'>"
|
|
. += "    Intrinsic (Species, Backgrounds, Cultures): [english_list(innate_names)]<br>"
|
|
. += "    Additional: "
|
|
var/count = 0
|
|
for(var/id in prefs.extraneous_language_ids())
|
|
++count
|
|
var/datum/prototype/language/L = RSlanguages.fetch(id)
|
|
. += "[L.name] [href_simple(prefs, "remove", "Remove", id)]"
|
|
. += " "
|
|
if(count < prefs.extraneous_languages_max())
|
|
. += "[href_simple(prefs, "add", "Add")]"
|
|
. += "</div>"
|
|
|
|
/datum/category_item/player_setup_item/background/language/act(datum/preferences/prefs, mob/user, action, list/params)
|
|
switch(action)
|
|
if("add")
|
|
prefs.language_pick(user)
|
|
return PREFERENCES_HANDLED
|
|
if("remove")
|
|
var/id = params["remove"]
|
|
var/list/existing = read(prefs)
|
|
if(existing.Remove(id))
|
|
write(prefs, existing)
|
|
return PREFERENCES_REFRESH
|
|
return PREFERENCES_NOACTION
|
|
return ..()
|
|
|
|
/datum/category_item/player_setup_item/background/language/filter_data(datum/preferences/prefs, data, list/errors)
|
|
var/list/languages = sanitize_islist(data)
|
|
var/list/innate = prefs.innate_language_ids()
|
|
var/list/extra = languages.Copy()
|
|
extra -= innate
|
|
var/extra_max = prefs.extraneous_languages_max()
|
|
if(extra.len > extra_max)
|
|
var/list/truncated = extra.Copy(extra_max + 1)
|
|
extra.len = clamp(extra.len, 0, extra_max)
|
|
errors?.Add(SPAN_WARNING("truncated [english_list(truncated)] languages - too many!"))
|
|
for(var/id in extra)
|
|
if(isnull(RSlanguages.fetch(id)))
|
|
extra -= id
|
|
errors?.Add(SPAN_WARNING("removed id [id] - can't locate it."))
|
|
continue
|
|
return extra
|
|
|
|
/datum/category_item/player_setup_item/background/language/copy_to_mob(datum/preferences/prefs, mob/M, data, flags)
|
|
if(!ishuman(M))
|
|
return TRUE
|
|
var/mob/living/carbon/human/H = M
|
|
// todo: sources - this one is extraneous
|
|
for(var/id in data)
|
|
H.add_language(id)
|
|
|
|
/datum/category_item/player_setup_item/background/language/spawn_checks(datum/preferences/prefs, data, flags, list/errors, list/warnings)
|
|
if(length(data) > prefs.extraneous_languages_max())
|
|
errors?.Add(SPAN_WARNING("You have selected too many extra languages for your species and culture."))
|
|
return FALSE
|
|
var/list/extraneous = data
|
|
var/datum/species/CS = prefs.character_species_datum()
|
|
var/list/whitelisted_ids = CS.get_whitelisted_language_ids() // cache ids from character species for speed
|
|
for(var/id in extraneous)
|
|
var/datum/prototype/language/L = RSlanguages.fetch(id)
|
|
if((L.language_flags & LANGUAGE_WHITELISTED) && (!(L.id in whitelisted_ids)) && !Configuration.check_language_whitelist(L.id, prefs.client_ckey))
|
|
errors?.Add(SPAN_WARNING("[L] is a whitelisted language."))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/category_item/player_setup_item/background/language/default_value(randomizing)
|
|
return list(LANGUAGE_ID_COMMON)
|
|
|
|
/datum/category_item/player_setup_item/background/language/informed_default_value(datum/preferences/prefs, randomizing)
|
|
return prefs.innate_language_ids()
|
|
|
|
/**
|
|
* returns ids of languages that are innate to our species/background
|
|
*/
|
|
/datum/preferences/proc/innate_language_ids(include_background = TRUE)
|
|
RETURN_TYPE(/list)
|
|
var/datum/species/S = character_species_datum()
|
|
. = S.get_intrinsic_language_ids()
|
|
if(include_background)
|
|
var/list/datum/lore/character_background/backgrounds = all_background_datums()
|
|
for(var/datum/lore/character_background/B in backgrounds) // eh let's type filter
|
|
if(!B.innate_languages)
|
|
continue
|
|
. |= B.innate_languages
|
|
|
|
/**
|
|
* returns max amounts we can have. doesn't take into account what we do have.
|
|
*/
|
|
/datum/preferences/proc/extraneous_languages_max()
|
|
var/list/datum/lore/character_background/backgrounds = all_background_datums()
|
|
var/tally = character_species_datum().max_additional_languages
|
|
for(var/datum/lore/character_background/B in backgrounds) // eh let's type filter
|
|
tally += B.language_amount_mod
|
|
return max(tally, 0)
|
|
|
|
/**
|
|
* returns ids of languages that aren't innate to our species/background
|
|
*/
|
|
/datum/preferences/proc/extraneous_language_ids()
|
|
RETURN_TYPE(/list)
|
|
return get_character_data(CHARACTER_DATA_LANGUAGES) - innate_language_ids()
|
|
|
|
/**
|
|
* returns ids of ALL languages
|
|
*/
|
|
/datum/preferences/proc/all_language_ids()
|
|
RETURN_TYPE(/list)
|
|
return innate_language_ids() + get_character_data(CHARACTER_DATA_LANGUAGES)
|