diff --git a/code/__DEFINES/accents.dm b/code/__DEFINES/accents.dm index f1c836cf4a6..bbe414202a3 100644 --- a/code/__DEFINES/accents.dm +++ b/code/__DEFINES/accents.dm @@ -12,6 +12,7 @@ #define ACCENT_ZALAD "Zalad Accent" #define ACCENT_HALFLING "No Swearing!" #define ACCENT_KOBOLD "Scale-thing!" +#define ACCENT_ROUSMAN "Ratty Accent" GLOBAL_LIST_INIT(accent_list, list( ACCENT_NONE = list(), @@ -28,4 +29,5 @@ GLOBAL_LIST_INIT(accent_list, list( ACCENT_ZALAD = strings("accents/zalad_replacement.json", "arabic"), ACCENT_HALFLING = strings("accents/halfling_replacement.json", "halfling"), ACCENT_KOBOLD = strings("accents/kobold_replacement.json", "kobold"), + ACCENT_ROUSMAN = strings("accents/rousman_replacement.json", "rous"), )) diff --git a/code/__DEFINES/traits/definitions.dm b/code/__DEFINES/traits/definitions.dm index 5ea31a66473..78d872dc3df 100644 --- a/code/__DEFINES/traits/definitions.dm +++ b/code/__DEFINES/traits/definitions.dm @@ -481,6 +481,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_KNOW_KEEP_DOORS "know_keep_doors" #define TRAIT_KNOW_INQUISITION_DOORS "know_inquisition_doors" #define TRAIT_KNOW_THIEF_DOORS "know_thief_doors" +#define TRAIT_KNOW_ROUS_DOORS "know_rous_doors" //Event purposes. // JOB RELATED TRAITS #define TRAIT_MALUMFIRE "Professional Smith" diff --git a/code/game/objects/structures/hidden_doors.dm b/code/game/objects/structures/hidden_doors.dm index 6fadb76b4ec..743e933fde0 100644 --- a/code/game/objects/structures/hidden_doors.dm +++ b/code/game/objects/structures/hidden_doors.dm @@ -419,3 +419,16 @@ GLOBAL_LIST_EMPTY(secret_door_managers) accessor_trait = TRAIT_KNOW_THIEF_DOORS memory_name = "thieves' guild's" vips = list(/datum/job/matron) + + +/obj/effect/mapping_helpers/secret_door_creator/rous + name = "Rous Secret Door Creator" + color = "#dcec4b" + override_floor = FALSE + hidden_dc = 16 + use_phrases = TRUE + lang = list(/datum/language/rousman) + manager_id = "rousdoors" + accessor_trait = TRAIT_KNOW_ROUS_DOORS + memory_name = "Rous'" + vips = list(/datum/job/rousman) diff --git a/code/game/objects/structures/redstone.dm b/code/game/objects/structures/redstone.dm index a81e3d9b2a7..8255fa551db 100644 --- a/code/game/objects/structures/redstone.dm +++ b/code/game/objects/structures/redstone.dm @@ -167,6 +167,10 @@ GLOBAL_LIST_EMPTY(redstone_objs) hidden_dc = 13 accessor_trait = TRAIT_KNOW_THIEF_DOORS +/obj/structure/lever/hidden/rous + hidden_dc = 16 + accessor_trait = TRAIT_KNOW_ROUS_DOORS + /obj/structure/repeater name = "repeater" desc = "Repeats a signal a set amount of times into an adjacently linked machine when activated by a signal. Looks suspiciously like a barrel." diff --git a/code/modules/language/cat.dm b/code/modules/language/cat.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/language/fae.dm b/code/modules/language/fae.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/language/rousman.dm b/code/modules/language/rousman.dm new file mode 100644 index 00000000000..cd175bf3732 --- /dev/null +++ b/code/modules/language/rousman.dm @@ -0,0 +1,23 @@ +/datum/language/rousman + name = "Rousman" + desc = "The tongue of the rousmen, child sized rat savages." + speech_verb = "squeaks" + ask_verb = "chirps" + exclaim_verb = "hisses" + key = "r" + space_chance = 15 + sentence_chance = 0 + between_word_sentence_chance = 10 + between_word_space_chance = 75 + additional_syllable_low = -1 + additional_syllable_high = 1 + default_priority = 100 + icon_state = "rous" + spans = list(SPAN_DWARF) + syllables = list("GRRrrrr", +"GGGrrr", +"RRRRrr", +"GRrr", +"Rr", +"Rrrr", +"Rrrrr") diff --git a/code/modules/mob/living/carbon/human/npc/rousman.dm b/code/modules/mob/living/carbon/human/npc/rousman.dm index bbfac5160da..cb828a21f7c 100644 --- a/code/modules/mob/living/carbon/human/npc/rousman.dm +++ b/code/modules/mob/living/carbon/human/npc/rousman.dm @@ -128,16 +128,27 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) headprice = 2 sellprice = 2 - +// ##################################### SPECIES BIT ##################################### /datum/species/rousman name = "rousman" id = SPEC_ID_ROUSMAN species_traits = list(NO_UNDERWEAR) - inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE, TRAIT_EASYDISMEMBER, TRAIT_CRITICAL_WEAKNESS, TRAIT_NASTY_EATER, TRAIT_LEECHIMMUNE, TRAIT_INHUMENCAMP) + inherent_traits = list( + TRAIT_KNOW_ROUS_DOORS, + TRAIT_RESISTCOLD, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_RADIMMUNE, + TRAIT_EASYDISMEMBER, + TRAIT_CRITICAL_WEAKNESS, + TRAIT_NASTY_EATER, + TRAIT_LEECHIMMUNE, + TRAIT_INHUMENCAMP, + ) no_equip = list(ITEM_SLOT_SHIRT, ITEM_SLOT_MASK, ITEM_SLOT_GLOVES, ITEM_SLOT_SHOES, ITEM_SLOT_PANTS) - offset_features_m = list(OFFSET_HANDS = list(0,-4)) - offset_features_f = list(OFFSET_HANDS = list(0,-4)) + offset_features_m = list(OFFSET_HANDS = list(0,-4), OFFSET_NECK = list(0,-4), OFFSET_CLOAK = list(0,-5)) + offset_features_f = list(OFFSET_HANDS = list(0,-4), OFFSET_NECK = list(0,-4), OFFSET_CLOAK = list(0,-5)) dam_icon_f = null dam_icon_m = null damage_overlay_type = "" @@ -145,6 +156,7 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) var/raceicon = "rousman" exotic_bloodtype = /datum/blood_type/human/corrupted/rousman meat = list(/obj/item/reagent_containers/food/snacks/meat/strange/inhumen = 1, /obj/item/natural/fur/rous = 0.5) + native_language = "Rous" /datum/species/rousman/update_damage_overlays(mob/living/carbon/human/H) return @@ -163,6 +175,23 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) H.update_transform() return TRUE +/datum/species/rousman/on_species_gain(mob/living/carbon/C, datum/species/old_species) + ..() + RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + C.grant_language(/datum/language/rousman) + +/datum/species/rousman/after_creation(mob/living/carbon/C) + ..() + C.dna.species.accent_language = C.dna.species.get_accent(native_language, 1) + C.grant_language(/datum/language/rousman) + +/datum/species/rousman/on_species_loss(mob/living/carbon/C) + . = ..() + UnregisterSignal(C, COMSIG_MOB_SAY) + C.remove_language(/datum/language/rousman) + +// ##################################### END SPECIES BIT ##################################### + /mob/living/carbon/human/species/rousman/update_body() remove_overlay(BODY_LAYER) if(!dna || !dna.species) @@ -429,7 +458,7 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) //////////////////////////////// //////////////////////////////// -/mob/living/carbon/human/species/rousman/assassin +/mob/living/carbon/human/species/rousman/assassin/with_ai ai_controller = /datum/ai_controller/human_npc /mob/living/carbon/human/species/rousman/assassin/after_creation() @@ -467,7 +496,7 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) H.adjust_skillrank(/datum/skill/misc/athletics, 5, TRUE) H.adjust_skillrank(/datum/skill/misc/sneaking, 5, TRUE) -/mob/living/carbon/human/species/rousman/seer +/mob/living/carbon/human/species/rousman/seer/with_ai ai_controller = /datum/ai_controller/human_npc /mob/living/carbon/human/species/rousman/seer/after_creation() @@ -482,34 +511,91 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) flee_in_pain = TRUE wander = TRUE -/datum/outfit/npc/rousman/seer/pre_equip(mob/living/carbon/human/H) +/mob/living/carbon/human/species/rousman/seer_stronger/with_ai + ai_controller = /datum/ai_controller/human_npc + +/mob/living/carbon/human/species/rousman/seer_stronger/after_creation() + . = ..() + AddComponent(/datum/component/ai_aggro_system) + job = "Seer Rousman" + ADD_TRAIT(src, TRAIT_NOMOOD, TRAIT_GENERIC) + ADD_TRAIT(src, TRAIT_NOHUNGER, TRAIT_GENERIC) + equipOutfit(new /datum/outfit/npc/rousman/seer_stronger) + dodgetime = 13 + canparry = TRUE + flee_in_pain = TRUE + wander = TRUE + +/datum/outfit/npc/rousman/seer/pre_equip(mob/living/carbon/human/seer) ..() - H.base_strength = rand(4, 8) - H.base_perception = rand(6, 10) - H.base_intelligence = rand(10, 16) - H.base_constitution = rand(4, 8) - H.base_endurance = rand(7, 10) - H.base_speed = rand(10, 15) - H.recalculate_stats(FALSE) + seer.base_strength = rand(4, 8) + seer.base_perception = rand(6, 10) + seer.base_intelligence = rand(10, 16) + seer.base_constitution = rand(4, 8) + seer.base_endurance = rand(7, 10) + seer.base_speed = rand(10, 15) + seer.recalculate_stats(FALSE) armor = /obj/item/clothing/shirt/robe/rousseer head = /obj/item/clothing/head/roguehood/rousman/rousseer r_hand = /obj/item/weapon/polearm/woodstaff/seer var/list/spells = list( + /datum/action/cooldown/spell/undirected/arcyne_eye, + /datum/action/cooldown/spell/projectile/fetch, + /datum/action/cooldown/spell/projectile/sickness, + /datum/action/cooldown/spell/eyebite, /datum/action/cooldown/spell/projectile/fireball, /datum/action/cooldown/spell/projectile/blood_bolt, - /datum/action/cooldown/spell/projectile/sickness, - /datum/action/cooldown/spell/projectile/fetch, + /datum/action/cooldown/spell/sundering_lightning, + ) + + seer.adjust_skillrank(/datum/skill/magic/arcane, 5, TRUE) + seer.adjust_skillrank(/datum/skill/magic/blood, 2, TRUE) + seer.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) + seer.adjust_spell_points(17) + seer.generate_random_attunements(rand(4,6)) + seer.mana_pool.set_intrinsic_recharge(MANA_ALL_LEYLINES) + seer.mana_pool.adjust_mana(100) + for(var/spell in spells) + seer.add_spell(spell) + +/datum/outfit/npc/rousman/seer_stronger/pre_equip(mob/living/carbon/human/seer) + ..() + seer.base_strength = rand(4, 8) + seer.base_perception = rand(8, 12) + seer.base_intelligence = rand(12, 18) + seer.base_constitution = rand(6, 10) + seer.base_endurance = rand(8, 11) + seer.base_speed = rand(11, 16) + seer.recalculate_stats(FALSE) + + seer.grant_language(/datum/language/common) + + armor = /obj/item/clothing/shirt/robe/rousseer + head = /obj/item/clothing/head/roguehood/rousman/rousseer + r_hand = /obj/item/weapon/polearm/woodstaff/seer + belt = /obj/item/storage/belt/leather/black + l_pocket = /obj/item/book/granter/spellbook/expert + + var/list/spells = list( + /datum/action/cooldown/spell/undirected/jaunt/ethereal_jaunt, + /datum/action/cooldown/spell/conjure/rous, /datum/action/cooldown/spell/undirected/arcyne_eye, + /datum/action/cooldown/spell/projectile/fetch, + /datum/action/cooldown/spell/projectile/sickness, /datum/action/cooldown/spell/eyebite, + /datum/action/cooldown/spell/projectile/fireball, + /datum/action/cooldown/spell/projectile/blood_bolt, /datum/action/cooldown/spell/sundering_lightning, ) - H.adjust_skillrank(/datum/skill/magic/arcane, 5, TRUE) - H.adjust_spell_points(17) - H.generate_random_attunements(rand(4,6)) - H.mana_pool.set_intrinsic_recharge(MANA_ALL_LEYLINES) - H.mana_pool.adjust_mana(100) + seer.adjust_skillrank(/datum/skill/magic/arcane, 5, TRUE) + seer.adjust_skillrank(/datum/skill/magic/blood, 2, TRUE) + seer.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) + seer.adjust_spell_points(17) + seer.generate_random_attunements(rand(4,6)) + seer.mana_pool.set_intrinsic_recharge(MANA_ALL_LEYLINES) + seer.mana_pool.adjust_mana(100) for(var/spell in spells) - H.add_spell(spell) + seer.add_spell(spell) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 4c0bc3dec75..c13f9b6251c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -314,6 +314,8 @@ GLOBAL_LIST_EMPTY(roundstart_species) return strings("accents/halfling_replacement.json", "halfling") if("Gutter") return strings("accents/kobold_replacement.json", "kobold") + if("Rous") + return strings("accents/rousman_replacement.json", "rous") if("Deepspeak") return strings("accents/triton_replacement.json", "triton") if("Pirate") diff --git a/code/modules/mob/living/carbon/human/voicepacks/other/rousman.dm b/code/modules/mob/living/carbon/human/voicepacks/other/rousman.dm index fd4db157a44..184dccb74d1 100644 --- a/code/modules/mob/living/carbon/human/voicepacks/other/rousman.dm +++ b/code/modules/mob/living/carbon/human/voicepacks/other/rousman.dm @@ -13,12 +13,12 @@ used = pick('sound/vo/mobs/rousman/ratidle1.ogg','sound/vo/mobs/rousman/ratidle2.ogg','sound/vo/mobs/rousman/ratidle3.ogg') if("pain") used = pick('sound/vo/mobs/rousman/ratpain1.ogg','sound/vo/mobs/rousman/ratpain2.ogg','sound/vo/mobs/rousman/ratpain3.ogg','sound/vo/mobs/rousman/ratpain4.ogg','sound/vo/mobs/rousman/ratpain5.ogg') - if("paincrit") - used = pick('sound/vo/mobs/rousman/ratpainscream1.ogg','sound/vo/mobs/rousman/ratpainscream2.ogg','sound/vo/mobs/rousman/ratpainscream3.ogg','sound/vo/mobs/rousman/ratpainscream4.ogg','sound/vo/mobs/rousman/ratpainscream5.ogg') - if("painscream") + if("paincrit", "painscream") used = pick('sound/vo/mobs/rousman/ratpainscream1.ogg','sound/vo/mobs/rousman/ratpainscream2.ogg','sound/vo/mobs/rousman/ratpainscream3.ogg','sound/vo/mobs/rousman/ratpainscream4.ogg','sound/vo/mobs/rousman/ratpainscream5.ogg') if("scream") used = pick('sound/vo/mobs/rousman/ratscream1.ogg','sound/vo/mobs/rousman/ratscream2.ogg') + if("whimper") + used = 'sound/vo/mobs/rousman/ratpainscream6.ogg' if("rage") used = pick('sound/vo/mobs/rousman/ratrage1.ogg') if("agony") @@ -27,4 +27,6 @@ used = list('sound/vo/male/gen/drown (1).ogg','sound/vo/male/gen/drown (2).ogg','sound/vo/male/gen/drown (3).ogg') if("snore") used = list('sound/vo/male/gen/snore (1).ogg','sound/vo/male/gen/snore (2).ogg','sound/vo/male/gen/snore (3).ogg','sound/vo/male/gen/snore (4).ogg') + if("clap") + used = list('sound/vo/clap (1).ogg', 'sound/vo/clap (2).ogg', 'sound/vo/clap (3).ogg', 'sound/vo/clap (4).ogg') return used diff --git a/code/modules/paperwork/rogue.dm b/code/modules/paperwork/rogue.dm index a338908aa73..ad66c5cec38 100644 --- a/code/modules/paperwork/rogue.dm +++ b/code/modules/paperwork/rogue.dm @@ -564,6 +564,16 @@ ADD_TRAIT(user.mind, TRAIT_KNOW_KEEP_DOORS, "[type]") user.playsound_local(user, 'sound/misc/notice (2).ogg', 100, FALSE) +/obj/item/paper/scroll/rous_plans + name = "rous tunnel drawings" + desc = "Paper etched with the a winding mess of tunnels." + +/obj/item/paper/scroll/rous_plans/read(mob/user) + if(!user.mind) + return + to_chat(user, span_purple("These look like secret passages...")) + ADD_TRAIT(user.mind, TRAIT_KNOW_ROUS_DOORS, "[type]") + user.playsound_local(user, 'sound/misc/notice (2).ogg', 100, FALSE) /obj/item/paper/scroll/sold_manifest name = "shipping manifest" diff --git a/code/modules/surgery/organs/internal/tongue.dm b/code/modules/surgery/organs/internal/tongue.dm index 529818a121d..b19aab25776 100644 --- a/code/modules/surgery/organs/internal/tongue.dm +++ b/code/modules/surgery/organs/internal/tongue.dm @@ -19,6 +19,7 @@ /datum/language/celestial, /datum/language/hellspeak, /datum/language/beast, + /datum/language/rousman, /datum/language/thievescant, /datum/language/orcish, /datum/language/deepspeak, diff --git a/icons/language.dmi b/icons/language.dmi index c8e6dabcd0d..a42ada6850d 100644 Binary files a/icons/language.dmi and b/icons/language.dmi differ diff --git a/strings/accents/rousman_replacement.json b/strings/accents/rousman_replacement.json new file mode 100644 index 00000000000..6ddc3f9127e --- /dev/null +++ b/strings/accents/rousman_replacement.json @@ -0,0 +1,118 @@ +{ + "rous": { + "rous ": "little-kin ", + "rous!": "little-kin!", + "rous.": "little-kin.", + "rous?": "little-kin?", + "rousman": "kin-friend", + "rousmen": "kin-friends", + "whatever": "no-care", + "deadite": "rotty-thing", + "yes ": "yes-yes ", + "yes!": "yes-yes!", + "yes.": "yes-yes.", + "yes?": "yes-yes?", + "no ": "no-no ", + "no!": "no-no!", + "no.": "no-no.", + "no?": "no-no?", + "a ": [ "a ", + "|+-squeak-+| ", + "|+-hiss-+| ", + "|+-chirp-+| " + ], + "is ": [ "is ", + "|+-hiss-+| ", + "|+-grunt-+| ", + "|+-chirp-+| " + ], + "am ": [ "am ", + "|+-squeak-+| ", + "|+-grunt-+| ", + "|+-chirp-+| " + ], + "the ": [ "the ", + "|+-squeak-+| ", + "|+-hiss-+| ", + "|+-chirp-+| " + ], + "to ": [ "to ", + "|+-grunt-+| ", + "|+-hiss-+| ", + "|+-chirp-+| " + ], + "happen": "happen-has", + "choose": "pick-choose", + "quick": "hurry-fast", + "noise": "sound-noise", + "sound": "noise-sound", + "good ": "good-great ", + "house": "burrow", + "home": "burrow", + "manor": "big-burrow", + "clinic": "heal-place", + "church": "worship-place", + "merchant": "sell-place", + "scom": "speak-wall", + + "die": "kill-die", + "sword": "slashing-thing", + "axe": "chopping-thing", + "spear": "stabbing-thing", + "halberd": "chopping-stabbing-thing", + "mace": "bashing-thing", + "dagger": "short-stab", + "knife": "short-stab", + "fingers": "claws", + "pickaxe": "digging-thing", + "horc": "green-thing", + "orc": "green-thing", + "goblin": "green-thing", + "humen": "tall-one", + "humens": "tall-ones", + "dwarf": "brawny-thing", + "dwarves": "brawny-things", + "elf": "tall-thing", + "elves": "tall-things", + "kobold": "scale-thing", + "kobolds": "scale-things", + "halfling": "jolly-thing", + "drow": "scary-thing", + "triton": "fishy-thing", + "rakshari": "furless-thing", + "hollow-kin": "beast-thing", + "harpy": "bird-thing", + "medicator": "sick-thing", + "aasimar": "old-thing", + "automaton": "fake-thing", + + "king": "shiny-master", + "queen": "shiny-master", + "emperor": "shiny-master", + "empress": "shiny-master", + "monarch": "shiny-master", + "your majesty": "shiny-master", + + "zenny": "dim-shiny-coin", + "zennies": "dim-shiny-coins", + "ziliqua": "shiny-coin", + "ziliquae": "shiny-coins", + "zenar": "bright-shiny-coin", + "zenarii": "bright-shiny-coins", + "mammon": "shiny-coin", + "mammons": "shiny-coins", + "money": "shiny-coins", + "steward": "shiny-coin-hoarder", + + "mage": "seer", + "magician": "seer", + "wizard": "seer", + "inquisition": "kin-killers", + "inquisitor": "kin-killer", + "volf": "fur-beast", + "volves": "fur-beasts", + "vampire": "blood-eater", + "werevolf": "big-fur", + "werevolves": "big-furs" + } +} diff --git a/vanderlin.dme b/vanderlin.dme index d8678a3c278..e04ef8ae243 100644 --- a/vanderlin.dme +++ b/vanderlin.dme @@ -2973,12 +2973,10 @@ #include "code\modules\keybindings\setup.dm" #include "code\modules\language\aphasia.dm" #include "code\modules\language\beast.dm" -#include "code\modules\language\cat.dm" #include "code\modules\language\common.dm" #include "code\modules\language\deepspeak.dm" #include "code\modules\language\dwarf.dm" #include "code\modules\language\elf.dm" -#include "code\modules\language\fae.dm" #include "code\modules\language\halfspeak.dm" #include "code\modules\language\hellspeak.dm" #include "code\modules\language\language.dm" @@ -2987,6 +2985,7 @@ #include "code\modules\language\newpsydonic.dm" #include "code\modules\language\oldpsydonic.dm" #include "code\modules\language\orc.dm" +#include "code\modules\language\rousman.dm" #include "code\modules\language\sandspeak.dm" #include "code\modules\language\thieves_cant.dm" #include "code\modules\language\undead.dm"