diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index fa7d9f8f0a9..0daa8464f1c 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -183,18 +183,20 @@ #define ROBOT_NOTIFICATION_MODULE_RESET 4 // Appearance change flags -#define APPEARANCE_UPDATE_DNA 0x1 -#define APPEARANCE_RACE (0x2|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_GENDER (0x4|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_SKIN 0x8 -#define APPEARANCE_HAIR 0x10 -#define APPEARANCE_HAIR_COLOR 0x20 -#define APPEARANCE_FACIAL_HAIR 0x40 -#define APPEARANCE_FACIAL_HAIR_COLOR 0x80 -#define APPEARANCE_EYE_COLOR 0x100 -#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) -#define APPEARANCE_ALL 0xFFFF -#define APPEARANCE_PLASTICSURGERY (APPEARANCE_ALL & ~APPEARANCE_RACE) +#define APPEARANCE_UPDATE_DNA 1 +#define APPEARANCE_RACE (2|APPEARANCE_UPDATE_DNA) +#define APPEARANCE_GENDER (4|APPEARANCE_UPDATE_DNA) +#define APPEARANCE_SKIN 8 +#define APPEARANCE_HAIR 16 +#define APPEARANCE_HAIR_COLOR 32 +#define APPEARANCE_FACIAL_HAIR 64 +#define APPEARANCE_FACIAL_HAIR_COLOR 128 +#define APPEARANCE_EYE_COLOR 256 +#define APPEARANCE_ACCENT 512 +#define APPEARANCE_LANGUAGE 1024 +#define APPEARANCE_ALL 65535 +#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) +#define APPEARANCE_PLASTICSURGERY (APPEARANCE_ALL & ~APPEARANCE_RACE) // Click cooldown #define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index faf50d6f395..985c5201386 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -2042,18 +2042,43 @@ return ..(speaking, hearer, used_accent) /mob/living/carbon/human/proc/generate_valid_accent() - var/list/valid_accents = new() + var/list/valid_accents = list() for(var/current_accents in species.allowed_accents) valid_accents += current_accents - return valid_accents +/mob/living/carbon/human/proc/generate_valid_languages() + var/list/available_languages = species.secondary_langs.Copy() + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if(!(lang.flags & RESTRICTED) && (!config.usealienwhitelist || is_alien_whitelisted(src, L) || !(lang.flags & WHITELISTED))) + available_languages |= L + return available_languages + /mob/living/carbon/human/proc/set_accent(var/new_accent) accent = new_accent if(!(accent in species.allowed_accents)) accent = species.default_accent return TRUE +/mob/living/carbon/human/proc/add_or_remove_language(var/language) + var/datum/language/new_language = all_languages[language] + if(!new_language || !istype(new_language)) + to_chat(src, SPAN_WARNING("Invalid language!")) + return TRUE + if(new_language in languages) + if(remove_language(language)) + to_chat(src, SPAN_NOTICE("You no longer know [new_language.name].")) + return TRUE + var/total_alternate_languages = languages.Copy() + total_alternate_languages -= all_languages[LANGUAGE_TCB] + if(length(total_alternate_languages) >= species.num_alternate_languages) + to_chat(src, SPAN_WARNING("You can't add any more languages!")) + return TRUE + if(add_language(language)) + to_chat(src, SPAN_NOTICE("You now know [language].")) + return TRUE + /mob/living/carbon/human/verb/click_belt() set hidden = 1 set name = "click_belt" diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 8a118f26289..a00c80e17cc 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -7,6 +7,7 @@ var/list/valid_hairstyles = list() var/list/valid_facial_hairstyles = list() var/list/valid_accents = list() + var/list/valid_languages = list() var/check_whitelist var/list/whitelist @@ -101,10 +102,15 @@ update_dna() return 1 if(href_list["accent"]) - if(can_change(APPEARANCE_GENDER) && (href_list["accent"] in valid_accents)) + if(can_change(APPEARANCE_ACCENT) && (href_list["accent"] in valid_accents)) if(owner.set_accent(href_list["accent"])) cut_and_generate_data() return 1 + if(href_list["language"]) + if(can_change(APPEARANCE_LANGUAGE) && (href_list["language"] in valid_languages)) + if(owner.add_or_remove_language(href_list["language"])) + cut_and_generate_data() + return 1 return 0 @@ -119,27 +125,38 @@ data["gender"] = owner.gender data["change_race"] = can_change(APPEARANCE_RACE) if(data["change_race"]) - var/species[0] + var/list/species = list() for(var/specimen in valid_species) - species[++species.len] = list("specimen" = specimen) + species[++species.len] = list("specimen" = specimen) data["species"] = species data["change_gender"] = can_change(APPEARANCE_GENDER) data["accent"] = owner.accent data["change_accent"] = can_change(APPEARANCE_GENDER) if(data["change_accent"]) - var/accents[0] + var/list/accents = list() for(var/accent in valid_accents) - accents[++accents.len] = list("accent" = accent) + accents[++accents.len] = list("accent" = accent) data["accents"] = accents + var/list/owner_languages = list() + for(var/datum/language/L in owner.languages) + owner_languages += L.name + data["owner_languages"] = owner_languages + data["change_language"] = can_change(APPEARANCE_GENDER) + if(data["change_language"]) + var/list/languages = list() + for(var/language in valid_languages) + languages[++languages.len] = list("language" = language) + data["languages"] = languages + data["change_skin_tone"] = can_change_skin_tone() data["change_skin_color"] = can_change_skin_color() data["change_skin_preset"] = can_change_skin_preset() data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR) data["change_hair"] = can_change(APPEARANCE_HAIR) if(data["change_hair"]) - var/hair_styles[0] + var/list/hair_styles = list() for(var/hair_style in valid_hairstyles) hair_styles[++hair_styles.len] = list("hairstyle" = hair_style) data["hair_styles"] = hair_styles @@ -147,7 +164,7 @@ data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) if(data["change_facial_hair"]) - var/facial_hair_styles[0] + var/list/facial_hair_styles = list() for(var/facial_hair_style in valid_facial_hairstyles) facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style) data["facial_hair_styles"] = facial_hair_styles @@ -183,15 +200,18 @@ valid_facial_hairstyles.Cut() valid_facial_hairstyles.Cut() valid_accents.Cut() + valid_languages.Cut() generate_data() /datum/nano_module/appearance_changer/proc/generate_data() if(!owner) return - if(!valid_species.len) + if(!length(valid_species)) valid_species = owner.generate_valid_species(check_whitelist, whitelist, blacklist) - if(!valid_hairstyles.len || !valid_facial_hairstyles.len) + if(!length(valid_hairstyles) || !length(valid_facial_hairstyles)) valid_hairstyles = owner.generate_valid_hairstyles(check_gender = 0) valid_facial_hairstyles = owner.generate_valid_facial_hairstyles() - if(!valid_accents.len) + if(!length(valid_accents)) valid_accents = owner.generate_valid_accent() + if(!length(valid_languages)) + valid_languages = owner.generate_valid_languages() diff --git a/html/changelogs/mattatlas-worldenddominator.yml b/html/changelogs/mattatlas-worldenddominator.yml new file mode 100644 index 00000000000..290f38b769f --- /dev/null +++ b/html/changelogs/mattatlas-worldenddominator.yml @@ -0,0 +1,41 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a language selector to the appearance editor that you get when you spawn in as a mercenary or use a plastic surgery machine." diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl index 2f9eb3f78af..3d645edfbc2 100644 --- a/nano/templates/appearance_changer.tmpl +++ b/nano/templates/appearance_changer.tmpl @@ -36,6 +36,19 @@ {{/if}} +{{if data.change_language}} +