Files
runecap 441ef5805d Splits Pilot: SpaCecRaft intO three levelS and Adds Piloting Education BacKgrounds (#22673)
These were some of the first given feedback for skills, so I may as well
implement it.

Piloting is now split into three levels like other skills which note
what pilot class of vessel you may comfortably pilot.
(Familiar) **Shuttle Pilot** is for all landables: Spark, Canary,
Intrepid, the Quark, and the like are all equal under it.
(Trained) **Class II Pilot** covers most ships, which are "overmap-only"
and unable to land or dock.
(Professional) **Class IV Pilot** covers only the Horizon normally, but
design-wise extends to whatever is the main player ship, or for anything
massive

**Antags get Professional Pilot, so they can always do ship hijack
gimmicks without worry.**

As a convenience to make Bridge personnel stand out, Professional/Class
IV Pilots can deduce their current overmap coordinate from examining
space on help intent for 3s. There's no way to directly link to the
overmap, so on the backend, this ability briefly references an existing
ship console.

### Design

Class II and IV are pre-existing terms in-lore, used on the Interstellar
Travel page to refer to civilian size classes.
With how important each level of piloting is, they cost _+4 points_ each
instead of going 2 -> 4 -> 8. This lets there exist the occasional pilot
character from any background, but it's _always_ an investment and
piloting the Horizon stays hard without training.
As Familiar currently costs 6 points, this is effectively a 2-point buff
for most cases as you'll rarely have to pilot non-shuttles.
(**EDIT**: Piloting levels are now 4 -> 8 -> 10 so there's a bit of
flexibility to have an extra skill for Professional Pilots from
Expeditionary Trade)

#### The _**real meat**_ of this PR...
is that you can now attempt to pilot vessels a level higher than you
with penalties, so there's now a failure spectrum should you manage to
access an adjacent-class ship rather than always being hard-locked. The
penalties affect acceleration, slowing, turning, and rolling. They're
most extreme for Shuttle and Class IV to represent how clueless an
unlicensed pilot would be and how complex the Horizon realistically is
to operate.

With smart usage of autopilot, you can actually find a way to travel
normal-ish. I think this is a fun interaction to have for underskilled
characters, and makes autopilot actually have a use as it otherwise
kills you. Maybe Bridge personnel can give lessons to Class II pilots
with it.

### Piloting Education Backgrounds

Coming are THREE piloting education backgrounds: Flight Academy, Fleet
Training, and Expeditionary Trade.

#### ALL GET _Familiar Electrical Engineering,_ _Familiar Atmospheric_

(EDIT: Flight Academy is now the only background that gets Familiar
Mechanical Engineering, this makes them stand out as being notably
handy/utility-ready for emergencies, but other backgrounds can still
easily match them with points.
Fleet Training has Tenacity down to Trained for character variety,
though tenacity is very slight buffs and hard to notice.
Expeditionary Trade now uses Familiar Firearms over Familiar Armed
Combat as it's more immediately important.)

Electrical Engineering now lets you use a power cell on an unpowered
ship console to give it emergency battery life based on the charge. This
helps with cases of being stranded from an APC broken by a meteor, a
high-capacity cell can give 10m or more based on Electrical level. I may
expand this bypass mechanic to all consoles in the future.
Atmospherics skill has no implementation currently, but dealing with
breaches or cycling on shuttles is too important.

Flight Academy - BC, XO, Captain
*Professional Piloting, Trained Leadership, Familiar Mechanical
Engineering*
> "You are at least 25 years of age, with the best navigation training
the Spur can offer, vessel handiness in a pinch, and the know-how for
reining in or assuring passengers for the voyage."

Flight Academy has Leadership honestly just because I didn't want Fleet
Training to look too good, and because I think they can rock the "this
is your pilot speaking" in a cool way. Bridge personnel are usually the
ones that have to wraggle people on away sites, especially during
events.
Mechanical Engineering allows them to make machine frames of ship
consoles in emergencies.


Fleet Training - BC, XO, Captain 
*Professional Piloting, Trained Firearms, Trained Tenacity*
> "You are at least 25 years of age, with the most extensive navigation
training possible and military discipline to back it up. You're a steady
shot in emergencies and, damn it-- You. Go. Down. With. The. Ship."

This was made because a player informed me many BC and XOs choose
military backgrounds, and the +4 points design would prevent that. Fleet
Training isn't the same as Military Training, but having all of Piloting
gives you 6 points free to match MT if wanted. The high Tenacity is
primarily for surviving in ship combat, where you'll probably
bleed/suffocate to death.

Expeditionary Trade - Miners, Xenology roles, OM, RD
*Familiar Piloting, Familiar Firearms, Familiar Medicine*
> "You've developed trade skills for a career of expeditions. You are at
home in a shuttle piloting to and from for an average day's work. You
can even hit a shot or tend to wounds when things eventually get
unsafe."

This is for Miner and Xenoarch primarily. An expedition is just any
journey with an objective, all roles revolving around piloting shuttles
to an objective needs to be able to hold their own if they ever find
carp or have an accident, especially since they'll likely be alone.

#### MISC stuff

corrected shaper gear comments I left wrong

Hotwiring piloting consoles now checks for Familiar in Electrical
Engineering. Its visible emote also now looks identical to attempting an
emergency bypass at first glance, so you can sneakily attempt one with
an unpowered console.

The Doctor of Psychology education background now gives Trained in
Leadership. This was intended to be uncommented, but the person forgot
to do it.

Research Directors now need to have Familiar/Shuttle Pilot. According to
the Guide to Piloting wikipage, they're supposed to be able to fly the
Intrepid and Quark for expeditions, and likely mirroring how the OM can
fly the Spark, but an RD can spawn completely incapable of piloting
currently.

---------

Signed-off-by: runecap <43975590+runecap@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-07-08 17:13:18 +00:00

451 lines
23 KiB
Plaintext

/datum/language/diona
name = LANGUAGE_ROOTSONG
desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes."
speech_verb = list("creaks and rustles")
ask_verb = list("creaks")
exclaim_verb = list("rustles")
sing_verb = list("croaks")
colour = "soghun"
key = "q"
flags = RESTRICTED|TCOMSSIM
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona/get_random_name()
var/new_name = "[pick(list("To Sleep Beneath","Changing of", "Soaring Above", "Wind Over","Embrace of","Dreams of","Witnessing", "Lost in", "To Walk Beneath","Approaching the", "Distant Memories of", "Forgotten Glimpse of", "Roots of", "Tendrils of", "Leaves Rustling in", "Last Hope of", "Speaking to"))]"
new_name += " [pick(list("the Void","the Stillness of Death", "the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain", "a Distant Galaxy", "a Starless Night", "the Fruits of Dreams", "the Rising Dawn", "the Song of Life", "a Lonely Shadow", "Forlorn Hope", "a Bleak Wasteland"))]"
while(findtextEx(new_name,"the the",1,null))
new_name = replacetext(new_name, "the the", "the")
while(findtextEx(new_name,"the a",1,null))
new_name = replacetext(new_name, "the a", "a")
return new_name
// Unathi languages
/datum/language/unathi
name = LANGUAGE_UNATHI
short = "UNA"
desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
speech_verb = list("hisses")
ask_verb = list("hisses")
exclaim_verb = list("roars")
sing_verb = list("hisses")
colour = "soghun"
written_style = "sintaunathi"
key = "o"
flags = WHITELISTED|TCOMSSIM
allow_accents = TRUE
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"
)
partial_understanding = list(LANGUAGE_AZAZIBA = 25)
/datum/language/unathi_azaziba
name = LANGUAGE_AZAZIBA
short = "AZA"
desc = "A language of Moghes consisting of a combination of spoken word and gesticulation. While waning since Moghes entered the galactic stage, it enjoys popular use by Unathi that never fell to the Hegemony's cultural dominance."
speech_verb = list("hisses")
ask_verb = list("hisses")
exclaim_verb = list("roars")
signlang_verb = list("signs", "gestures aggressively")
sing_verb = list("hisses")
colour = "soghun_alt"
written_style = "sintaazaziba"
key = "p"
flags = WHITELISTED | NONVERBAL
syllables = list("azs","zis","zau","azua","skiu","zuakz","izo","aei","ki","kut","zo")
partial_understanding = list(LANGUAGE_UNATHI = 50)
allow_accents = TRUE
// tajaran languages
/datum/language/tajaran
name = LANGUAGE_SIIK_MAAS
short = "MAAS"
desc = "The traditionally employed tongue of Adhomai, comprised of expressive yowls and chirps. Native to the Tajara."
speech_verb = list("mrowls")
ask_verb = list("mrowls")
exclaim_verb = list("yowls")
sing_verb = list("mrowls")
colour = "tajaran"
written_style = "siikmaas"
key = "j"
flags = WHITELISTED|TCOMSSIM
syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr",
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r",
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
partial_understanding = list(LANGUAGE_YA_SSA = 25, LANGUAGE_DELVAHII = 50)
allow_accents = TRUE
/datum/language/tajaran/get_random_name(var/gender)
var/new_name
if(gender==FEMALE)
new_name += pick(list("Aisha","Amani","Agashka","Agramakova","Bakhteiarova","Bratomila","Dekhova","Derzhka","Farah","Faizah","Hanifa","Ikram","Jenna","Khadija","Kandaza","Karyme","Kismet","Malika","Mumtaz","Nashwa","Nafisha","Shahar","Sabah","Takiyah","Wafiqah","Wasime","Yesenia","Zahra","Zohra","Rajjurl","Marryam","Dhrarmela","Rrhuyala","Irryavga","Ahvulyar","Purryalna","Yasmin"))
else if(gender==MALE)
new_name += pick(list("Abdal","Akhtar","Akim","Alik","Arif","Azzam","Anton","Alzrun","Bahir","Barakh","Bohdan","Coman","Dekel","Dima","Fa'iq","Faidah","Fredek","Fakhr","Hasam","Hashim","Ioakim","Kadir","Kareef","Khrazmrrug","Khazarir","Rrhazumar","Mrrhazugal","Harrmalik","Mata'ke","Njadrasanukii","Tajrhalrr","Rhagrrhuzau","Vahzirthaamro","Lev","Misha","Mahir","Nasser","Nasir","Oleg","Qadir","Sharif","Stepka","Tamir","Yasir","Zahid"))
new_name += " "
new_name += pick(list("Alfarsi","Alekseev","Al-Barik","Al-Hamdan","Al-Mansur","Al-Kandari","Al-Shahrani","Antonov","Bogdanov","El-Hasem","El-Amin","Rrhakaslav","Mrrazhughran","Jrruzhani","Rrhamrare","Mrakiizar","Hirron","Prruzhulkanich","El-Tusi","Nejem","Hanar","Karimi","Markov","Saif","Yakub","Zaman","Zaydan","Zidan","Zahawi"))
return new_name
/datum/language/tajaran_sign
name = LANGUAGE_SIGN_TAJARA
desc = "A sign language developed by Adhomian hunters."
speech_verb = list("signs")
signlang_verb = list("moves their tail", "flicks their ears", "swivels their ears", "flicks their tail", "shifts their ears and tail")
sign_adv_length = list("", " briefly", " a few times", " several times in quick succession", " for a while")
sing_verb = null
colour = "i"
key = "i"
flags = NO_STUTTER | SIGNLANG | WHITELISTED
/datum/language/siik_tajr
name = LANGUAGE_SIIK_TAJR
desc = "A language native to the Tajara, it employs both verbal and non-verbal elements."
speech_verb = list("mrowls")
ask_verb = list("mrowls")
exclaim_verb = list("yowls")
signlang_verb = list("moves their tail", "flicks their ears", "swivels their ears", "flicks their tail", "shifts their ears and tail")
sign_adv_length = list("", " briefly", " a few times", " several times in quick succession", " for a while")
sing_verb = list("mrowls")
colour = "tajaran_signlang"
key = "w"
flags = WHITELISTED | NONVERBAL
syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr",
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r",
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
partial_understanding = list(LANGUAGE_SIIK_MAAS = 50, LANGUAGE_SIGN_TAJARA = 25)
/datum/language/yassa
name = LANGUAGE_YA_SSA
short = "YAS"
desc = "The traditional language of the tajaran nobility."
speech_verb = list("mrowls")
ask_verb = list("mrowls")
exclaim_verb = list("yowls")
sing_verb = list("mrowls")
colour = "yassa"
written_style = "yassa"
key = "r"
flags = WHITELISTED|TCOMSSIM
syllables = list("hrr","rhr","tarj","khir","rajh","kir","mier","kre","ahek","nlhal","veh","khaz","dri","rhan","darrer",
"mi","jhri","dynher","manqi","rhas","shar","drhaz","kalh","shur","echi","tha","draer","jurl","maher","sanii","dra","ii'r",
"kan","aesi","fare","we","bash","arha","quara","zhir","sem","make","hrer","nja","rir","can","jhun","dar","rik","kah",
"hal","kete","juril","mah","tul","cresh","azu","ragh","miro","mara","mrero","mrara")
partial_understanding = list(LANGUAGE_SIIK_MAAS = 50)
allow_accents = TRUE
/datum/language/delvahhi
name = LANGUAGE_DELVAHII
short = "DEL"
desc = "A dialect developed by the Zhan-Khazan communities, commonly used in religious ceremonies dedicated to the Snow God and amongst settlements comprised mostly of Zhan-Khazan."
speech_verb = list("mrowls")
ask_verb = list("mrowls")
exclaim_verb = list("yowls")
sing_verb = list("mrowls")
colour = "delvahhi"
written_style = "delvahhi"
key = "n"
flags = WHITELISTED|TCOMSSIM
syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr",
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r",
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
partial_understanding = list(LANGUAGE_SIIK_MAAS = 50)
allow_accents = TRUE
/datum/language/skrell
name = LANGUAGE_SKRELLIAN
short = "NRAL"
desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans."
speech_verb = list("warbles")
ask_verb = list("warbles")
exclaim_verb = list("warbles")
sing_verb = list("warbles")
colour = "skrell"
written_style = "nralmalic"
key = "k"
flags = WHITELISTED|TCOMSSIM
syllables = list("*","!","'","-","qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix",
"xix", "zil", "rix", "qu", "xum", "xuuq", "qurm", "zazo", "qiu", "xiq", "qrrr", "vou", "vox", "quv", "vun", "v'qr",
"qrv", "su", "xu", "xi", "qi", "si", "ei", "qou", "qui", "kiu", "uiu", "eis", "seq", "eqa", "uiq", "kui", "muu", "muq",
"kuo", "omq", "xoi", "liq", "zuk", "iie", "squ", "ixu")
allow_accents = TRUE
/datum/language/skrell/check_speech_restrict(mob/speaker)
if(!ishuman(speaker))
return FALSE
var/mob/living/carbon/human/H = speaker
var/obj/item/organ/internal/augment/language/zeng/aug = H.internal_organs_by_name[BP_AUG_LANGUAGE_ZENG]
if(istype(aug) && !isskrell(H))
to_chat(speaker, SPAN_WARNING("You are not capable of speaking Nral'malic!"))
return FALSE
else
return TRUE
/datum/language/skrell/get_random_name()
var/new_name = ""
var/suff = ""
var/name_pieces = list("Qu", "Su", "Xu", "Xi", "Qi", "Si", "Ei", "Qui", "Iuq", "Qiu", "Kiu", "Uiu", "Eis", "Seq", "Eqa", "Uiq", "Kui", "Muu", "Muq", "Kuo", "Omq", "Xoi", "Liq", "Zuk", "Kono", "Koxi", "Auuo", "Iili", "Kesi", "Irek", "Quak", "Qoku", "Uokk", "Eeok", "Teie", "Xiou", "Xoku", "Xiru", "Qiuu", "Laqu", "Leua", "Olru", "Oquo", "Oeoo", "Isik", "Kiue", "Ruee", "Ouqu", "Kiiq", "Tesh", "Lish", "Ilin", "Shiq", "Quis", "Oquq", "Ququ", "Xoio", "Nolko", "Ruusi", "Ieliu", "Nuptu", "Eiuos", "Seiuu", "Xeriu", "Ioquk", "Teiqu", "Quoru", "Qiiuk", "Qeouu", "Quaoi", "Uieuu", "Koqun", "Nuouu", "Leuqo", "Luroq", "Urqul", "Uluqu", "Iequu", "Uiuou", "Suioq", "Urouu", "Xeouu", "Xeios", "Qarui", "Njubu", "Buquk", "Zueou", "Qosko", "Tuiru", "Tuquu", "Xorie", "Zouuo", "Euioi", "Liise", "Riori", "Iirun", "Akoox", "Nunuz", "Ezhin", "Vulun", "Ponoh", "Sulux", "Suqui", "Suqua", "Souqx", "Squix", "Quish", "Shiqu", "Jeshi", "Xushi", "Kiqui", "Liuiq", "Tuish", "Vuzuna", "Uptari", "Xiialt", "Yonosh", "Lieuqo", "Turiuu", "Utrieo", "Yutiex", "Xuitou", "Xieoru", "Xioshi", "Quisuu", "Juiqii", "Uituik", "Ruisui", "Tuisuh", "Jixktu", "Lioxui", "Shixul", "Iuoquu", "Nuitqu", "Kuixqu", "Oiquio", "Oiakuu", "Juukxu", "Iouiuu", "Tuirou", "Suahuk", "Seuaio", "Juirue", "Kioxui", "Xusuui", "Tuirul", "Luishi", "Liropo", "Lixuqe", "Urueir", "Queire", "Iuosuu", "Jaxxak", "Kqullu", "Xulluu", "Xikkuq", "Oiuqkk", "Tuiskk", "Liqukk", "Orueix", "Rkusix", "Turieu", "Kduish", "Xdurui", "Liquuq", "Shiruu", "Xuisoo", "Ooruex", "Uuooux", "Oieuix", "Laishi", "Xiaooi", "Oruexi", "Xiatal", "Xekkua")
var/first_name = "[pick(name_pieces)]"
name_pieces -= first_name
if(prob(40))
suff = "[pick(name_pieces)]"
name_pieces -= suff
first_name += "[pick(list("'", "-"))]" + suff
var/last_name = "[pick(name_pieces)]"
name_pieces -= last_name
if(prob(40))
suff = "[pick(name_pieces)]"
name_pieces -= suff
last_name += "[pick(list("'", "-"))]" + suff
new_name = first_name + " " + last_name
return new_name
/datum/language/bug
name = LANGUAGE_VAURCA
desc = "A localised expression of the Vaurcae hivemind, allowing Vaurcae to communicate from across great distances. \"It's a bugs life.\""
speech_verb = list(" broadcasts")
colour = "vaurca"
key = "9"
native = 1
flags = WHITELISTED | HIVEMIND
syllables = list("vaur","uyek","uyit","avek","sc'theth","k'ztak","teth","wre'ge","lii","dra'","zo'","ra'","k'lax'","zz","vh","ik","ak",
"uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k",
"sc'azz","th'sc","nil","n'ahk","sc'yeth","aur'sk","iy'it","azzg","a'","i'","o'","u'","a","i","o","u","zz","kr","ak","nrk")
/datum/language/bug/get_random_name()
var/new_name = "[pick(list("Ka'","Za'","Ka'"))]"
new_name += "[pick(list("Akaix'","Viax'"))]"
new_name += "[pick(list("Uyek","Uyit","Avek","Theth","Ztak","Teth","Zir","Yek","Zirk","Ayek","Yir","Kig","Yol","'Zrk","Nazgr","Yet","Nak","Kiihr","Gruz","Guurz","Nagr","Zkk","Zohd","Norc","Agraz","Yizgr","Yinzr","Nuurg","Iii","Lix","Nhagh","Xir","Z'zit","Zhul","Zgr","Na'k","Isk'yet","Agha"))]"
var/list/hive_names = list("Zo'ra" = 3, "K'lax" = 1, "C'thur" = 1)
new_name += " [pickweight(hive_names)]"
return new_name
/datum/language/bug/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("[key_name(speaker)] : ([name]) [message]")
if(is_lemurian_sea_sector())
to_chat(speaker, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return
var/mob/living/carbon/human/H = speaker //Check for Preimminent Shaper helmet, which obscure Hive affiliation
var/obj/item/clothing/head/shaper/helmet = H.get_equipped_item(slot_head)
if(!speaker_mask)
speaker_mask = speaker.real_name
if(istype(helmet)) //Then remove their Hive name from Hivenet
var/list/speaker_surname = splittext(speaker_mask, " ")
speaker_mask = speaker_surname[1]
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span>[format_message(message, get_spoken_verb(message), speaker_mask, speaker)]</span></i>"
var/encrypted_msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span>[format_message("!a surge of encrypted data", get_spoken_verb(message), speaker_mask, speaker)]</span></i>"
if(isvaurca(speaker))
speaker.custom_emote(VISIBLE_MESSAGE, "[pick("twitches their antennae", "twitches their antennae rhythmically")].")
playsound(speaker, 'sound/voice/vaurca_antenna_twitch.ogg', 60, 1)
if (within_jamming_range(speaker))
// The user thinks that the message got through.
to_chat(speaker, msg)
return
var/speaker_encryption_key
var/mob/living/carbon/human/speaker_human = speaker
if(istype(speaker_human))
var/obj/item/organ/internal/vaurca/neuralsocket/speaker_socket = speaker_human.internal_organs_by_name[BP_NEURAL_SOCKET]
if(speaker_socket?.encryption_key)
speaker_encryption_key = speaker_socket.encryption_key
for(var/mob/player in GLOB.player_list)
if(player == speaker)
to_chat(player, msg)
else if(isghost(player))
to_chat(player, "[ghost_follow_link(speaker, player)] [msg]")
else if(!within_jamming_range(player) && check_special_condition(player))
if(speaker_encryption_key)
var/mob/living/carbon/human/listener_human = player
if(!istype(listener_human))
to_chat(player, encrypted_msg)
continue
var/obj/item/organ/internal/vaurca/neuralsocket/listener_socket = listener_human.internal_organs_by_name[BP_NEURAL_SOCKET]
var/obj/item/organ/internal/augment/language/vekatak/receiver = listener_human.internal_organs_by_name[BP_AUG_LANGUAGE_VEKATAK]
if(listener_socket)
if(listener_socket.decryption_key == speaker_encryption_key)
to_chat(player, msg)
continue
if(receiver)
if(receiver.decryption_key == speaker_encryption_key)
to_chat(player, msg)
continue
to_chat(player, encrypted_msg)
continue
to_chat(player, msg)
/datum/language/bug/format_message(message, verb, speaker_mask, speaker)
var/message_color = colour
var/list/speaker_surname = splittext(speaker_mask, " ")
if(length(speaker_surname) > 1)
switch(speaker_surname[2])
if("Zo'ra")
message_color = "vaurca_zora"
if("C'thur")
message_color = "vaurca_cthur"
if("K'lax")
message_color = "vaurca_klax"
if("Lii'dra")
message_color = "vaurca_liidra"
if(copytext(message, 1, 2) == "!")
return " projects <span class='message'><span class='[message_color]'>[copytext(message, 2)]</span></span>"
return "[verb], <span class='message'><span class='[message_color]'>\"[capitalize(message)]\"</span></span>"
/datum/language/bug/check_special_condition(var/mob/other)
if(is_lemurian_sea_sector())
return 0
if(istype(other, /mob/living/silicon))
var/mob/living/silicon/S = other
if(S.can_hear_hivenet)
return TRUE
var/mob/living/carbon/human/M = other
if(!istype(M))
return 0
if(istype(M, /mob/abstract/new_player))
return 0
if(within_jamming_range(other))
return 0
if(M.internal_organs_by_name[BP_NEURAL_SOCKET] && (GLOB.all_languages[LANGUAGE_VAURCA] in M.languages))
return 1
if(M.internal_organs_by_name[BP_AUG_LANGUAGE_VEKATAK])
var/obj/item/organ/internal/augment/language/vekatak/V = M.internal_organs_by_name[BP_AUG_LANGUAGE_VEKATAK]
if(istype(V) && (GLOB.all_languages[LANGUAGE_VAURCA] in M.languages))
return 1
if(M.internal_organs_by_name["blackkois"])
return 1
if (M.l_ear || M.r_ear)
var/obj/item/radio/headset/dongle
if(istype(M.l_ear,/obj/item/radio/headset))
dongle = M.l_ear
else
dongle = M.r_ear
if(!istype(dongle))
return 0
if(dongle.translate_hivenet)
return 1
return 0
/datum/language/bug/check_speech_restrict(var/mob/speaker)
if(is_lemurian_sea_sector())
to_chat(speaker, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!"))
return FALSE
var/mob/living/carbon/human/H = speaker
var/obj/item/organ/internal/vaurca/neuralsocket/S = H.internal_organs_by_name[BP_NEURAL_SOCKET]
var/obj/item/organ/internal/augment/language/vekatak/V = H.internal_organs_by_name[BP_AUG_LANGUAGE_VEKATAK]
//Black k'ois zombies don't have neural sockets but need to talk, hence check if the socket exists, or it will runtime for them
if(S && (S.muted || S.disrupted))
to_chat(speaker, SPAN_WARNING("You have been muted over the Hivenet!"))
return FALSE
if(istype(V))
if(!V.transmitting || V.disrupted || V.muted)
to_chat(speaker, SPAN_WARNING("Your implant cannot freely transmit over the Hivenet!"))
return FALSE
else
return TRUE
/datum/language/human
name = LANGUAGE_SOL_COMMON
short = "SOL"
desc = "With its roots in Mandarin Chinese, Common evolved as the official language of the Sol Alliance, with officials working to tie it together with a common tongue. It's spoken by state officials, taught in schools, and spoken by those who either feel a sense of national pride in the Alliance or otherwise fell sway to the culture."
colour = "solcom"
written_style = "solcommon"
key = "1"
flags = WHITELISTED | TCOMSSIM
syllables = list("a", "abe", "ade", "ai", "an", "ana", "ba", "bae", "bai", "bang", "bao", "bei", "ben", "beo", "bi", "bian", "bing", "bo", "bu", "bugu", "bun", "cai", "can", "cao", "cau", "chan", "chen", "cheong",
"chiu", "chong", "chyo", "da", "dan", "dao", "de", "deun", "duo", "eon", "eun", "eusi", "feng", "fu", "ga", "gak", "gan", "gang", "gao", "ge", "gei", "gen", "geo", "gil", "go", "gou", "gu", "gua", "gui", "gul",
"gun", "guo", "gwi", "ha", "hai", "hal", "han", "hap", "hara", "he", "hego", "hen", "hon", "hoo", "hu", "hua", "hun", "hyeong", "i", "jae", "jeo", "jeon", "ji", "jia", "jian", "jiang", "jie", "jong", "ju", "jue",
"juede", "jung", "juzi", "ka", "kang", "kawa", "ke", "keun", "ki", "kin", "ko", "kore", "kou", "ku", "kuda", "kun", "kyu", "lang", "lao", "leng", "leung", "li", "lian", "liang", "lie", "ling", "lizi", "lleo", "long",
"lu", "ma", "mah", "me", "mei", "meinu", "men", "meng", "meog", "meoni", "mi", "mian", "min", "mo", "mot", "mu", "mun", "na", "nae", "nai", "nari", "ne", "ni", "nii", "nim", "nin", "no", "nop", "nu", "o", "oba", "oga", "oji",
"oka", "ong", "op", "oto", "pa", "pai", "pang", "pin", "ping", "pong", "pu", "pum", "pye", "qi", "qie", "qing", "ra", "rei", "ren", "ri", "ru", "ruan", "sa", "sai", "sama", "san", "sang", "se", "sei", "sen", "seo", "seon", "seong",
"shang", "shen", "sheng", "shi", "sho", "shui", "si", "su", "sui", "sum", "sun", "swi", "ta", "tae", "tai", "tame", "tamen", "tan", "te", "tei", "ti", "tian", "to", "ton", "tsu", "ul", "wa", "wan", "wang", "wei", "wo", "xi", "xian",
"xiao", "xing", "xiong", "xiu", "xu", "xuan", "xue", "ya", "yan", "yang", "yeong", "yi", "yige", "yin", "ying", "yiqi", "yong", "you", "yu", "yuli", "yuyi", "zai", "zao", "zhan", "zhang", "zhe", "zhen", "zheng", "zhuo", "zi", "zo",
"zu", "zun", "zuo")
allow_accents = TRUE
/datum/language/human/get_random_name(var/gender)
if (prob(80))
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))
else
return ..()
//Placeholder stuff for now, a lot of it
/datum/language/elyran
name = LANGUAGE_ELYRAN_STANDARD
short = "ELY"
desc = "Elyran Standard is the official tongue of the Republic of Elyra. Constructed using elements of Farsi, Arabic, and Turkish, influence from all three of these languages can be seen throughout its grammar and vocabulary."
colour = "elyran"
written_style = "elyranstandard"
key = "4"
flags = WHITELISTED | TCOMSSIM
syllables = list("af", "if", "ba", "ta", "tha", "id", "jem", "ha", "kha", "dal", "dhl", "ra", "zay", "sen", "um", "shn", "sid", "ad", "ta", "za", "ayn", "gha", "zir", "yn", "fa", "qaf", "iam", "mim", "al", "ja", "non", "ha", "waw", "ya",
"hem", "zah", "hml", "ks", "ini", "da", "ks", "iga", "ih", "la", "ulf", "xe", "ayw", "sit", "ah", "aarah", "jalaa", "sirt", "kurt", "turhk", "ust", "irk", "kir", "mir", "ach", "oglu", "bolu", "shek", "she", "ghoz", "miya", "ejdan",
"haaz", "quq", "taab", "shanha", "an", "saa", "seh", "an'", "e'", "a'", "em'")
allow_accents = TRUE
/datum/language/machine
name = LANGUAGE_EAL
short = "EAL"
desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information."
speech_verb = list("beeps")
ask_verb = list("beeps")
exclaim_verb = list("loudly beeps")
sing_verb = list("rhythmically beeps")
colour = "changeling"
written_style = "encodedaudiolanguage"
key = "6"
flags = RESTRICTED | NO_STUTTER | TCOMSSIM
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
period_chance = 0
space_chance = 0
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
return pick(GLOB.ai_names)
// we're trimming out the punctuation and not readding it, so we need to readd it at the very end
/datum/language/machine/scramble(var/input, var/list/known_languages)
. = ..()
return formalize_text(.)
/datum/language/machine/process_word_prescramble(var/original_word, var/new_word, var/word_index, var/new_sentence, var/understand_chance, var/list/music_notes)
// we drop every second word to make the resulting message shorter, to represent the effective compression of EAL
if(word_index % 2)
if(!prob(understand_chance) && !(original_word in music_notes))
new_word = trim(scramble_word(original_word))
else
new_word = ""
return list(new_word, new_sentence)
// we don't care about the input_size at all, we just want one syllable used
/datum/language/machine/scrambled_word_size_requirement(var/input_size)
return 1