mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-30 03:22:41 +00:00
## About The Pull Request This PR does the following: - Defines a new proc in __HELPERS/_lists.dm called `pick_weight_recursive()`. This is the code from `/obj/effect/spawner/random/` that allows for nested weighted lists, moved to its own proc. - Replaces explicit code in spawners/random.dm with calls to `pick_weight_recursive()` where appropriate - Deletes the redundant (and barely used) proc `/obj/item/loot_table_maker/proc/pick_loot`, as this was equivalent to `pick_weight_recursive()` - Moves the global proc `fill_with_ones()` from spawners/random.dm to __HELPERS/_lists.dm - Replaces `pick()` in language syllable selection with `pick_weight_recursive()`, allowing languages to define syllable weights or use nested lists of syllables. - Reformats Galactic Common to use nested lists of syllables, allowing English and Chinese syllables to occur at equal frequency despite having different numbers of each. ## Why It's Good For The Game Allowing languages to define syllable weights and nested groups of syllables is a relatively small change that greatly expands what you can do with them. In addition to making Galactic Common look nicer in code, this change also allows for the easy creation of languages with highly uneven syllable distributions (including ultra-rare secret syllables, perhaps) or the quick creation of pidgin languages that combine multiple syllable sets. Using a new proc simplifies spawner code by reducing repetition. Making it global allows for other code to easily implement the same flexible and elegant system of nested lists that spawners already use. ## Changelog 🆑 refactor: defines a new global proc, pick_weight_recursive() code: languages can weight syllables, and galactic common's definition is easier to look at /🆑 Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
108 lines
3.6 KiB
Plaintext
108 lines
3.6 KiB
Plaintext
#define SCRAMBLE_CACHE_LEN 50 //maximum of 50 specific scrambled lines per language
|
|
|
|
/*
|
|
Datum based languages. Easily editable and modular.
|
|
*/
|
|
|
|
/datum/language
|
|
var/name = "an unknown language" // Fluff name of language if any.
|
|
var/desc = "A language." // Short description for 'Check Languages'.
|
|
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/sentence_chance = 5 // Likelihood of making a new sentence after each syllable.
|
|
var/space_chance = 55 // Likelihood of getting a space in the random scramble string
|
|
var/list/spans = list()
|
|
var/list/scramble_cache = list()
|
|
var/default_priority = 0 // the language that an atom knows with the highest "default_priority" is selected by default.
|
|
|
|
// if you are seeing someone speak popcorn language, then something is wrong.
|
|
var/icon = 'icons/misc/language.dmi'
|
|
var/icon_state = "popcorn"
|
|
|
|
/datum/language/proc/display_icon(atom/movable/hearer)
|
|
var/understands = hearer.has_language(src.type)
|
|
if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands)
|
|
return FALSE
|
|
if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands)
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/language/proc/get_icon()
|
|
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
|
|
return sheet.icon_tag("language-[icon_state]")
|
|
|
|
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
|
|
if(!syllables || !syllables.len)
|
|
if(gender==FEMALE)
|
|
return capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
|
|
else
|
|
return capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
|
|
|
|
var/full_name = ""
|
|
var/new_name = ""
|
|
|
|
for(var/i in 0 to name_count)
|
|
new_name = ""
|
|
var/Y = rand(FLOOR(syllable_count/syllable_divisor, 1), syllable_count)
|
|
for(var/x in Y to 0)
|
|
new_name += pick_weight_recursive(syllables)
|
|
full_name += " [capitalize(lowertext(new_name))]"
|
|
|
|
return "[trim(full_name)]"
|
|
|
|
/datum/language/proc/check_cache(input)
|
|
var/lookup = scramble_cache[input]
|
|
if(lookup)
|
|
scramble_cache -= input
|
|
scramble_cache[input] = lookup
|
|
. = lookup
|
|
|
|
/datum/language/proc/add_to_cache(input, scrambled_text)
|
|
// Add it to cache, cutting old entries if the list is too long
|
|
scramble_cache[input] = scrambled_text
|
|
if(scramble_cache.len > SCRAMBLE_CACHE_LEN)
|
|
scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1)
|
|
|
|
/datum/language/proc/scramble(input)
|
|
|
|
if(!syllables || !syllables.len)
|
|
return stars(input)
|
|
|
|
// If the input is cached already, move it to the end of the cache and return it
|
|
var/lookup = check_cache(input)
|
|
if(lookup)
|
|
return lookup
|
|
|
|
var/input_size = length_char(input)
|
|
var/scrambled_text = ""
|
|
var/capitalize = TRUE
|
|
|
|
while(length_char(scrambled_text) < input_size)
|
|
var/next = pick_weight_recursive(syllables)
|
|
if(capitalize)
|
|
next = capitalize(next)
|
|
capitalize = FALSE
|
|
scrambled_text += next
|
|
var/chance = rand(100)
|
|
if(chance <= sentence_chance)
|
|
scrambled_text += ". "
|
|
capitalize = TRUE
|
|
else if(chance > sentence_chance && chance <= space_chance)
|
|
scrambled_text += " "
|
|
|
|
scrambled_text = trim(scrambled_text)
|
|
var/ending = copytext_char(scrambled_text, -1)
|
|
if(ending == ".")
|
|
scrambled_text = copytext_char(scrambled_text, 1, -2)
|
|
var/input_ending = copytext_char(input, -1)
|
|
if(input_ending in list("!","?","."))
|
|
scrambled_text += input_ending
|
|
|
|
add_to_cache(input, scrambled_text)
|
|
|
|
return scrambled_text
|
|
|
|
#undef SCRAMBLE_CACHE_LEN
|