From 6aff27e5b4eb4857306accd66c57f0754feb0a82 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Sun, 22 Feb 2026 18:30:44 +0000 Subject: [PATCH 1/6] rous neck items, language and door trait . --- code/__DEFINES/accents.dm | 2 + code/__DEFINES/traits/definitions.dm | 1 + .../jobs/job_types/garrison/royal_knight.dm | 2 + code/modules/language/cat.dm | 0 code/modules/language/fae.dm | 0 code/modules/language/rousman.dm | 23 ++++ .../mob/living/carbon/human/npc/rousman.dm | 51 ++++++-- .../mob/living/carbon/human/species.dm | 2 + .../carbon/human/voicepacks/other/rousman.dm | 8 +- .../modules/surgery/organs/internal/tongue.dm | 1 + icons/language.dmi | Bin 7259 -> 8950 bytes strings/accents/rousman_replacement.json | 116 ++++++++++++++++++ vanderlin.dme | 3 +- 13 files changed, 194 insertions(+), 15 deletions(-) delete mode 100644 code/modules/language/cat.dm delete mode 100644 code/modules/language/fae.dm create mode 100644 code/modules/language/rousman.dm create mode 100644 strings/accents/rousman_replacement.json 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 fd25a2dcb03..5b591748ad2 100644 --- a/code/__DEFINES/traits/definitions.dm +++ b/code/__DEFINES/traits/definitions.dm @@ -480,6 +480,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/modules/jobs/job_types/garrison/royal_knight.dm b/code/modules/jobs/job_types/garrison/royal_knight.dm index 25c6a82b518..ef485d7740c 100644 --- a/code/modules/jobs/job_types/garrison/royal_knight.dm +++ b/code/modules/jobs/job_types/garrison/royal_knight.dm @@ -157,6 +157,8 @@ ) var/helmetchoice = spawned.select_equippable(player_client, selectablehelmets, message = "Choose Your Helmet", title = "ROYAL KNIGHT") + if(!helmetchoice) + return /datum/job/advclass/royalknight/steam title = "Steam Knight" 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 40b272f66d8..74da779c670 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() @@ -497,16 +526,18 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) r_hand = /obj/item/weapon/polearm/woodstaff/seer var/list/spells = list( - /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/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_skillrank(/datum/skill/magic/blood, 2, TRUE) + H.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE) H.adjust_spell_points(17) H.generate_random_attunements(rand(4,6)) H.mana_pool.set_intrinsic_recharge(MANA_ALL_LEYLINES) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 620ae5571c6..27f73af6898 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/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 c8e6dabcd0df4d8cc483c847e3cf65d6125c3ff0..a42ada6850dc137d59eeeb7c0f1afb7f3442d195 100644 GIT binary patch literal 8950 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 diff --git a/strings/accents/rousman_replacement.json b/strings/accents/rousman_replacement.json new file mode 100644 index 00000000000..56ab2051a88 --- /dev/null +++ b/strings/accents/rousman_replacement.json @@ -0,0 +1,116 @@ +{ + "rous": { + "rous ": "little-kin ", + "rous!": "little-kin!", + "rous.": "little-kin.", + "rous?": "little-kin?", + "rousman": "kin-friend", + "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", + "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 49efac12df8..024241803d2 100644 --- a/vanderlin.dme +++ b/vanderlin.dme @@ -2971,12 +2971,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" @@ -2985,6 +2983,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" From 21305e2ee1eec658a8ee630a5bfe9763a90bda43 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Mon, 23 Feb 2026 03:43:55 +0000 Subject: [PATCH 2/6] more --- strings/accents/rousman_replacement.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/strings/accents/rousman_replacement.json b/strings/accents/rousman_replacement.json index 56ab2051a88..6ddc3f9127e 100644 --- a/strings/accents/rousman_replacement.json +++ b/strings/accents/rousman_replacement.json @@ -5,6 +5,7 @@ "rous.": "little-kin.", "rous?": "little-kin?", "rousman": "kin-friend", + "rousmen": "kin-friends", "whatever": "no-care", "deadite": "rotty-thing", "yes ": "yes-yes ", @@ -100,6 +101,7 @@ "zenarii": "bright-shiny-coins", "mammon": "shiny-coin", "mammons": "shiny-coins", + "money": "shiny-coins", "steward": "shiny-coin-hoarder", "mage": "seer", From 6f41e376aadb9ebd70ffbe59360e216c3a2083c9 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Tue, 24 Feb 2026 03:06:18 +0000 Subject: [PATCH 3/6] strong seer --- .../mob/living/carbon/human/npc/rousman.dm | 80 +++++++++++++++---- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/carbon/human/npc/rousman.dm b/code/modules/mob/living/carbon/human/npc/rousman.dm index 74da779c670..b3157f1f406 100644 --- a/code/modules/mob/living/carbon/human/npc/rousman.dm +++ b/code/modules/mob/living/carbon/human/npc/rousman.dm @@ -511,21 +511,69 @@ 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() + . = ..() + job = "Seer Rousman" + equipOutfit(new /datum/outfit/npc/rousman/seer_stronger) + +/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/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, @@ -535,12 +583,12 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) /datum/action/cooldown/spell/sundering_lightning, ) - H.adjust_skillrank(/datum/skill/magic/arcane, 5, TRUE) - H.adjust_skillrank(/datum/skill/magic/blood, 2, TRUE) - H.adjust_skillrank(/datum/skill/misc/reading, 2, 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) From 3334a6b2134c442f29856dfb2a43ed85bffdffdc Mon Sep 17 00:00:00 2001 From: forest2001 Date: Tue, 24 Feb 2026 03:16:02 +0000 Subject: [PATCH 4/6] x --- code/modules/mob/living/carbon/human/npc/rousman.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/npc/rousman.dm b/code/modules/mob/living/carbon/human/npc/rousman.dm index b3157f1f406..ff9da004374 100644 --- a/code/modules/mob/living/carbon/human/npc/rousman.dm +++ b/code/modules/mob/living/carbon/human/npc/rousman.dm @@ -514,10 +514,17 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) /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() +/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) ..() From 7b21121d7390f3bcc11b6815463eeae76927093d Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 25 Feb 2026 01:19:29 +0000 Subject: [PATCH 5/6] door makers --- code/game/objects/structures/hidden_doors.dm | 13 +++++++++++++ code/game/objects/structures/redstone.dm | 4 ++++ code/modules/paperwork/rogue.dm | 10 ++++++++++ 3 files changed, 27 insertions(+) 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/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" From e1a8ac53bf24a9c18b5e356026fb456492f3bed4 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 25 Feb 2026 01:23:15 +0000 Subject: [PATCH 6/6] fix --- code/modules/mob/living/carbon/human/npc/rousman.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/npc/rousman.dm b/code/modules/mob/living/carbon/human/npc/rousman.dm index 46573cefd58..cb828a21f7c 100644 --- a/code/modules/mob/living/carbon/human/npc/rousman.dm +++ b/code/modules/mob/living/carbon/human/npc/rousman.dm @@ -511,7 +511,7 @@ GLOBAL_LIST_EMPTY(rousman_ambush_objects) flee_in_pain = TRUE wander = TRUE -/mob/living/carbon/human/species/rousman/seer/stronger/with_ai +/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()