From bbdcff81bb7158237e69869c032f1e018874f277 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 06:07:21 -0500 Subject: [PATCH] Cultists of Nar-sie have their own language --- code/datums/antagonists/datum_cult.dm | 2 + code/game/gamemodes/cult/runes.dm | 6 +-- code/game/gamemodes/cult/runes.dm.rej | 10 ++++ code/game/gamemodes/cult/talisman.dm | 2 +- code/modules/language/language.dm | 2 +- code/modules/language/language.dm.rej | 15 ++++++ code/modules/language/narsian.dm | 43 ++++++++++++++++++ .../language/{ratvar.dm => ratvarian.dm} | 13 ++++-- .../mob/living/simple_animal/constructs.dm | 3 +- .../modules/mob/living/simple_animal/shade.dm | 3 +- code/modules/surgery/organs/tongue.dm.rej | 9 ++++ icons/misc/language.dmi | Bin 1455 -> 1675 bytes tgstation.dme | 3 +- 13 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 code/game/gamemodes/cult/runes.dm.rej create mode 100644 code/modules/language/language.dm.rej create mode 100644 code/modules/language/narsian.dm rename code/modules/language/{ratvar.dm => ratvarian.dm} (51%) create mode 100644 code/modules/surgery/organs/tongue.dm.rej diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 30c0aa8450..21c8003c17 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -27,6 +27,7 @@ if(mob_override) current = mob_override current.faction |= "cult" + current.grant_language(/datum/language/narsie) current.verbs += /mob/living/proc/cult_help communion.Grant(current) @@ -36,6 +37,7 @@ if(mob_override) current = mob_override current.faction -= "cult" + current.remove_language(/datum/language/narsie) current.verbs -= /mob/living/proc/cult_help communion.Remove(current) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3a80ed54b3..f9bbf11280 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -136,7 +136,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(invocation) for(var/M in invokers) var/mob/living/L = M - L.say(invocation) + L.say(invocation, language = /datum/language/common) do_invoke_glow() /obj/effect/rune/proc/do_invoke_glow() @@ -556,9 +556,9 @@ structure_check() searches for nearby cultist structures required for the invoca return rune_in_use = 1 if(user.name == "Herbert West") - user.say("To life, to life, I bring them!") + invocation = "To life, to life, I bring them!" else - user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") + invocation = initial(invocation) ..() revives_used++ mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it! diff --git a/code/game/gamemodes/cult/runes.dm.rej b/code/game/gamemodes/cult/runes.dm.rej new file mode 100644 index 0000000000..cd7962db1e --- /dev/null +++ b/code/game/gamemodes/cult/runes.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm (rejected hunks) +@@ -516,7 +516,7 @@ structure_check() searches for nearby cultist structures required for the invoca + /obj/effect/rune/raise_dead + cultist_name = "Resurrect Cultist" + cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived." +- invocation = null //Depends on the name of the user - see below ++ invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below + icon_state = "1" + color = "#C80000" + var/static/revives_used = 0 diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 9645b4bbce..cd3431406c 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -28,7 +28,7 @@ . = successfuluse if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff if(invocation) - user.whisper(invocation) + user.whisper(invocation, language = /datum/language/common) if(health_cost && iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm")) diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 4222982182..edbeccb505 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -1,4 +1,4 @@ -#define SCRAMBLE_CACHE_LEN 20 +#define SCRAMBLE_CACHE_LEN 50 //maximum of 50 specific scrambled lines per language /* Datum based languages. Easily editable and modular. diff --git a/code/modules/language/language.dm.rej b/code/modules/language/language.dm.rej new file mode 100644 index 0000000000..c7f2ac173f --- /dev/null +++ b/code/modules/language/language.dm.rej @@ -0,0 +1,15 @@ +diff a/code/modules/language/language.dm b/code/modules/language/language.dm (rejected hunks) +@@ -16,10 +16,10 @@ + // 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/list/sentence_chance = 5 // Likelihood of making a new sentence after each syllable. +- var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string ++ 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/static/list/scramble_cache = 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. diff --git a/code/modules/language/narsian.dm b/code/modules/language/narsian.dm new file mode 100644 index 0000000000..70966ad880 --- /dev/null +++ b/code/modules/language/narsian.dm @@ -0,0 +1,43 @@ +/datum/language/narsie + name = "Nar-Sian" + desc = "The ancient, blood-soaked, impossibly complex language of Nar-Sian cultists." + speech_verb = "intones" + ask_verb = "inquires" + exclaim_verb = "invokes" + key = "n" + sentence_chance = 8 + space_chance = 95 //very high due to the potential length of each syllable + var/static/list/base_syllables = list( + "h", "v", "c", "e", "g", "d", "r", "n", "h", "o", "p", + "ra", "so", "at", "il", "ta", "gh", "sh", "ya", "te", "sh", "ol", "ma", "om", "ig", "ni", "in", + "sha", "mir", "sas", "mah", "zar", "tok", "lyr", "nqa", "nap", "olt", "val", "qha", + "fwe", "ath", "yro", "eth", "gal", "gib", "bar", "jin", "kla", "atu", "kal", "lig", + "yoka", "drak", "loso", "arta", "weyh", "ines", "toth", "fara", "amar", "nyag", "eske", "reth", "dedo", "btoh", "nikt", "neth", + "kanas", "garis", "uloft", "tarat", "khari", "thnor", "rekka", "ragga", "rfikk", "harfr", "andid", "ethra", "dedol", "totum", + "ntrath", "keriam" + ) //the list of syllables we'll combine with itself to get a larger list of syllables + syllables = list( + "sha", "mir", "sas", "mah", "hra", "zar", "tok", "lyr", "nqa", "nap", "olt", "val", + "yam", "qha", "fel", "det", "fwe", "mah", "erl", "ath", "yro", "eth", "gal", "mud", + "gib", "bar", "tea", "fuu", "jin", "kla", "atu", "kal", "lig", + "yoka", "drak", "loso", "arta", "weyh", "ines", "toth", "fara", "amar", "nyag", "eske", "reth", "dedo", "btoh", "nikt", "neth", "abis", + "kanas", "garis", "uloft", "tarat", "khari", "thnor", "rekka", "ragga", "rfikk", "harfr", "andid", "ethra", "dedol", "totum", + "verbot", "pleggh", "ntrath", "barhah", "pasnar", "keriam", "usinar", "savrae", "amutan", "tannin", "remium", "barada", + "forbici" + ) //the base syllables, which include a few rare ones that won't appear in the mixed syllables + icon_state = "narsie" + default_priority = 10 + +/datum/language/narsie/New() + for(var/syllable in base_syllables) //we only do this once, since there's only ever a single one of each language datum. + for(var/target_syllable in base_syllables) + if(syllable != target_syllable) //don't combine with yourself + if(length(syllable) + length(target_syllable) > 8) //if the resulting syllable would be very long, don't put anything between it + syllables += "[syllable][target_syllable]" + else if(prob(80)) //we'll be minutely different each round. + syllables += "[syllable]'[target_syllable]" + else if(prob(25)) //5% chance of - instead of ' + syllables += "[syllable]-[target_syllable]" + else //15% chance of no ' or - at all + syllables += "[syllable][target_syllable]" + ..() diff --git a/code/modules/language/ratvar.dm b/code/modules/language/ratvarian.dm similarity index 51% rename from code/modules/language/ratvar.dm rename to code/modules/language/ratvarian.dm index cef4a3164e..b924d2fc79 100644 --- a/code/modules/language/ratvar.dm +++ b/code/modules/language/ratvarian.dm @@ -1,14 +1,19 @@ /datum/language/ratvar name = "Ratvarian" desc = "A timeless language full of power and incomprehensible to the unenlightened." - speech_verb = "clinks" - ask_verb = "clunks" - exclaim_verb = "clanks" + var/static/random_speech_verbs = list("clanks", "clinks", "clunks", "clangs") + ask_verb = "requests" + exclaim_verb = "proclaims" + whisper_verb = "imparts" key = "r" default_priority = 10 spans = list(SPAN_ROBOT) - icon_state = "ratvar" /datum/language/ratvar/scramble(var/input) . = text2ratvar(input) + +/datum/language/ratvar/get_spoken_verb(msg_end) + if(!msg_end) + return pick(random_speech_verbs) + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index b879f1baf6..e682b03870 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -27,7 +27,8 @@ unique_name = 1 AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/weapon/ectoplasm) - del_on_death = 1 + del_on_death = TRUE + initial_language_holder = /datum/language_holder/construct deathmessage = "collapses in a shattered heap." var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 8c08263aa7..4eaa10195b 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -28,7 +28,8 @@ status_flags = CANPUSH movement_type = FLYING loot = list(/obj/item/weapon/ectoplasm) - del_on_death = 1 + del_on_death = TRUE + initial_language_holder = /datum/language_holder/construct /mob/living/simple_animal/shade/death() deathmessage = "lets out a contented sigh as [p_their()] form unwinds." diff --git a/code/modules/surgery/organs/tongue.dm.rej b/code/modules/surgery/organs/tongue.dm.rej new file mode 100644 index 0000000000..c1f978600b --- /dev/null +++ b/code/modules/surgery/organs/tongue.dm.rej @@ -0,0 +1,9 @@ +diff a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm (rejected hunks) +@@ -15,6 +15,7 @@ + /datum/language/common, + /datum/language/draconic, + /datum/language/monkey, ++ /datum/language/narsie, + /datum/language/ratvar + )) + diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index e961c351912a5b8dcf5d2f12ab5a08b5fdd0c5b5..081bbf1aa3c0ef6f7e6b3989e29cd5314bddbcb3 100644 GIT binary patch delta 1459 zcmV;k1x)&{3yTeqBmrxYC2c%X006TC2fL3)`uFjVNH7fy5a!mqytuMpC?L!L02>+} z=-I)ujZN?6)ZNUl14gv};)*#rJXZh#wFnH6xf=s&005EHAzF|S0ABzA{{R4H0013g z(Nc@>QIr3G|NmkD045q9Ri^Eo|NpT6|76(kaJ2tMJ3bj19BZlnEDja-=5 z5&!}KIhbCT`363l06LjRiS-3Mm_{itlPdu&f9e-iVgLXD0d!JMQvg8b*k%9#0J3^i zSad{Xb7OL8aCB*JZU6vyoQ=}K3c@f92HH8?wXp4q=U3v28|LHu345 z4!lXcCFJ9Wkd)?9Uz^TUZKG%8Pt#mLx6R zkYb=|i&cw4&@^7bTS>j*k=<2cao6n{e+2Kv`~LHN=bOxtE~~r!CUa5VXTD?dql{h5 zYBja2qhB)S`w-)4G-|YfuFiFr)GW-h_#@4>ZR(}osR;mIh?7aE0T6Flcnm$6)HfV- z8i;TgfUCD*mO)^);X$(jJqV2^>4ooV24I`?9AN}*L;*t6ahgJ3O`rhmY;W&ae-@uC z9fKT^f3C09h)}C0kV4?c?^pt487U|MHS)ejxoGfIn(-@uIN74vwl#rr=xBiBYyxa; zZEXfH6@mljn~n&fl0YiLW%sfPV1@^_DrB=+7O|SZy0}DAzhfj(1Grw4QCtJV{d!#% z4G^tY1(5nCqM*UNNHP~CfGWw(e*xr0l2^HDUgau4#i6f}HY$OmUnZTvx{l%h%y^wI zV67G&-Y=}bo8ZA7L@(3|;CZ{S|3tJa09FM+{?INV)R%nUuc+Idwqj`KOMq9(C85jp zT~6qh`c8W<*y9YH0>hMke}A6{2VMWrKS1vuNPRDOIOtUfEfXN+FaU7&f6<}u`iDpG zLlAn81ZX{#hn9)(cK5X&E_8haa0CyaXM)fU9;H@IWJ_gW-!zW`FLNN05OloYF*L6e zuycq_fUa*;fjkI;PCM8O+MOU^M($-Yy^8+WV?L!$3`7Zf0WT!YCV)v74EZrt!Novb zQ~@psKv2=?1#a;%nY_+!e|dtOSzwI%9+<`Sya#w0TH5YYaZiHrS)cX$?mZP7?C~ee zU4P)Z19xa3LNvp|vP&Crz({Qe!zYIW7nH$M@}mgN(DO~C2q(-Q#qr3-Lg=3!KJ%>m zoZBDvpO=axO7w}?ae(*)qLCesUwCmG+aubtmtKD5)z@BsW5P{3e~_XnKq8h=BF;aB zG=>3lNhIL30ty)tyUP8?4+o8fAH1UWff2Y_^fXdg&>wo zK0sTrLT)G76l!?z&9~oeyayZ*D&F^utr)3Sv{4>R@2r1VD?yZ30Ox>A5K5c;_|wn7 z-1+sl-`8ucsJsh!8KS82cJb4-{qg5tfB&;y8~XDA)Uv8)>K~4O0fjE41Fm8L6#xJL N07*qoM6N<$0fM?;v3mdj delta 1236 zcmV;_1S|WC4X+E3BmpmxC2c3bz`(nYNBZ~ik4P})*1Np8vS276=-I)ujZN?6)ZNUl z14gv};);>Z8KAQkKnMaBB1w5FOX8|pLdxvW}00001bW%=J06^y0W&i*Hta?;fbVOxyV{&P5 zbZKvH004NLjnT0R!Y~j9;5m7U(C(rjZZ6Uy9oly|nzIcixpE1u`1Do_ZgOt_&wc#M zmF7}ko6b~iqi5vgD4Mf5?)F+O&gO9~hm%$#x?#*)Nf|P(u|V*JR@QNUdLOj9F$CQ5 z*E}$ih#i=r&z+ z(ArI!x;yUP-~Ti8>4cDfa3Jf1B;xS?yt@;Iak4PY{I-USqBy@aqdg3-_%ICbbjs5_(= z-t!%RCDL<*mbjJ$2##$#LSHPP04y&pEn61fER};?QGc#CO(K|o#R5_a{PoM009jfI zGJr|$O{ztmmr~C^2Z%RYv^N@xKsB@#z_!Z(i;Iip03%PqhIz*pDHIAwO;~YPbbz5b zXylD_oUDn(0@lPKlKN$>hzh{PBzQYNfOy6#;u{F+6CD0<*ce`C8tatnk ze;u>4F7-Wjn)M2VrVfyD1ORyV=7#V38=LSU2)#25qnFozp{XOh)vnURLdQn}n{WWV zAqXvYmPWCV&Ab9#Jv>T0tAQv2YkTY*hSz4s9HI=+@wG0H1IF4dw#Hg*#tg0YvY1{$ zzvUS|l};=~VLiqhNxKd(qyQ&=g&O1p#0Mow~s(-lCAl+0EV{cY|rGItO|) zJ?|JFLsP|n5fzmL?YF+s@4Jp8pFGXX_gDZf?ysv2l)Ku>$kn{KYq?; yN>TV0@G*qdpMqih`u*qczu8RF&jZlQD*b;PoO*wsBV=p<0000