Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion code/__DEFINES/traits/definitions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CANNOT_BE_UNBUCKLED "cannot_be_unbuckled"
/// Prevents mob from riding mobs when buckled onto something
#define TRAIT_CANT_RIDE "cant_ride"

/// trait that prevents AI controllers from planning detached from ai_status to prevent weird state stuff.
#define TRAIT_AI_PAUSED "TRAIT_AI_PAUSED"
///trait that stops our ai controlled mob from moving at all due to ai planning
Expand Down Expand Up @@ -454,6 +453,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_RECOGNIZE_ADDICTS "Addict Recognition"
#define TRAIT_NOENERGY "Boundless Energy" //Specifically, You don't lose fatigue, but you do continue losing stamina.
#define TRAIT_KEENEARS "Keen Ears"
#define TRAIT_KEENEYES "Keen Eyes"
#define TRAIT_POISON_RESILIENCE "Poison Resilience"
#define TRAIT_SEED_FINDER "Seed Finder"
/// Cannot count coins
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"Endless Slumber" = TRAIT_TORPOR,
"Boundless Energy" = TRAIT_NOENERGY,
"Keen Ears" = TRAIT_KEENEARS,
"Keen Eyes" = TRAIT_KEENEYES,
"Poison Resilience" = TRAIT_POISON_RESILIENCE,
"Expert Forager" = TRAIT_FORAGER,
"Seed Finder" = TRAIT_SEED_FINDER,
Expand Down Expand Up @@ -331,6 +332,7 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_DUALWIELDER = span_info("I am trained in the art of dual wielding."),
TRAIT_NOENERGY = span_info("I don't need rest; I won't ever feel fatigue."),
TRAIT_KEENEARS = span_info("I've a good pair of ears, and can tell who is speaking, even when they're out of sight. I can also hear whispers from further away."),
TRAIT_KEENEYES = span_info("Years of hunting and tracking have honed your sight. You're better at noticing details and spotting hidden things."),
TRAIT_POISON_RESILIENCE = span_info("I'm more resilient to poisons."),
TRAIT_FORAGER = span_info("I can tell which jacksberries are poisonous."),
TRAIT_SEED_FINDER = span_info("I find seeds more easily."),
Expand Down
3 changes: 3 additions & 0 deletions code/datums/components/storage/storage_types.dm
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
else
I.icon_state += "-sheathed"

/datum/component/storage/concrete/scabbard/book/New(list/raw_args)
. = ..()
set_holdable(list(/obj/item/gun/ballistic/powder/wheellock/puffer))

/datum/component/storage/concrete/scabbard/knife/New(list/raw_args)
. = ..()
Expand Down
28 changes: 28 additions & 0 deletions code/game/objects/items/weapons/scabbard.dm
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,34 @@
sellprice = 100
item_weight = 120 GRAMS

/obj/item/weapon/scabbard/book
name = "Tome of Justice"
desc = "This seems to be a special edition.."
icon_state = "handtome"
force = DAMAGE_KNUCKLES - 7
throwforce = DAMAGE_KNUCKLES - 7
wdefense = MEDIOCRE_PARRY
wbalance = HARD_TO_DODGE
wlength = WLENGTH_SHORT
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_HIP
associated_skill = /datum/attribute/skill/combat/unarmed
sewrepair = /datum/attribute/skill/craft/tanning/patching
salvage_amount = 1
salvage_result = /obj/item/natural/hide/cured
dyeable = TRUE
sellprice = 0
experimental_onhip = FALSE

grid_width = 32
grid_height = 64
item_weight = 280 GRAMS

/obj/item/weapon/scabbard/book/apply_components()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob, slot_flags|ITEM_SLOT_HANDS)
AddComponent(/datum/component/storage/concrete/scabbard/book)

/obj/item/weapon/scabbard/sword
name = "scabbard"
desc = "A scabbard designed to hold a sword. The natural conclusion for those wishing to carry longblades."
Expand Down
13 changes: 13 additions & 0 deletions code/modules/clothing/armor/gambesson.dm
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,19 @@
detail_color = CLOTHING_ROYAL_PURPLE
misc_flags = CRAFTING_TEST_EXCLUDE

