Skip to content

Commit 69059c9

Browse files
authored
Subskillening: Adding Flavor to characters (#5649)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. --> ## About The Pull Request Adds in subskills to places I thought of, mainly cooking. With the new skill system we can have subskills that rely on parent stats for roles and provides boosted xp, this lets us have subskills without running into skill bloat issues. <!-- Describe The Pull Request. Please be sure every change is documented or this can delay review and even discourage maintainers from merging your PR! --> ## Why It's Good For The Game More flavor and potential for dedicated subclasses <!-- Argue for the merits of your changes and how they benefit the game, especially if they are controversial and/or far reaching. If you can't actually explain WHY what you are doing will improve the game, then it probably isn't good for the game in the first place. --> ## Changelog <!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. Please note that maintainers freely reserve the right to remove and add tags should they deem it appropriate. You can attempt to finagle the system all you want, but it's best to shoot for clear communication right off the bat. --> <!-- !! Do not add whitespace in-between the entries, do not change the tags and do not leave the tags without any entries. --> :cl: change:cooking now has subskills of it for various tasks like baking, prepping change: armor and weapon smithing now have children for repairing specifically balance: armor can now be repaired from broken balance: repaired broken armor incurs a max durability loss which can be restored by melding metal into it on the anvil /:cl: <!-- Both :cl:'s are required for the changelog to work! You can put your name to the right of the first :cl: if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. --> ## Pre-Merge Checklist <!-- Don't bother filling these in while creating your Pull Request, just click the checkboxes after the Pull Request is opened and you are redirected to the page. --> - [ ] You tested this on a local server. - [ ] This code did not runtime during testing. - [ ] You documented all of your changes. <!-- Neither the compiler nor workflow checks are perfect at detecting runtimes and errors. It is important to test your code/feature/fix locally. -->
1 parent b515c2c commit 69059c9

File tree

212 files changed

+4573
-3488
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

212 files changed

+4573
-3488
lines changed

code/__DEFINES/obj_flags.dm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#define SHRINK_ENCHANT (1<<13)
3535
#define ITEM_ONLY_BREAK (1<<14)
3636
#define HIGH_VALUE (1<<15)
37+
#define OBTAINED_DATA (1<<16)
3738

3839
// Flags for the clothing_flags var on /obj/item/clothing
3940

code/__DEFINES/skills.dm

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11

22
// Skills
33
#define SKILL_LEVEL_NONE 0
4-
#define SKILL_LEVEL_NOVICE 1 //basic
5-
#define SKILL_LEVEL_APPRENTICE 2 //novice
6-
#define SKILL_LEVEL_JOURNEYMAN 3 //skilled
7-
#define SKILL_LEVEL_EXPERT 4 //expert
8-
#define SKILL_LEVEL_MASTER 5 //master
9-
#define SKILL_LEVEL_LEGENDARY 6 //legendary
4+
#define SKILL_LEVEL_NOVICE 10 //basic
5+
#define SKILL_LEVEL_APPRENTICE 20 //novice
6+
#define SKILL_LEVEL_JOURNEYMAN 30 //skilled
7+
#define SKILL_LEVEL_EXPERT 40 //expert
8+
#define SKILL_LEVEL_MASTER 50 //master
9+
#define SKILL_LEVEL_LEGENDARY 60 //legendary
10+
11+
#define SKILL_RANK_NONE 0
12+
#define SKILL_RANK_NOVICE 1 //basic
13+
#define SKILL_RANK_APPRENTICE 2 //novice
14+
#define SKILL_RANK_JOURNEYMAN 3 //skilled
15+
#define SKILL_RANK_EXPERT 4 //expert
16+
#define SKILL_RANK_MASTER 5 //master
17+
#define SKILL_RANK_LEGENDARY 6 //legendary
1018

1119
#define SKILL_EXP_NONE 0
1220
#define SKILL_EXP_NOVICE 100

code/_onclick/hud/screen_objects.dm

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,7 @@
148148
var/mob/M = usr
149149
for(var/datum/recipe as anything in M.mind?.learned_recipes)
150150
book.types |= recipe.type
151-
book.generate_categories()
152-
usr << browse(book.generate_html(usr),"window=recipe;size=800x810")
151+
book.ui_interact(usr)
153152
return
154153
if(world.time < lastclick + 3 SECONDS)
155154
return

code/controllers/subsystem/atoms.dm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ SUBSYSTEM_DEF(atoms)
2020
initialized = INITIALIZATION_INNEW_MAPLOAD
2121
InitializeAtoms()
2222
initialized = INITIALIZATION_INNEW_REGULAR
23+
GLOB.obtained_from_reverse = build_obtained_from_reverse()
2324
return ..()
2425

2526
/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms)

