From 7fd8c2f5b7fccff37f480248f3c8596960fa48e5 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 05:17:24 +0100 Subject: [PATCH 01/10] initial commit --- code/_globalvars/lists/mobs.dm | 1 + .../~doppler_globalvars/lists/languages.dm | 51 ++++ .../languages/code/language menu/_language.dm | 30 ++- .../code/language menu/client_languages.dm | 2 +- .../languages/code/language_datums.dm | 234 ++++++++++++++++-- modular_doppler/languages/icons/language.dmi | Bin 5041 -> 5207 bytes .../crusoes_local/crusoes_local.dm | 18 ++ tgstation.dme | 2 + 8 files changed, 298 insertions(+), 40 deletions(-) create mode 100644 code/_globalvars/~doppler_globalvars/lists/languages.dm create mode 100644 modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 677b5f49d7d4d4..966f3b46b063ef 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -95,6 +95,7 @@ GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name()) continue lang_list[lang_type] = new lang_type() + randomize_crusoes_local(lang_list) // DOPPLER EDIT ADDITION - Randomize Crusoe's Locals' Pidgins return lang_list /proc/init_all_languages() diff --git a/code/_globalvars/~doppler_globalvars/lists/languages.dm b/code/_globalvars/~doppler_globalvars/lists/languages.dm new file mode 100644 index 00000000000000..640440a9120b44 --- /dev/null +++ b/code/_globalvars/~doppler_globalvars/lists/languages.dm @@ -0,0 +1,51 @@ + +/// List if all language typepaths learnable, i.e. those with keys, sorted by default_priority. +/// Used by the language menu to determine display priority. +GLOBAL_LIST_INIT(all_languages_by_priority, init_all_languages_by_priority()) + +/proc/init_all_languages_by_priority() + var/list/lang_list = list() + for(var/datum/language/lang_type as anything in typesof(/datum/language)) + if(!initial(lang_type.key)) + continue + lang_list += lang_type + sortTim(lang_list, cmp = GLOBAL_PROC_REF(cmp_language_priority_dsc)) + return lang_list + +/// Sorts languages based on their default_priority, in descending order. +/proc/cmp_language_priority_dsc(datum/language/lang_a, datum/language/lang_b) + return lang_b.default_priority - lang_a.default_priority + + +/// Randomizes Crusoe's Locals' Pidgins. +/// We can't run this when making the language, as other language prototypes haven't finished. +/// But our global var handling is before base TG's, so we can't override it easily either. +/// Thus, we non-modularly run this proc in base TG's language prototype init. +/proc/randomize_crusoes_local(list/language_prototypes) + var/datum/language/the_localspeak = language_prototypes[/datum/language/crusoeslocal] + the_localspeak.syllables = list() + var/total_mutual_understanding = counterlist_sum(the_localspeak.mutual_understanding) + log_admin("randomize_crusoes_local - [total_mutual_understanding]") + + for(var/datum/language/mutual_lang_type as anything in the_localspeak.mutual_understanding) + log_admin("[mutual_lang_type]") + var/list/syllables_to_steal = language_prototypes[mutual_lang_type].syllables.Copy() + var/percent_this_language = round((the_localspeak.mutual_understanding[mutual_lang_type] / total_mutual_understanding) * 100, 1) + var/amount_to_steal = min(percent_this_language, length(syllables_to_steal)) + log_admin("[mutual_lang_type]: [percent_this_language] - [amount_to_steal] - [the_localspeak.mutual_understanding[mutual_lang_type]] - [(the_localspeak.mutual_understanding[mutual_lang_type] / total_mutual_understanding)]") + for(var/i = 0, i < amount_to_steal, i++) + var/stolen_syllable = pick(syllables_to_steal) + log_admin("[mutual_lang_type]: [i] - [stolen_syllable] - [syllables_to_steal]") + the_localspeak.syllables.Add(stolen_syllable) + syllables_to_steal.Remove(stolen_syllable) + + var/datum/language/space_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) + the_localspeak.space_chance = language_prototypes[space_chance_lang_type].space_chance + + var/datum/language/sentence_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) + the_localspeak.sentence_chance = language_prototypes[sentence_chance_lang_type].sentence_chance + the_localspeak.between_word_sentence_chance = language_prototypes[sentence_chance_lang_type].between_word_sentence_chance + + var/datum/language/syllable_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) + the_localspeak.additional_syllable_low = language_prototypes[syllable_chance_lang_type].additional_syllable_low + the_localspeak.additional_syllable_high = language_prototypes[syllable_chance_lang_type].additional_syllable_high diff --git a/modular_doppler/languages/code/language menu/_language.dm b/modular_doppler/languages/code/language menu/_language.dm index a710403cff9af8..92bc1bac0f7dd1 100644 --- a/modular_doppler/languages/code/language menu/_language.dm +++ b/modular_doppler/languages/code/language menu/_language.dm @@ -33,16 +33,20 @@ /datum/language/nekomimetic secret = TRUE //...and so it vanished, a whisper in the darkness. -/datum/language/shadowtongue - name = "Shadowtongue" - desc = "TONGUE OF A REALITY PLANE OFFSET FIVE INCHES ABOVE YOURS; the language of Resonance and Magycks, spoken by sorcerers and reality-benders. The language their olden books are oft written in." - -/datum/language/moffic - desc = "Spoken colloquially by the Mothfolk of Va Lumla, the early iteration of Mothic emerged when Fueljacks relied on their receptors for simple, one-worded pheromones to communicate, and navigate the often fatal maintenance tunnels sprawled throughout the fleet. \ - The moths developed gesticulation through antennas and wings to convey deeper intent, with mandibles providing emotional context through clicks and trills. \ - After contact with the Celestial Accord, human speakers managed to achieve a similar effect from clicking their tongue to roof, and steer the tone with the width of their mouth while using their hands in place of antennas. \ - It is informally spoken, deploying many slangs and shorthands from Common. Has phonetic resemblance to Italian." - -/datum/language/uncommon - name = "Xerxian" - desc = "A modernization of the Arabic dialects found on Earth, loosely based on the original MSA (Modern Standardized Arabic). Simplified syntax and a reduced reliance on case-endings and diacritical marks make it easier to learn and read." +/datum/language/carptongue + secret = TRUE + +/datum/language/buzzwords + secret = TRUE + +/datum/language/monkey + secret = TRUE + +/datum/language/slime + secret = TRUE + +/datum/language/spinwarder + secret = TRUE + +/datum/language/terrum + secret = TRUE diff --git a/modular_doppler/languages/code/language menu/client_languages.dm b/modular_doppler/languages/code/language menu/client_languages.dm index a3accc59e999f6..e02730f8373b90 100644 --- a/modular_doppler/languages/code/language menu/client_languages.dm +++ b/modular_doppler/languages/code/language menu/client_languages.dm @@ -79,7 +79,7 @@ var/list/selected_languages = list() var/list/unselected_languages = list() - for (var/language_name in GLOB.all_languages) + for (var/language_name in GLOB.all_languages_by_priority) var/datum/language/language = GLOB.language_datum_instances[language_name] if(language.secret && !(language.type in species.language_prefs_whitelist)) // For ghostrole species who are able to speak a secret language, e.g. ashwalkers, display it. diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 022d67954ab7bf..9c5d34cefc1c60 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -9,10 +9,21 @@ langs += /datum/language/nambuni return langs -/// ACTUAL LANGUAGES BEGIN HERE +/** + * DOPPLER LANGUAGES + * default_priority here is also used to pick what order these appear in the ingame language menu. + * 100-90 - Common 4CA languages. + * 89-70 - Common other languages. + * 69-20 - Increasingly less common languages. + * 19-0 - Exceptionally uncommon languages. + */ + /datum/language/konjin name = "Konjin" - desc = "This language group formally regarded as Orbital Sino-Tibetan is a result of a genetic relationship between Chinese, Tibetan, Burmese, and other Human languages of similar characteristics that was first proposed in the early 19th century and is extremely popular even in the space age. Originating from Asia, this group of tongues is the second most spoken by Human and Human-derived populations since the birth of Sol Common - and was a primary contender to be the Sol Federation's official language. Many loanwords, idioms, and cultural relics of Japanese, Ryukyuan, Korean, and other societies have managed to persist within it, especially in the daily lives of speakers coming from Martian cities." + desc = "This language group formally regarded as Orbital Sino-Tibetan is a result of a genetic relationship between Chinese, Tibetan, \ + Burmese, and other Human languages of similar characteristics that was first proposed in the early 19th century and is extremely popular even in the space age. \ + Originating from Asia, this group of tongues is the second most spoken by Human and Human-derived populations since contact with the 4CA. \ + Many loanwords, idioms, and cultural relics of Japanese, Ryukyuan, Korean, and other societies have managed to persist within it, especially in the daily lives of speakers coming from Martian cities." key = "Y" flags = TONGUELESS_SPEECH space_chance = 70 @@ -29,13 +40,19 @@ ) icon_state = "hanzi" icon = 'modular_doppler/languages/icons/language.dmi' - default_priority = 94 default_name_syllable_min = 1 default_name_syllable_max = 2 + default_priority = 79 + mutual_understanding = list( + /datum/language/crusoeslocal = 10, + /datum/language/common = 10, + ) /datum/language/gutter name = "Plutonian" - desc = "Plutonian Franco-Castilian is a constructed Romance language that was developed early on in the Sol Federation's colonization history out of necessity for communication between its first Plutonian colonists. It heavily borrows from Spanish and French, with minor influence from other tongues the likes of Italian and Portuguese, despite coming off as elegant it carries a heavy amount of slang and idioms correlated to certain criminal groups. Today, it stands heavily engrained in the planet's culture - and almost every citizen will speak at least some of it on top of Sol." + desc = "Plutonian Franco-Castilian is a constructed Romance language that was developed early on in the Sol system's colonization history out of a desire for less externally readable communications by its first Plutonian colonists. \ + It heavily borrows from Spanish and French, with minor influence from other tongues the likes of Italian and Portuguese, despite coming off as elegant it carries a heavy amount of slang and idioms correlated to certain criminal groups. \ + Today, it stands heavily engrained in the planet's culture - and almost every citizen will speak at least some of it on top of Celestial." key = "G" flags = TONGUELESS_SPEECH syllables = list ( @@ -46,11 +63,12 @@ ) icon_state = "gutter" icon = 'modular_doppler/languages/icons/language.dmi' - default_priority = 40 + default_priority = 78 /datum/language/movespeak name = "Move-Speak" - desc = "A primarily nonverbal language comprised of body movements, gesticulation, and sign language, with only intermittent warbles & other vocalizations. It's almost completely incomprehensible without its somatic components." + desc = "A primarily nonverbal language comprised of body movements, gesticulation, and sign language, with only intermittent warbles & other vocalizations. \ + It's almost completely incomprehensible without its somatic components." key = "M" flags = TONGUELESS_SPEECH space_chance = 30 @@ -59,7 +77,7 @@ ) icon = 'modular_doppler/languages/icons/language.dmi' icon_state = "movespeak" - default_priority = 93 + default_priority = 68 default_name_syllable_min = 5 default_name_syllable_max = 10 @@ -76,25 +94,12 @@ return "The [pick(GLOB.ramatan_last)]" -/datum/language/common - name = "Sol Common" - desc = "And when contact was established, the Admiral waved at the screen and said, \"Mi parolas la lingvon de la Homines!\" - I speak the language of Mankind. A simplified mix of Esperanto and Modern Latin, and the only recognized official language of the Sol Federation. This peculiar constructed language became popular during SolFed's earliest days, and was almost entirely overtaken by other popular tongues - it became widespread through heavy-handed political maneuvering with the help of corporate bureaucrats and other undesirables. Nowadays, it's a near-universal tongue and a must-know for any sentient being that plans to leap forward into space." - space_chance = 60 - syllables = list( - "al", "an", "ar", "as", "at", "ed", "er", "ha", "he", "hi", "is", "le", "me", "on", "se", "ti", - "ve", "wa", "ameno", "are", "ent", "for", "had", "hat", "hin", "ch", "be", "abe", "die", "sch", "aus", - "ber", "che", "que", "ait", "men", "ave", "con", "com", "eta", "eur", "est", "ing", "ver", "was", - "hin", "deed", "sed", "ut", "unde", "omnis", "latire", "iste", "natus", "sit", "vol", "totam", "rem", "eaque", - "ipsa", "quae", "ab", "illo", "et", "quasi", "dicta", "dorime", "sunt", "enim", "ipsam", "aut", "odit", "qui", - "amet", "que", "eius", "modi", "inci","ad", "vel", "eum", "iure", "hic", "pa", "mit", "dis", "du", - "di", "tol", "mi", "solari", "ite", "domum" - ) - icon_state = "solcommon" - icon = 'modular_doppler/languages/icons/language.dmi' - /datum/language/nambuni name = "Nambūni" - desc = "Nambūni is the language spoken by most Nambūlites and by extension Deep Spacers. It has no known origin, though it superficially resembles some Austronesian and Khoisan languages in grammatical and phonetic structure despite predating human spaceflight. There are countless dialects, pidgins, and creoles spread throughout the thousands of micronations that compose the greater Nambūni Assembly, making the language a difficult one to master. As it is the official language of the Assembly, it is mandated that all prayer, diplomacy, and trade must be conducted in Nambūni, thus learning the language is one of the greatest hurdles outsider merchants face." + desc = "Nambūni is the language spoken by most Nambūlites and by extension Deep Spacers. \ + It has no known origin, though it superficially resembles some Austronesian and Khoisan languages in grammatical and phonetic structure despite predating human spaceflight. \ + There are countless dialects, pidgins, and creoles spread throughout the thousands of micronations that compose the greater Nambūni Assembly, making the language a difficult one to master. \ + As it is the official language of the Assembly, it is mandated that all prayer, diplomacy, and trade must be conducted in Nambūni, thus learning the language is one of the greatest hurdles outsider merchants face." key = "N" flags = TONGUELESS_SPEECH space_chance = 30 @@ -113,10 +118,187 @@ icon = 'modular_doppler/languages/icons/language.dmi' additional_syllable_low = 1 additional_syllable_high = 3 - default_priority = 67 default_name_syllable_min = 2 default_name_syllable_max = 3 + default_priority = 88 + mutual_understanding = list( // TODO: make this account for most cultural languages. + /datum/language/crusoeslocal = 10, + ) + +/datum/language/crusoeslocal + name = "Crusoe's Locals' Pidgins" + desc = "A collection of unstable pidgin languages originating at the forefront of the frontier, here in Crusoe's Rest. \ + Informal and simplified, it's what you'd hear yelled loudly between colonists in the New Gibraltar markets. \ + A language stone soup, slowly congealing." + secret = TRUE // Special language unavailable outside of its quirk. + + icon = 'modular_doppler/languages/icons/language.dmi' + icon_state = "new_gibby" + + key = "C" + flags = TONGUELESS_SPEECH + default_priority = 90 + + // We randomize these all based on mutual_understanding languages when initializing language prototypes + syllables = list( + "a", "b", "c", + ) + space_chance = 60 + sentence_chance = 0 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = 0 + additional_syllable_high = 0 + // Except for this one. + special_characters = list("'", "-") + + // We get to have a whole bunch of these due to being THE Crusoe's Rest contact language. + mutual_understanding = list( + /datum/language/sylvan = 80, + /datum/language/common = 60, + /datum/language/uncommon = 60, + /datum/language/draconic = 40, + /datum/language/konjin = 20, + /datum/language/moffic = 20, + /datum/language/nambuni = 10, + ) + + +/** + * LANGUAGE OVERRIDES + */ + +/datum/language/common + name = "Celestial" + desc = "Celestial, one of the common languages of habitual spacefarers and colonists alike under the 4CA as it stands today. \ + Originally constructed by the 3CA as a set of consistent protocols shared between species intended to aid in charting space, \ + the language as it is known today is a creole resulting from 3CA Celestial intertwining and forming pidgins with the various languages of contacted species." + space_chance = 60 + // Is mostly syllables from other languages. + syllables = list( + "ce", "le", "est", "ial", + // Borrowed from Helresa + "e", + "al", "el", "af", "ef", "as", "es", + "eol", "eul", + "be", "re", "ke", "ca", "la", "sa", + "het", "hel", "lak", "rek", "ret", "kes", + "drak", "drek", "dret", + "ath", "eth", "ekh", "skh", + "cala", "kesa", "resa", + // Borrowed from Hillosk + "fii", "sii", "rii", "rel", + "hil", "losk", + // Borrowed from Nomadic + "i", "vii", "vuo", "eil", "tun", "gå", "det", "att", "ok", + // Borrowed from Konjin + "qi", "lao", "gao", "cai", "zun", "xuan", "ai", "feng", + // Borrowed from Plutonian + "l'e", // You get One. The One. Use it well. + // Mixed syllables + "arf", "dråk", "xuån", "fek", "laosk", + ) + special_characters = list("-") + icon_state = "solcommon" + icon = 'modular_doppler/languages/icons/language.dmi' + // We get to have a whole bunch of these due to being a contact language. + mutual_understanding = list( + /datum/language/uncommon = 75, + /datum/language/crusoeslocal = 60, + /datum/language/sylvan = 30, + /datum/language/moffic = 20, + /datum/language/konjin = 10, + ) + +/datum/language/uncommon + name = "Helresa" + desc = "A language family commonly spoken in the 4CA core sectors. \ + Known as 'Helrekesa' at the time of the 2CA and having been used as the foundation for 3CA Celestial, \ + modern Helresa still has a coherent historical throughline despite its age and consequent cultural intermingling." + default_priority = 98 + syllables = list( + "e", + "al", "el", "af", "ef", "as", "es", + "eol", "eul", + "be", "re", "ke", "ca", "la", "sa", + "het", "hel", "lak", "rek", "ret", "kes", + "drak", "drek", "dret", + "ath", "eth", "ekh", "skh", + "cala", "kesa", "resa", + // These are borrowed from Hillosk + "fii", "sii", "rii", "tol", "tok", "dia", "eres", "aere", + "hil", "losk", + ) + special_characters = list("-") + mutual_understanding = list( + /datum/language/common = 75, + /datum/language/crusoeslocal = 60, + /datum/language/sylvan = 50, + ) + +/datum/language/sylvan + name = "Hillosk Toksii" + desc = "The language family also known as the 'Agricultural Commons', or 'Hillosk' for short, \ + its variations are most commonly spoken in agricultural-focused sectors of the 4CA. \ + Originating as a workers' pidgin on an early agricultural colony, it has since then solidified, \ + brought to use by their now-experts turning it to writing, then propagated between colonies by the movement thereof. \ + In the case of biology and ecology, most scientific names are written in an archaic form of this." + default_priority = 99 + syllables = list( + "fii", "sii", "rii", "rel", "maa", "ala", "san", "tol", "tok", "dia", "eres", + "fal", "tis", "bis", "qel", "aras", "losk", "rasa", "eob", "hil", "tanl", "aere", + "fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex", + "incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa", + "la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu", + // These are borrowed from Helreesa + "eul", "ekh", "skh", + "kesa", "resa", + ) + mutual_understanding = list( + /datum/language/crusoeslocal = 80, + /datum/language/uncommon = 50, + /datum/language/common = 30, + ) + +/datum/language/moffic + name = "Nomadic" + desc = "Spoken colloquially by the Veniri of Grand Nomad Fleet, the early iteration of Nomadic emerged when Fueljacks relied on their receptors for simple, \ + one-worded pheromones to communicate, and navigate the often fatal maintenance tunnels sprawled throughout the fleet. \ + The moths developed gesticulation through antennas and wings to convey deeper intent, with mandibles providing emotional context through clicks and trills. \ + After contact with the Fourth Celestial Alignment, non-lepidoteran speakers managed to achieve a similar effect from clicking their tongue to roof, \ + and steer the tone with the width of their mouth while using their limbs in place of antennas. \ + It is informally spoken, deploying many slangs and shorthands from Celestial. Has phonetic resemblance to Italian." + default_priority = 87 + mutual_understanding = list( + /datum/language/common = 20, + /datum/language/crusoeslocal = 20, + ) /datum/language/draconic name = "Khaishhs" - desc = "Often mispronounced as \"Heesh\" by offworlders and non-lizardfolk, The language can date its origins to Tiziran Pre-History where its abundant use of hisses, rattles, glottal sounds and other harsh consonants made it easily understood at greater distances and the extensive cave systems below the surface of Tizira. Though there are as many dialects as there are Clans, the more common \"Imperial Khaishhs\" was created by Clan Talunan as an effort to unite the people under their rule, and is what used in any and all official dealings with their government. The language itself has gained a bit of infamy in how uncomfortable it is to speak after any extended period for those whom do not use it on a daily basis, or whose biology is non-conducive to the vocals required to properly speak it. " + desc = "Often mispronounced as \"Heesh\" by offworlders and non-lizardfolk, The language can date its origins to Tiziran Pre-History where its abundant use of hisses, \ + rattles, glottal sounds and other harsh consonants made it easily understood at greater distances and the extensive cave systems below the surface of Tizira. \ + Though there are as many dialects as there are Clans, the more common \"Imperial Khaishhs\" was created by Clan Talunan as an effort to unite the people under their rule, \ + and is what used in any and all official dealings with their government. \ + The language itself has gained a bit of infamy in how uncomfortable it is to speak after any extended period for those whom do not use it on a daily basis, \ + or whose biology is non-conducive to the vocals required to properly speak it. " + default_priority = 89 + mutual_understanding = list( + /datum/language/crusoeslocal = 40, + ) + +/datum/language/voltaic + name = "Voltaic" + desc = "The 'staticky' manipulation of electrical discharge used for communication between Ethereals almost universally. \ + Too universal and natural to be named to them, the name 'Voltaic' was rather assigned by the NanoTrasen corporation post-contact." + default_priority = 69 + +/datum/language/machine + // Outside of synths/silicons who start with this selected, most people probably shouldn't. Low priority. + default_priority = 19 + +/datum/language/shadowtongue + name = "Shadowtongue" + desc = "TONGUE OF A REALITY PLANE OFFSET FIVE INCHES ABOVE YOURS; the language of Resonance and Magycks, spoken by sorcerers and reality-benders. The language their olden books are oft written in." + // You should probably not be speaking in this as your standard tongue. + default_priority = 1 diff --git a/modular_doppler/languages/icons/language.dmi b/modular_doppler/languages/icons/language.dmi index 0e3cfcbf2ac33ef09287915fdbccf20986bcea65..5f39bd3d41b0932754d7e1ee7608cc3ce0f13800 100644 GIT binary patch delta 5189 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 diff --git a/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm b/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm new file mode 100644 index 00000000000000..618af2fd2ab7b4 --- /dev/null +++ b/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm @@ -0,0 +1,18 @@ + +/datum/quirk/crusoes_local + name = "Crusoe's Local" + desc = "You've spent enough time living and interacting locally to have developed a sense for the local colonists' attempts to communicate irregardless of language barriers, \ + and consequentially know how to interpret the resulting pidgins." + icon = FA_ICON_ARROWS_DOWN_TO_PEOPLE + value = 0 + gain_text = span_notice("Some of the words of the people around you certainly aren't yours, but together you can make do.") + lose_text = span_notice("You seem to have forgotten the local pidgin language.") + medical_record_text = "Patient seems to have gotten accustomed to the local colonists' pidgins forming in Crusoe's Rest." + +/datum/quirk/crusoes_local/add(client/client_source) + quirk_holder.grant_language(/datum/language/crusoeslocal, source = LANGUAGE_MIND) + +/datum/quirk/crusoes_local/remove() + if(QDELING(quirk_holder)) + return + quirk_holder.remove_language(/datum/language/crusoeslocal, source = LANGUAGE_MIND) diff --git a/tgstation.dme b/tgstation.dme index ce384007a51406..762d6d0f28bfc1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -655,6 +655,7 @@ #include "code\_globalvars\~doppler_globalvars\regexes.dm" #include "code\_globalvars\~doppler_globalvars\religion.dm" #include "code\_globalvars\~doppler_globalvars\text.dm" +#include "code\_globalvars\~doppler_globalvars\lists\languages.dm" #include "code\_globalvars\~doppler_globalvars\lists\quirks.dm" #include "code\_globalvars\~doppler_globalvars\lists\signature_beacon.dm" #include "code\_globalvars\~doppler_globalvars\lists\synth_stomach.dm" @@ -7426,6 +7427,7 @@ #include "modular_doppler\modular_quirks\breather\nitrogen_breather\nitrogen_tanks.dm" #include "modular_doppler\modular_quirks\breather\water_breather\water_breather.dm" #include "modular_doppler\modular_quirks\convict\convict_quirk.dm" +#include "modular_doppler\modular_quirks\crusoes_local\crusoes_local.dm" #include "modular_doppler\modular_quirks\cybernetic_limb_mounts\cybernetic_limb_mounts.dm" #include "modular_doppler\modular_quirks\entombed\code\entombed.dm" #include "modular_doppler\modular_quirks\entombed\code\entombed_alt_actions.dm" From 8bb818687d1cecce85645d4ebe8885d738167e09 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 05:37:44 +0100 Subject: [PATCH 02/10] allows language to be spoken --- modular_doppler/languages/code/language_datums.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 9c5d34cefc1c60..22f9ee0482cd91 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -1,5 +1,6 @@ /obj/item/organ/tongue/get_possible_languages() var/list/langs = ..() + langs += /datum/language/crusoeslocal langs += /datum/language/konjin langs += /datum/language/gutter langs += /datum/language/movespeak From 1fe34c0b52751ba695ff92410c8467bf3db86491 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 05:38:58 +0100 Subject: [PATCH 03/10] remove tongueless speech --- modular_doppler/languages/code/language_datums.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 22f9ee0482cd91..74067d73728dca 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -137,7 +137,6 @@ icon_state = "new_gibby" key = "C" - flags = TONGUELESS_SPEECH default_priority = 90 // We randomize these all based on mutual_understanding languages when initializing language prototypes From 36388273a6f1cb4e7cc9bf6c205d7f51437b37fd Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 05:50:47 +0100 Subject: [PATCH 04/10] whimsy removal --- .../code/language menu/language_holder.dm | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/modular_doppler/languages/code/language menu/language_holder.dm b/modular_doppler/languages/code/language menu/language_holder.dm index 27629b53cf5b20..8a9d9962e3716c 100644 --- a/modular_doppler/languages/code/language menu/language_holder.dm +++ b/modular_doppler/languages/code/language menu/language_holder.dm @@ -115,3 +115,30 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/nambuni = list(LANGUAGE_ATOM), ) + +// SPECIES OVERRIDES + +/datum/language_holder/golem + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) + +// Sorry, whimsical inexplicable skeleton language. +/datum/language_holder/skeleton + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) + +/datum/language_holder/jelly + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + ) From 4649fe851bcb55649f79420d44c2a2822551bf90 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 06:23:43 +0100 Subject: [PATCH 05/10] cha cha, real smooth --- code/_globalvars/~doppler_globalvars/lists/languages.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/_globalvars/~doppler_globalvars/lists/languages.dm b/code/_globalvars/~doppler_globalvars/lists/languages.dm index 640440a9120b44..db87f2bcabaab8 100644 --- a/code/_globalvars/~doppler_globalvars/lists/languages.dm +++ b/code/_globalvars/~doppler_globalvars/lists/languages.dm @@ -25,17 +25,13 @@ GLOBAL_LIST_INIT(all_languages_by_priority, init_all_languages_by_priority()) var/datum/language/the_localspeak = language_prototypes[/datum/language/crusoeslocal] the_localspeak.syllables = list() var/total_mutual_understanding = counterlist_sum(the_localspeak.mutual_understanding) - log_admin("randomize_crusoes_local - [total_mutual_understanding]") for(var/datum/language/mutual_lang_type as anything in the_localspeak.mutual_understanding) - log_admin("[mutual_lang_type]") var/list/syllables_to_steal = language_prototypes[mutual_lang_type].syllables.Copy() var/percent_this_language = round((the_localspeak.mutual_understanding[mutual_lang_type] / total_mutual_understanding) * 100, 1) var/amount_to_steal = min(percent_this_language, length(syllables_to_steal)) - log_admin("[mutual_lang_type]: [percent_this_language] - [amount_to_steal] - [the_localspeak.mutual_understanding[mutual_lang_type]] - [(the_localspeak.mutual_understanding[mutual_lang_type] / total_mutual_understanding)]") for(var/i = 0, i < amount_to_steal, i++) var/stolen_syllable = pick(syllables_to_steal) - log_admin("[mutual_lang_type]: [i] - [stolen_syllable] - [syllables_to_steal]") the_localspeak.syllables.Add(stolen_syllable) syllables_to_steal.Remove(stolen_syllable) From f857f1e5bfe1100505b851582d2bbe885ad44f58 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 06:25:28 +0100 Subject: [PATCH 06/10] quirked up local boy --- modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm b/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm index 618af2fd2ab7b4..f269cd6c1271f3 100644 --- a/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm +++ b/modular_doppler/modular_quirks/crusoes_local/crusoes_local.dm @@ -10,9 +10,9 @@ medical_record_text = "Patient seems to have gotten accustomed to the local colonists' pidgins forming in Crusoe's Rest." /datum/quirk/crusoes_local/add(client/client_source) - quirk_holder.grant_language(/datum/language/crusoeslocal, source = LANGUAGE_MIND) + quirk_holder.grant_language(/datum/language/crusoeslocal, source = LANGUAGE_QUIRK) /datum/quirk/crusoes_local/remove() if(QDELING(quirk_holder)) return - quirk_holder.remove_language(/datum/language/crusoeslocal, source = LANGUAGE_MIND) + quirk_holder.remove_language(/datum/language/crusoeslocal, source = LANGUAGE_QUIRK) From 4b6c6130d71df6310f70ad72d7e361afdf781aad Mon Sep 17 00:00:00 2001 From: _0Steven Date: Fri, 13 Feb 2026 16:58:15 +0100 Subject: [PATCH 07/10] attempts to fix linters --- .../~doppler_globalvars/lists/languages.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/_globalvars/~doppler_globalvars/lists/languages.dm b/code/_globalvars/~doppler_globalvars/lists/languages.dm index db87f2bcabaab8..c65f46e602c920 100644 --- a/code/_globalvars/~doppler_globalvars/lists/languages.dm +++ b/code/_globalvars/~doppler_globalvars/lists/languages.dm @@ -27,7 +27,8 @@ GLOBAL_LIST_INIT(all_languages_by_priority, init_all_languages_by_priority()) var/total_mutual_understanding = counterlist_sum(the_localspeak.mutual_understanding) for(var/datum/language/mutual_lang_type as anything in the_localspeak.mutual_understanding) - var/list/syllables_to_steal = language_prototypes[mutual_lang_type].syllables.Copy() + var/datum/language/mutual_lang = language_prototypes[mutual_lang_type] + var/list/syllables_to_steal = mutual_lang.syllables.Copy() var/percent_this_language = round((the_localspeak.mutual_understanding[mutual_lang_type] / total_mutual_understanding) * 100, 1) var/amount_to_steal = min(percent_this_language, length(syllables_to_steal)) for(var/i = 0, i < amount_to_steal, i++) @@ -35,13 +36,13 @@ GLOBAL_LIST_INIT(all_languages_by_priority, init_all_languages_by_priority()) the_localspeak.syllables.Add(stolen_syllable) syllables_to_steal.Remove(stolen_syllable) - var/datum/language/space_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) - the_localspeak.space_chance = language_prototypes[space_chance_lang_type].space_chance + var/datum/language/space_chance_lang = language_prototypes[pick_weight(the_localspeak.mutual_understanding)] + the_localspeak.space_chance = space_chance_lang.space_chance - var/datum/language/sentence_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) - the_localspeak.sentence_chance = language_prototypes[sentence_chance_lang_type].sentence_chance - the_localspeak.between_word_sentence_chance = language_prototypes[sentence_chance_lang_type].between_word_sentence_chance + var/datum/language/sentence_chance_lang = language_prototypes[pick_weight(the_localspeak.mutual_understanding)] + the_localspeak.sentence_chance = sentence_chance_lang.sentence_chance + the_localspeak.between_word_sentence_chance = sentence_chance_lang.between_word_sentence_chance - var/datum/language/syllable_chance_lang_type = pick_weight(the_localspeak.mutual_understanding) - the_localspeak.additional_syllable_low = language_prototypes[syllable_chance_lang_type].additional_syllable_low - the_localspeak.additional_syllable_high = language_prototypes[syllable_chance_lang_type].additional_syllable_high + var/datum/language/syllable_chance_lang = language_prototypes[pick_weight(the_localspeak.mutual_understanding)] + the_localspeak.additional_syllable_low = syllable_chance_lang.additional_syllable_low + the_localspeak.additional_syllable_high = syllable_chance_lang.additional_syllable_high From f392515d4f211a69025de085cfef5a4668723908 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Sun, 15 Feb 2026 18:29:40 +0100 Subject: [PATCH 08/10] more herekesha syllables --- .../languages/code/language_datums.dm | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 74067d73728dca..76dcb5ab0ad002 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -186,6 +186,8 @@ "drak", "drek", "dret", "ath", "eth", "ekh", "skh", "cala", "kesa", "resa", + // And Helrekesha + "beskh", "shekk", "sha", // Borrowed from Hillosk "fii", "sii", "rii", "rel", "hil", "losk", @@ -213,10 +215,11 @@ /datum/language/uncommon name = "Helresa" desc = "A language family commonly spoken in the 4CA core sectors. \ - Known as 'Helrekesa' at the time of the 2CA and having been used as the foundation for 3CA Celestial, \ + Known as 'Helrekesha' at the time of the 2CA and having been used as the foundation for 3CA Celestial, \ modern Helresa still has a coherent historical throughline despite its age and consequent cultural intermingling." default_priority = 98 syllables = list( + // Modern Helresa "e", "al", "el", "af", "ef", "as", "es", "eol", "eul", @@ -225,6 +228,21 @@ "drak", "drek", "dret", "ath", "eth", "ekh", "skh", "cala", "kesa", "resa", + // Archaic Helrekesha still present + "ri", "ha", "ho", "do", + "rie", + "bhe", "dha", "dhe", "cso", + "jha", "jaho", "jhe", "kha", "khe", + "sha", "she", "feh", "fre", + "mazz", "mezz", "mohk", "nett", "nott", "kott", + "takh", "tash", "tesh", "tekh", "vesh", "vekh", + "hesh", "zekh", "rakh", + "beskh", "shekk", + "khet", "ghes", "ghos", + "ar", + "aur", "arh", + "osh", "okh", "esh", + "iash", "iakh", "iokh", "lahk", "lekh", // These are borrowed from Hillosk "fii", "sii", "rii", "tol", "tok", "dia", "eres", "aere", "hil", "losk", @@ -250,7 +268,7 @@ "fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex", "incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa", "la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu", - // These are borrowed from Helreesa + // These are borrowed from Helresa "eul", "ekh", "skh", "kesa", "resa", ) From 5925b1f11db4f5bbae9c5532449976fd9c717f82 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Sun, 15 Feb 2026 20:25:29 +0100 Subject: [PATCH 09/10] shadowtongue nitpick --- modular_doppler/languages/code/language_datums.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 76dcb5ab0ad002..81701cdc93853d 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -317,6 +317,7 @@ /datum/language/shadowtongue name = "Shadowtongue" - desc = "TONGUE OF A REALITY PLANE OFFSET FIVE INCHES ABOVE YOURS; the language of Resonance and Magycks, spoken by sorcerers and reality-benders. The language their olden books are oft written in." + desc = "TONGUE OF A REALITY PLANE OFFSET FIVE INCHES ABOVE YOURS; the language of Resonance and Magycks, spoken by sorcerers and reality-benders. \ + The language their olden books are oft written in." // You should probably not be speaking in this as your standard tongue. default_priority = 1 From 59105c3ced38b0699f78d6fef92be80840083324 Mon Sep 17 00:00:00 2001 From: _0Steven Date: Sun, 15 Feb 2026 20:25:53 +0100 Subject: [PATCH 10/10] carptongue addendum --- .../machinery/dna_infuser/organ_sets/fish_organs.dm | 4 ++-- modular_doppler/carp_infusion/code/carp_organs.dm | 11 +++++++++++ .../languages/code/language menu/_language.dm | 3 --- modular_doppler/languages/code/language_datums.dm | 7 +++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm index 59406a2e877076..af0ff7c96bb499 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm @@ -53,7 +53,7 @@ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) add_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, SKILL_EXP_JOURNEYMAN, silent = TRUE) - owner.grant_language(/datum/language/carptongue, ALL, type) + // owner.grant_language(/datum/language/carptongue, ALL, type) // DOPPLER EDIT REMOVAL - carptongue rework, non-carp don't speak it inherently /datum/status_effect/organ_set_bonus/fish/disable_bonus(obj/item/organ/removed_organ) . = ..() @@ -78,7 +78,7 @@ if(HAS_TRAIT(owner, TRAIT_IS_WET) && istype(owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL), /obj/item/organ/tail/fish)) remove_speed_buff() owner.mind?.adjust_experience(/datum/skill/fishing, -SKILL_EXP_JOURNEYMAN, silent = TRUE) - owner.remove_language(/datum/language/carptongue, ALL, type) + // owner.remove_language(/datum/language/carptongue, ALL, type) // DOPPLER EDIT REMOVAL - carptongue rework, non-carp don't speak it inherently /datum/status_effect/organ_set_bonus/fish/set_organs(new_value, obj/item/organ/organ) . = ..() diff --git a/modular_doppler/carp_infusion/code/carp_organs.dm b/modular_doppler/carp_infusion/code/carp_organs.dm index c842843707c8cd..9a9e46bd449270 100644 --- a/modular_doppler/carp_infusion/code/carp_organs.dm +++ b/modular_doppler/carp_infusion/code/carp_organs.dm @@ -12,6 +12,17 @@ /obj/item/organ/brain/carp cooldown_time = 60 MINUTES // to allow for scenes w/o moodlet grief +/obj/item/organ/brain/carp/on_mob_insert(mob/living/carbon/receiver) + . = ..() + receiver.grant_language(/datum/language/carptongue, ALL, source = type) + to_chat(receiver, span_boldnotice("You gain a new understanding of [/datum/language/carptongue::name].")) + +/obj/item/organ/brain/carp/on_mob_remove(mob/living/carbon/owner) + . = ..() + if(QDELING(owner)) + return + owner.remove_language(/datum/language/carptongue, ALL, source = type) + // only try to bite people if we're not wearing a mask /obj/item/organ/brain/carp/get_attacking_limb(mob/living/carbon/human/target) . = ..() diff --git a/modular_doppler/languages/code/language menu/_language.dm b/modular_doppler/languages/code/language menu/_language.dm index 92bc1bac0f7dd1..407a23b8874491 100644 --- a/modular_doppler/languages/code/language menu/_language.dm +++ b/modular_doppler/languages/code/language menu/_language.dm @@ -33,9 +33,6 @@ /datum/language/nekomimetic secret = TRUE //...and so it vanished, a whisper in the darkness. -/datum/language/carptongue - secret = TRUE - /datum/language/buzzwords secret = TRUE diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 81701cdc93853d..9426ca96e4d3f9 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -315,6 +315,13 @@ // Outside of synths/silicons who start with this selected, most people probably shouldn't. Low priority. default_priority = 19 +/datum/language/carptongue + name = "Carptongue" + desc = "Not quite a full language, this is the various fishy vocalizations and gestures that space carp, sharks, and dragons use intuitively to communicate basic concepts. \ + Words for more complex concepts form with the presence of a dragon anchoring them, and subsequently wane with the weaker long-term memory of dragonless carp." + // Niche tongue that probably shouldn't be spoken outside of carp genemodders. + default_priority = 18 + /datum/language/shadowtongue name = "Shadowtongue" desc = "TONGUE OF A REALITY PLANE OFFSET FIVE INCHES ABOVE YOURS; the language of Resonance and Magycks, spoken by sorcerers and reality-benders. \