/obj/item/clothing/armor/gambeson/hunts
name = "hunting gambeson"
desc = "A thick, protective, rogueish looking gambeson, fashioned not for those looking to just look fancy- No, this is for a true hunter who knows exactly what they want, and how to get it, a hunter who knows what they need to protect them from stray thorns, and savage beasts."
sleeved = 'icons/roguetown/clothing/special/onmob/hand.dmi'
icon_state = "handhunt"
item_state = "handhunt"
armor = ARMOR_PADDED_GOOD
icon = 'icons/roguetown/clothing/special/hand.dmi'
mob_overlay_icon = 'icons/roguetown/clothing/special/onmob/hand.dmi'
icon = 'icons/roguetown/clothing/special/hand.dmi'
mob_overlay_icon = 'icons/roguetown/clothing/special/onmob/hand.dmi'
Comment thread
Spitegremlin marked this conversation as resolved.
detail_tag = "_detail"

//................ Padded Dress ............... //
/obj/item/clothing/armor/gambeson/heavy/dress
name = "padded dress"
Expand Down
12 changes: 10 additions & 2 deletions code/modules/crafting/quality_of_crafting/leatherworking.dm
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@
craftdiff = 4

/datum/repeatable_crafting_recipe/leather/standalone/hunterboots
name = "hunter boots"
name = "hunting boots"
output = /obj/item/clothing/shoes/boots/hunter
requirements = list(/obj/item/natural/hide/cured = 2,
/obj/item/natural/fur = 1,
Expand Down Expand Up @@ -910,6 +910,14 @@
/obj/item/natural/fibers = 1)
craftdiff = 4

/datum/repeatable_crafting_recipe/leather/standalone/huntergamb
name = "hunting gambeson"
output = /obj/item/clothing/armor/gambeson/hunts
requirements = list(/obj/item/natural/hide/cured = 2,
/obj/item/natural/fibers/sinew = 1,
/obj/item/clothing/armor/gambeson)
craftdiff = 4

/datum/repeatable_crafting_recipe/leather/standalone/gloves
name = "hardened leather gloves"
output = /obj/item/clothing/gloves/leather/advanced
Expand Down Expand Up @@ -1031,7 +1039,7 @@
craftdiff = 5