code/datums/ai/subtrees/human_basic_attack.dm

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
if(!prob(HUMAN_NPC_INTENT_SWITCH_CHANCE))
120120
return
121121

122-
var/skill_level = SKILL_LEVEL_NONE
122+
var/skill_level = SKILL_RANK_NONE
123123
var/obj/item/held = pawn.get_active_held_item()
124124
if(held?.associated_skill)
125125
skill_level = GET_MOB_SKILL_VALUE_OLD(pawn, held.associated_skill)
@@ -137,7 +137,7 @@
137137
weighted[/datum/rmb_intent/swift] += 20
138138

139139
// Skilled fighters use strong more
140-
if(skill_level >= SKILL_LEVEL_JOURNEYMAN)
140+
if(skill_level >= SKILL_RANK_JOURNEYMAN)
141141
weighted[/datum/rmb_intent/strong] += 15
142142

143143
// Feint more against defenders
@@ -233,7 +233,7 @@
233233
skill_type = held.associated_skill
234234
break
235235

236-
var/skill_level = skill_type ? GET_MOB_SKILL_VALUE_OLD(pawn, skill_type) : SKILL_LEVEL_NONE
236+
var/skill_level = skill_type ? floor(GET_MOB_SKILL_VALUE_OLD(pawn, skill_type)) : SKILL_RANK_NONE
237237
var/armor_rating = bclass ? bclass_to_armor_rating(bclass) : "blunt"
238238

239239
var/list/wounded = list()
@@ -245,7 +245,7 @@
245245
continue
246246

247247
//requires trained eye AND good perception
248-
if(skill_level >= SKILL_LEVEL_JOURNEYMAN && GET_MOB_ATTRIBUTE_VALUE(pawn, STAT_PERCEPTION) >= 10)
248+
if(skill_level >= SKILL_RANK_JOURNEYMAN && GET_MOB_ATTRIBUTE_VALUE(pawn, STAT_PERCEPTION) >= 10)
249249
if(part.brute_dam > 20 || part.burn_dam > 20)
250250
wounded += part.body_zone
251251

@@ -255,7 +255,7 @@
255255
continue
256256

257257
// Basic+ fighters read armor and seek soft coverage for their damage type
258-
if(skill_level >= SKILL_LEVEL_NOVICE)
258+
if(skill_level >= SKILL_RANK_NOVICE)
259259
var/rating = worn.armor.getRating(armor_rating)
260260
if(rating < 25)
261261
soft += part.body_zone
@@ -271,7 +271,7 @@
271271
chosen = pick(exposed)
272272
else if(length(soft))
273273
chosen = pick(soft)
274-
else if(skill_level >= SKILL_LEVEL_EXPERT)
274+
else if(skill_level >= SKILL_RANK_EXPERT)
275275
// Expert fallback: just pick whatever zone has the lowest resistance for our damage type
276276
var/lowest_rating = INFINITY
277277
var/lowest_zone = null
@@ -295,19 +295,19 @@
295295
// since the fighter isn't scrambling to stay close
296296
var/cache_duration = HUMAN_NPC_WEAKPOINT_CACHE_DURATION
297297
switch(skill_level)
298-
if(SKILL_LEVEL_NONE)
298+
if(SKILL_RANK_NONE)
299299
cache_duration *= 0.1
300-
if(SKILL_LEVEL_NOVICE)
300+
if(SKILL_RANK_NOVICE)
301301
cache_duration *= 0.5
302-
if(SKILL_LEVEL_APPRENTICE)
302+
if(SKILL_RANK_APPRENTICE)
303303
cache_duration *= 0.75
304-
if(SKILL_LEVEL_JOURNEYMAN)
304+
if(SKILL_RANK_JOURNEYMAN)
305305
cache_duration *= 1.0
306-
if(SKILL_LEVEL_EXPERT)
306+
if(SKILL_RANK_EXPERT)
307307
cache_duration *= 1.5
308-
if(SKILL_LEVEL_MASTER)
308+
if(SKILL_RANK_MASTER)
309309
cache_duration *= 2.0
310-
if(SKILL_LEVEL_LEGENDARY)
310+
if(SKILL_RANK_LEGENDARY to INFINITY)
311311
cache_duration *= 3.0
312312

313313
// Reach bonus: each point of reach beyond 1 adds 10% duration

code/datums/attributes/__holder.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@
497497
if(!old_level)
498498
continue
499499
LAZYSET(skill_xp, skill_type, 0)
500-
apply_skill_level(skill_type, SKILL_LEVEL_NONE, old_level, silent)
500+
apply_skill_level(skill_type, SKILL_RANK_NONE, old_level, silent)
501501
if(!silent)
502502
to_chat(parent, span_boldwarning("I forget all my skills!"))
503503

@@ -511,7 +511,7 @@
511511
update_attributes()
512512

513513
SEND_SIGNAL(parent, COMSIG_SKILL_RANK_CHANGE, skill_type, new_level * 0.1, old_level * 0.1)
514-
SEND_SIGNAL(parent, COMSIG_SKILL_LEVEL_CHANGE, skill_type, new_level, old_level)
514+
SEND_SIGNAL(parent, COMSIG_SKILL_RANK_CHANGE, skill_type, new_level, old_level)
515515

516516
// Per-skill side-effects
517517
on_skill_level_changed(skill_type, new_level, old_level)

code/datums/attributes/_experience.dm

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ GLOBAL_VAR_INIT(sleep_experience_modifier, 1.0)
3434
var/progress = level / 10.0 // e.g. -5 gives -0.5
3535
return SKILL_XP_NONE + progress * SKILL_XP_NOVICE /// this prevents someone at massively negative levels from being fucked forever
3636
// Which tier does this level sit in, and how far into it are we?
37-
if(level >= SKILL_LEVEL_LEGENDARY * 10)
37+
if(level >= SKILL_LEVEL_LEGENDARY)
3838
return SKILL_XP_LEGENDARY
39-
if(level >= SKILL_LEVEL_MASTER * 10)
40-
var/progress = (level - SKILL_LEVEL_MASTER * 10) / 10.0
39+
if(level >= SKILL_LEVEL_MASTER)
40+
var/progress = (level - SKILL_LEVEL_MASTER) / 10.0
4141
return SKILL_XP_MASTER + progress * (SKILL_XP_LEGENDARY - SKILL_XP_MASTER)
42-
if(level >= SKILL_LEVEL_EXPERT * 10)
43-
var/progress = (level - SKILL_LEVEL_EXPERT * 10) / 10.0
42+
if(level >= SKILL_LEVEL_EXPERT)
43+
var/progress = (level - SKILL_LEVEL_EXPERT) / 10.0
4444
return SKILL_XP_EXPERT + progress * (SKILL_XP_MASTER - SKILL_XP_EXPERT)
45-
if(level >= SKILL_LEVEL_JOURNEYMAN * 10)
46-
var/progress = (level - SKILL_LEVEL_JOURNEYMAN * 10) / 10.0
45+
if(level >= SKILL_LEVEL_JOURNEYMAN)
46+
var/progress = (level - SKILL_LEVEL_JOURNEYMAN) / 10.0
4747
return SKILL_XP_JOURNEYMAN + progress * (SKILL_XP_EXPERT - SKILL_XP_JOURNEYMAN)
48-
if(level >= SKILL_LEVEL_APPRENTICE * 10)
49-
var/progress = (level - SKILL_LEVEL_APPRENTICE * 10) / 10.0
48+
if(level >= SKILL_LEVEL_APPRENTICE)
49+
var/progress = (level - SKILL_LEVEL_APPRENTICE) / 10.0
5050
return SKILL_XP_APPRENTICE + progress * (SKILL_XP_JOURNEYMAN - SKILL_XP_APPRENTICE)
51-
if(level >= SKILL_LEVEL_NOVICE * 10)
52-
var/progress = (level - SKILL_LEVEL_NOVICE * 10) / 10.0
51+
if(level >= SKILL_LEVEL_NOVICE)
52+
var/progress = (level - SKILL_LEVEL_NOVICE) / 10.0
5353
return SKILL_XP_NOVICE + progress * (SKILL_XP_APPRENTICE - SKILL_XP_NOVICE)
5454
// NONE tier (0-9)
5555
var/progress = level / 10.0
@@ -65,22 +65,22 @@ GLOBAL_VAR_INIT(sleep_experience_modifier, 1.0)
6565
var/progress = xp / SKILL_XP_NOVICE
6666
return floor(progress * 10)
6767
if(xp >= SKILL_XP_LEGENDARY)
68-
return SKILL_LEVEL_LEGENDARY * 10
68+
return SKILL_LEVEL_LEGENDARY
6969
if(xp >= SKILL_XP_MASTER)
7070
var/progress = (xp - SKILL_XP_MASTER) / (SKILL_XP_LEGENDARY - SKILL_XP_MASTER)
71-
return FLOOR(SKILL_LEVEL_MASTER * 10 + progress * 10, 1)
71+
return FLOOR(SKILL_LEVEL_MASTER + progress * 10, 1)
7272
if(xp >= SKILL_XP_EXPERT)
7373
var/progress = (xp - SKILL_XP_EXPERT) / (SKILL_XP_MASTER - SKILL_XP_EXPERT)
74-
return FLOOR(SKILL_LEVEL_EXPERT * 10 + progress * 10, 1)
74+
return FLOOR(SKILL_LEVEL_EXPERT + progress * 10, 1)
7575
if(xp >= SKILL_XP_JOURNEYMAN)
7676
var/progress = (xp - SKILL_XP_JOURNEYMAN) / (SKILL_XP_EXPERT - SKILL_XP_JOURNEYMAN)
77-
return FLOOR(SKILL_LEVEL_JOURNEYMAN * 10 + progress * 10, 1)
77+
return FLOOR(SKILL_LEVEL_JOURNEYMAN + progress * 10, 1)
7878
if(xp >= SKILL_XP_APPRENTICE)
7979
var/progress = (xp - SKILL_XP_APPRENTICE) / (SKILL_XP_JOURNEYMAN - SKILL_XP_APPRENTICE)
80-
return FLOOR(SKILL_LEVEL_APPRENTICE * 10 + progress * 10, 1)
80+
return FLOOR(SKILL_LEVEL_APPRENTICE + progress * 10, 1)
8181
if(xp >= SKILL_XP_NOVICE)
8282
var/progress = (xp - SKILL_XP_NOVICE) / (SKILL_XP_APPRENTICE - SKILL_XP_NOVICE)
83-
return FLOOR(SKILL_LEVEL_NOVICE * 10 + progress * 10, 1)
83+
return FLOOR(SKILL_LEVEL_NOVICE + progress * 10, 1)
8484
var/progress = xp / SKILL_XP_NOVICE
8585
return FLOOR(SKILL_LEVEL_NONE + progress * 10, 1)
8686