/datum/repeatable_crafting_recipe/leather/standalone/hunterboots/masterwork
name = "masterwork hunter boots"
name = "masterwork hunting boots"
output = /obj/item/clothing/shoes/boots/hunter/masterwork
attacked_atom = /obj/item/clothing/shoes/boots/hunter
requirements = list(/obj/item/clothing/shoes/boots/hunter = 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@
attribute_sheet_old = /datum/attribute_holder/sheet/job/pilgrim/hunter/old
attribute_sheet = /datum/attribute_holder/sheet/job/pilgrim/hunter

traits = list(
TRAIT_KEENEYES,
TRAIT_FORAGER
)

Comment on lines +59 to +63
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Also undocumented in changelog.

Copy link
Copy Markdown
Author

@Spitegremlin Spitegremlin May 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

quirk was literally made for hunters yet its a costly quirk for a relatively minor effect so its not worth taking over other quirks, and says its for people that hunt in the flavor text, yet they dont get it, since I made it a trait and gave it to Huntsmaster i decided that normal hunter should get the hunter trait as well

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also, normal hunter gets FORAGER, yet pilgrim didnt, so i fixed that

/datum/outfit/pilgrim/hunter
name = "Hunter (Pilgrim)"
pants = /obj/item/clothing/pants/tights/colored/random
Expand Down
140 changes: 135 additions & 5 deletions code/modules/jobs/job_types/nobility/hand.dm
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
/datum/outfit/hand
name = JOB_HAND
belt = /obj/item/storage/belt/leather/black
beltr = /obj/item/storage/keyring/hand
neck = /obj/item/storage/keyring/hand


/datum/job/hand/after_spawn(mob/living/carbon/human/spawned, client/player_client)
Expand Down Expand Up @@ -92,7 +92,8 @@

/datum/job/advclass/hand/hand
title = JOB_HAND
tutorial = "You have played blademaster and strategist to the Noble-Family for so long that you are a master tactician, something you exploit with potent conviction. Let no man ever forget whose ear you whisper into. You've killed more men with swords than any spymaster could ever claim to."
tutorial = "You have played blademaster and strategist to the Noble-Family for so long that you are a master tactician, something you exploit with potent conviction. \
Let no man ever forget whose ear you whisper into. You've killed more men with swords than any spymaster could ever claim to."
outfit = /datum/outfit/hand/handclassic
category_tags = list(CTAG_HAND)
cmode_music = 'sound/music/cmode/nobility/combat_noble.ogg'
Expand Down Expand Up @@ -157,7 +158,8 @@

traits = list(
TRAIT_MEDIUMARMOR,
TRAIT_DODGEEXPERT
TRAIT_DODGEEXPERT,
TRAIT_FLIP_JUMP
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Also undocumented in changelog.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was because of what a admin asked me to do, kinda forgot about it, but it only lets them flip jump

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I asked them to include flip jump for flavor.

)

/datum/outfit/hand/spymaster
Expand Down Expand Up @@ -191,8 +193,9 @@
)
raw_attribute_list = list(
STAT_INTELLIGENCE = 4,
STAT_PERCEPTION = 3,
STAT_PERCEPTION = 4,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changelog.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once again, forgot about it, just bringing everything to a baseline of 8

/datum/attribute/skill/combat/crossbows = 30,
/datum/attribute/skill/combat/firearms = 40,
/datum/attribute/skill/combat/swords = 20,
/datum/attribute/skill/misc/swimming = 30,
/datum/attribute/skill/misc/climbing = 30,
Expand All @@ -209,7 +212,7 @@
/datum/attribute_holder/sheet/job/advisor/old
raw_attribute_list = list(
STAT_INTELLIGENCE = 5,
STAT_PERCEPTION = 4,
STAT_PERCEPTION = 5,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Also undocumented in changelog.

Copy link
Copy Markdown
Author

@Spitegremlin Spitegremlin May 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was told to bring all the hand stats to 8, since the default hand gets 8 yet the others didnt get 8

STAT_SPEED = -1,
STAT_STRENGTH = -1,
/datum/attribute/skill/combat/crossbows = 30,
Expand Down Expand Up @@ -245,6 +248,8 @@
shirt = /obj/item/clothing/shirt/undershirt/fancy
backr = /obj/item/storage/backpack/satchel/black
backpack_contents = list(
/obj/item/weapon/scabbard/book,
scabbards = list(/obj/item/gun/ballistic/powder/wheellock/puffer/preloaded),
/obj/item/weapon/knife/dagger/steel = 1,
/obj/item/reagent_containers/glass/bottle/poison = 1,
/obj/item/paper/scroll/frumentarii/roundstart = 1
Expand All @@ -254,3 +259,128 @@
shoes = /obj/item/clothing/shoes/boots
beltl = /obj/item/weapon/sword/rapier/caneblade/hand
scabbards = list(/obj/item/weapon/scabbard/cane/hand)

/datum/attribute_holder/sheet/job/huntsmaster
attribute_variance = list(
STAT_CONSTITUTION = list(0, 1)
)
raw_attribute_list = list(
STAT_ENDURANCE = 3,
STAT_PERCEPTION = 3,
STAT_SPEED = 2,
/datum/attribute/skill/combat/crossbows = 30,
/datum/attribute/skill/combat/bows = 40,
/datum/attribute/skill/combat/firearms = 20,
/datum/attribute/skill/combat/unarmed = 35,
/datum/attribute/skill/combat/swords = 20,
/datum/attribute/skill/combat/knives = 30,
/datum/attribute/skill/misc/swimming = 40,
/datum/attribute/skill/misc/climbing = 40,
/datum/attribute/skill/misc/athletics = 40,
/datum/attribute/skill/combat/wrestling = 30,
/datum/attribute/skill/misc/reading = 20,
/datum/attribute/skill/misc/riding = 40,
/datum/attribute/skill/labor/taming = 40,
/datum/attribute/skill/misc/medicine = 20,
/datum/attribute/skill/misc/sneaking = 45,
/datum/attribute/skill/labor/butchering = 30,
/datum/attribute/skill/craft/tanning = 35,
/datum/attribute/skill/misc/sewing = 15,
/datum/attribute/skill/craft/traps = 40,
/datum/attribute/skill/craft/crafting = 30,
/datum/attribute/skill/labor/mathematics = 30
)

/datum/attribute_holder/sheet/job/huntsmaster/old
raw_attribute_list = list(
STAT_ENDURANCE = 4,
STAT_PERCEPTION = 2,
STAT_INTELLIGENCE = 2,
STAT_CONSTITUTION = 2,
STAT_SPEED = -1,
STAT_STRENGTH = -1,
/datum/attribute/skill/combat/crossbows = 40,
/datum/attribute/skill/combat/bows = 50,
/datum/attribute/skill/combat/firearms = 20,
/datum/attribute/skill/combat/unarmed = 40,
/datum/attribute/skill/combat/swords = 30,
/datum/attribute/skill/combat/knives = 30,
/datum/attribute/skill/misc/swimming = 40,
/datum/attribute/skill/misc/climbing = 40,
/datum/attribute/skill/misc/athletics = 40,
/datum/attribute/skill/combat/wrestling = 30,
/datum/attribute/skill/misc/reading = 30,
/datum/attribute/skill/misc/riding = 50,
/datum/attribute/skill/labor/taming = 50,
/datum/attribute/skill/misc/medicine = 30,
/datum/attribute/skill/misc/sneaking = 50,
/datum/attribute/skill/labor/butchering = 40,
/datum/attribute/skill/craft/tanning = 50,
/datum/attribute/skill/misc/sewing = 25,
/datum/attribute/skill/craft/traps = 50,
/datum/attribute/skill/craft/crafting = 40,
/datum/attribute/skill/labor/mathematics = 30
)

/datum/job/advclass/hand/huntsmaster
title = "Huntsmaster"
tutorial = " A hunter of the crown, you have tracked more living beings through the Wild than you can remember; \
a loyal hound by your side, a powerful saiga underneath. You've learnt the rules of the hunt are no different from the court, just simpifed, primal. \
The strong survive, the weak die. So, loose your bow over these lands, and let no man, no beast, and no demons think themselves safe from your arrows. \
Your agents by your side, you will rid this town of ruffians, rooting out would-be's like one does with a lowly cabbit. \
Let the world remember you, the Huntsmaster, as a true slayer of beast, monster, and man."
outfit = /datum/outfit/hand/huntsmaster
category_tags = list(CTAG_HAND)
cmode_music = 'sound/music/cmode/nobility/combat_noble.ogg'
exp_types_granted = list(EXP_TYPE_NOBLE)

attribute_sheet = /datum/attribute_holder/sheet/job/huntsmaster
attribute_sheet_old = /datum/attribute_holder/sheet/job/huntsmaster/old
honorary = "Huntsmaster"

traits = list(
TRAIT_KEENEYES,
TRAIT_LIGHT_STEP,
TRAIT_FORAGER
)

/datum/outfit/hand/huntsmaster
name = "Huntsmaster (Hand)"
head = /obj/item/clothing/head/roguehood/leather
shirt = /obj/item/clothing/armor/gambeson/hunts
backl = /obj/item/gun/ballistic/bow/long
backr = /obj/item/storage/backpack/satchel
wrists = /obj/item/clothing/wrists/bracers/leather
backpack_contents = list(
/obj/item/weapon/knife/dagger/steel = 1,
/obj/item/reagent_containers/glass/bottle/poison = 1,
/obj/item/paper/scroll/frumentarii/roundstart = 1,
/obj/item/flint = 1,
/obj/item/bait = 1,
/obj/item/flashlight/flare/torch/lantern/bronzelamptern = 1
)
armor = /obj/item/clothing/armor/leather/jerkin/belted/long
pants = /obj/item/clothing/pants/trou/leathertights
shoes = /obj/item/clothing/shoes/boots/hunter
beltl = /obj/item/ammo_holder/quiver/arrows
beltr = /obj/item/weapon/sword/rapier/dec
scabbards = list(/obj/item/weapon/scabbard/sword/royal)

/datum/job/advclass/hand/huntsmaster/after_spawn(mob/living/carbon/human/H)
. = ..()

if(!get_turf(H))
addtimer(CALLBACK(src, PROC_REF(after_spawn), H), 0.5 SECONDS)
return

if(!ishuman(H))
return

var/mob/living/simple_animal/hostile/retaliate/hound/pet = new(get_turf(H))

if(!pet)
return

if(pet)
pet.tamed(H)
ADD_TRAIT(pet, TRAIT_CRITICAL_RESISTANCE, "huntsmaster_hound")
1 change: 1 addition & 0 deletions code/modules/jobs/job_types/peasants/hunter.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
attribute_sheet_old = /datum/attribute_holder/sheet/job/hunter/old

traits = list(
TRAIT_KEENEYES,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Also undocumented in changelog.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Giving hunter keeneyes because it was made for hunters

TRAIT_FORAGER
)

Expand Down
2 changes: 2 additions & 0 deletions code/modules/mob/living/living.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2529,6 +2529,8 @@
var/looktime = 5 SECONDS - (GET_MOB_ATTRIBUTE_VALUE(src, STAT_PERCEPTION) * 2)
if(has_quirk(/datum/quirk/boon/keen_eye))
looktime *= 0.25
if(HAS_TRAIT(src, TRAIT_KEENEYES))
looktime *= 0.25
Comment on lines +2532 to +2533
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changelog

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

making a quirk have a trait verison

if(do_after(src, looktime))
// var/huhsneak
SEND_GLOBAL_SIGNAL(COMSIG_MOB_ACTIVE_PERCEPTION, src)
Expand Down
Loading
Loading