@@ -100,7 +100,7 @@ GLOBAL_VAR_INIT(sleep_experience_modifier, 1.0)
100100
* silent - if TRUE, suppresses level-up chat messages
101101
* check_apprentice - if TRUE, shares a portion of XP with any nearby apprentice
102102
*/
103-
/datum/attribute_holder/proc/adjust_experience(skill_type, amount, silent = FALSE, check_apprentice = TRUE, shared = TRUE)
103+
/datum/attribute_holder/proc/adjust_experience(skill_type, amount, silent = FALSE, check_apprentice = TRUE, shared = TRUE, daily_xp = TRUE)
104104
if(!ispath(skill_type, SKILL))
105105
return FALSE
106106
if(HAS_TRAIT(parent, TRAIT_NO_EXPERIENCE))
@@ -109,6 +109,12 @@ GLOBAL_VAR_INIT(sleep_experience_modifier, 1.0)
109109
if(shared)
110110
share_parent_skill_xp(skill_type, amount, silent)
111111

112+
if(daily_xp && parent.mind)
113+
if(!(skill_type in parent.mind?.sleep_adv?.daily_skill_xp))
114+
parent.mind?.sleep_adv?.daily_skill_xp |= skill_type
115+
parent.mind?.sleep_adv?.daily_skill_xp[skill_type] = 0
116+
parent.mind?.sleep_adv?.daily_skill_xp[skill_type] = nulltozero(parent.mind?.sleep_adv?.daily_skill_xp[skill_type]) + amount
117+
112118
// Apply global scalar and any per-mob multiplier
113119
amount *= GLOB.skill_xp_modifier
114120
amount *= get_skill_xp_multiplier(skill_type)

code/datums/attributes/attributes/skills/craft.dm

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,6 @@
1313
"...you feel grass under you feet as you peer onto a meadow, you prepare a campfire and a tent and drift off into deeper slumber.."
1414
)
1515

16-
/datum/attribute/skill/craft/weaponsmithing
17-
name = "Weaponsmithing"
18-
desc = "Represents your character's ability to craft metal weapons. The higher your skill in Weaponsmithing, the more complex weapons you can create, and the better the resulting quality, up to Masterwork."
19-
governing_attribute = STAT_STRENGTH
20-
default_attributes = list(
21-
/datum/attribute/skill/craft/blacksmithing = -5,
22-
)
23-
difficulty = SKILL_DIFFICULTY_HARD
24-
dreams = list(
25-
"...you gently grasp the tang of the blade. without water nor oil, you turn over to the basin, slicing your hand, and letting the blood fill the void... you quench the blade."
26-
)
27-
28-
/datum/attribute/skill/craft/armorsmithing
29-
name = "Armorsmithing"
30-
desc = "Represents your character's ability to craft metal armor. The higher your skill in Armorsmithing, the more complex armor you can create, and the better the resulting quality, up to Masterwork."
31-
governing_attribute = STAT_STRENGTH
32-
default_attributes = list(
33-
/datum/attribute/skill/craft/blacksmithing = -5,
34-
)
35-
difficulty = SKILL_DIFFICULTY_HARD
36-
dreams = list(
37-
"...you are assailed by a faceless adversary. he pummels you - crack, crack, crack... it hurts, you scream... he tires, you do not..."
38-
)
39-
40-
/datum/attribute/skill/craft/blacksmithing
41-
name = "Blacksmithing"
42-
desc = "Represents your character's ability to craft metal items. The higher your skill in Blacksmithing, the more complex items you can create, and the better the resulting quality, up to Masterwork."
43-
governing_attribute = STAT_STRENGTH
44-
default_attributes = list(
45-
STAT_STRENGTH = -5,
46-
STAT_INTELLIGENCE = -6,
47-
)
48-
difficulty = SKILL_DIFFICULTY_AVERAGE
49-
dreams = list(
50-
"...CLANG! Clang! Clang... you feel the weight of the hammer reverberate up your arm, past your shoulder, through your spine... the hits march to the drums of your heart. you feel attuned to the metal."
51-
)
52-
5316
/datum/attribute/skill/craft/smelting
5417
name = "Smelting"
5518
desc = "Represents your character's ability to smelt metal into ingots. The higher your skill in Smelting, the better the ingots you create, which affect the quality of the resulting item."
@@ -103,19 +66,6 @@
10366
"...you hear a quick snap in the distance... you rush over, and notice a small cabbit with a snare wrapped around its leg... you gently unsheath your knife, and loom over the poor, frightened thing..."
10467
)
10568

106-
/datum/attribute/skill/craft/cooking
107-
name = "Cooking"
108-
desc = "Represents your character's ability to cook food. The higher your skill in Cooking, the better the food you can cook and the more you can make with your ingredients."
109-
category = SKILL_CATEGORY_DOMESTIC
110-
governing_attribute = STAT_INTELLIGENCE
111-
default_attributes = list(
112-
STAT_INTELLIGENCE = -4,
113-
)
114-
difficulty = SKILL_DIFFICULTY_EASY
115-
dreams = list(
116-
"...you sit by the table in your dreary hovel, staring at the wooden bowl of soup given to you by your mother... you blink and look around the tavern, before your vision returns to the bowl... you feel comforted..."
117-
)
118-
11969
/datum/attribute/skill/craft/alchemy
12070
name = "Alchemy"
12171
desc = "Represents your character's ability to craft potions. The higher your skill in Alchemy, the better you can identify potions and ingredients."
@@ -149,28 +99,3 @@
14999
dreams = list(
150100
"...you pour the powder down the barrel of the cannon, and without a projectile to follow the dust, you cut off a finger, and toss it in there... you turn to light the fuse..."
151101
)
152-
153-
/datum/attribute/skill/craft/engineering
154-
name = "Engineering"
155-
desc = "Represents your character's ability to craft mechanical items. The higher your skill in Engineering, the more complex items you can create without failure."
156-
governing_attribute = STAT_INTELLIGENCE
157-
default_attributes = list(
158-
STAT_INTELLIGENCE = -7,
159-
)
160-
difficulty = SKILL_DIFFICULTY_VERY_HARD
161-
dreams = list(
162-
"...visions plague your mind. you toss and turn this nite. you see mechanical beasts gutting their masters with bare hands, fire raging acrost unknown streets... you grab a brick off the road and peer below into an infinite void... you inhale, and feel the steam burn your lungs..."
163-
)
164-
165-
/datum/attribute/skill/craft/tanning
166-
name = "Skincrafting"
167-
desc = "Represents your character's ability to process and use animal hide. The higher your skill in Skincrafting, the more leather you can create and the more you can make with it."
168-
governing_attribute = STAT_PERCEPTION
169-
default_attributes = list(
170-
STAT_PERCEPTION = -5,
171-
STAT_STRENGTH = -6,
172-
)
173-
difficulty = SKILL_DIFFICULTY_AVERAGE
174-
dreams = list(
175-
"...you stare down at the rabbit, its eyes wide and unblinking... you feel the knife in your hand, and the blood on your hands... and the warmth of the pelt..."
176-
)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/datum/attribute/skill/craft/blacksmithing
2+
name = "Blacksmithing"
3+
desc = "Represents your character's ability to craft metal items. The higher your skill in Blacksmithing, the more complex items you can create, and the better the resulting quality, up to Masterwork."
4+
governing_attribute = STAT_STRENGTH
5+
default_attributes = list(
6+
STAT_STRENGTH = -5,
7+
STAT_INTELLIGENCE = -6,
8+
)
9+
difficulty = SKILL_DIFFICULTY_AVERAGE
10+
dreams = list(
11+
"...CLANG! Clang! Clang... you feel the weight of the hammer reverberate up your arm, past your shoulder, through your spine... the hits march to the drums of your heart. you feel attuned to the metal."
12+
)
13+
14+
/datum/attribute/skill/craft/weaponsmithing
15+
name = "Weaponsmithing"
16+
desc = "Represents your character's ability to craft metal weapons. The higher your skill in Weaponsmithing, the more complex weapons you can create, and the better the resulting quality, up to Masterwork."
17+
governing_attribute = STAT_STRENGTH
18+
default_attributes = list(
19+
/datum/attribute/skill/craft/blacksmithing = -5,
20+
)
21+
difficulty = SKILL_DIFFICULTY_HARD
22+
dreams = list(
23+
"...you gently grasp the tang of the blade. without water nor oil, you turn over to the basin, slicing your hand, and letting the blood fill the void... you quench the blade."
24+
)
25+
26+
/datum/attribute/skill/craft/armorsmithing
27+
name = "Armorsmithing"
28+
desc = "Represents your character's ability to craft metal armor. The higher your skill in Armorsmithing, the more complex armor you can create, and the better the resulting quality, up to Masterwork."
29+
governing_attribute = STAT_STRENGTH
30+
default_attributes = list(
31+
/datum/attribute/skill/craft/blacksmithing = -5,
32+
)
33+
difficulty = SKILL_DIFFICULTY_HARD
34+
dreams = list(
35+
"...you are assailed by a faceless adversary. he pummels you - crack, crack, crack... it hurts, you scream... he tires, you do not..."
36+
)
37+
38+
/datum/attribute/skill/craft/weapon_repair
39+
name = "Weapon Repair"
40+
desc = "Represents your character's ability to maintain and restore damaged weapons. A skilled weapon repairman can re-edge a dulled blade, re-set a loose haft, and pull a weapon back from the brink of uselessness though restoring a truly ruined weapon to its former glory demands more than repair alone."
41+
governing_attribute = STAT_STRENGTH
42+
default_attributes = list(
43+
/datum/attribute/skill/craft/weaponsmithing = -8,
44+
)
45+
difficulty = SKILL_DIFFICULTY_AVERAGE
46+
dreams = list(
47+
"...you turn the blade over in your hands, tracing the notches along the edge with your thumb... each one tells you something... a hard parry, a bad angle, a desperate blow... you set it to the stone and begin to work them out one by one..."
48+
)
49+
shared_xp_percent = 0.5
50+
51+
/datum/attribute/skill/craft/armor_repair
52+
name = "Armor Repair"
53+
desc = "Represents your character's ability to maintain and restore damaged armor. Dented plates, burst rivets, torn mail a capable armorer can address all of it, returning protection to gear that has seen hard use. What cannot be repaired must be replaced, and knowing the difference is half the skill."
54+
governing_attribute = STAT_STRENGTH
55+
default_attributes = list(
56+
/datum/attribute/skill/craft/armorsmithing = -8,
57+
)
58+
difficulty = SKILL_DIFFICULTY_AVERAGE
59+
dreams = list(
60+
"...you run your hand across the breastplate, feeling every dent and crease beneath your palm... you think about the blow that made each one... you raise your hammer and begin to answer them in reverse..."
61+
)
62+
shared_xp_percent = 0.5

0 commit comments

Comments
 (0)