Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 3c777b6

Browse files
crafting skill requirements
1 parent 97151f7 commit 3c777b6

File tree

6 files changed

+113
-4
lines changed

6 files changed

+113
-4
lines changed

code/datums/components/crafting/antag.dm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@
4646
tool_behaviors = list(TOOL_WELDER, TOOL_WRENCH, TOOL_WIRECUTTER)
4747
time = 1.5 SECONDS
4848
category = CAT_WEAPON_RANGED
49-
always_available = FALSE // This was such a bad idea.
49+
skill_requirements = list(
50+
SKILL_MECHANICAL = EXP_MID,
51+
SKILL_TECHNICAL = EXP_HIGH,
52+
SKILL_SCIENCE = EXP_LOW,
53+
) // this is such a good idea
5054

5155
/datum/crafting_recipe/flamethrower
5256
name = "Flamethrower"
@@ -57,6 +61,10 @@
5761
parts = list(/obj/item/assembly/igniter = 1,
5862
/obj/item/weldingtool = 1)
5963
tool_behaviors = list(TOOL_SCREWDRIVER)
64+
skill_requirements = list(
65+
SKILL_MECHANICAL = EXP_LOW,
66+
SKILL_SCIENCE = EXP_LOW,
67+
)
6068
time = 1 SECONDS
6169
category = CAT_WEAPON_RANGED
6270

code/datums/components/crafting/crafting.dm

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,30 @@
148148

149149
return TRUE
150150

151+
/datum/component/personal_crafting/proc/check_skills(atom/source, datum/crafting_recipe/recipe)
152+
if(!recipe.skill_requirements?.len)
153+
return TRUE
154+
if(!ismob(source))
155+
return TRUE
156+
var/mob/user = source
157+
for(var/skill in recipe.skill_requirements)
158+
if(!user.skill_check(skill, recipe.skill_requirements[skill]))
159+
return FALSE
160+
return TRUE
161+
151162
/datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R)
152163
var/list/contents = get_surroundings(a, R.blacklist)
153164
var/send_feedback = 1
154165
if(!check_contents(a, R, contents))
155166
return ", missing component."
156167
if(!check_tools(a, R, contents))
157168
return ", missing tool."
169+
if(!check_skills(a, R))
170+
return ", inadequate skills."
158171
var/timer = R.time
159172
if(ismob(a))
160173
var/mob/mob = a
161-
if(mob && HAS_TRAIT(mob, TRAIT_CRAFTY))
162-
timer *= 0.75
174+
timer *= (10 - (mob.get_skill(SKILL_MECHANICAL) + HAS_TRAIT(mob, TRAIT_CRAFTY)*2)) / 10
163175
if(!do_after(a, timer, a))
164176
return "."
165177
contents = get_surroundings(a, R.blacklist) // Double checking since items could no longer be there after the do_after().
@@ -332,7 +344,7 @@
332344
for(var/datum/crafting_recipe/recipe as anything in (mode ? GLOB.cooking_recipes : GLOB.crafting_recipes))
333345
if(!is_recipe_available(recipe, user))
334346
continue
335-
if(check_contents(user, recipe, surroundings) && check_tools(user, recipe, surroundings))
347+
if(check_contents(user, recipe, surroundings) && check_tools(user, recipe, surroundings) && check_skills(user, recipe))
336348
craftability["[REF(recipe)]"] = TRUE
337349
if(display_craftable_only) // for debugging only
338350
craftability["[REF(recipe)]"] = TRUE
@@ -477,6 +489,15 @@
477489
var/id = atoms.Find(req_atom)
478490
data["reqs"]["[id]"] = recipe.reqs[req_atom]
479491

492+
// Skills
493+
if(recipe.skill_requirements?.len)
494+
data["skill_requirements"] = list()
495+
for(var/skill in recipe.skill_requirements)
496+
data["skill_requirements"] += list(list(
497+
"skill" = skill,
498+
"level" = recipe.skill_requirements[skill],
499+
))
500+
480501
return data
481502

482503
#undef COOKING

code/datums/components/crafting/recipes.dm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
var/always_available = TRUE
2828
/// Should only one object exist on the same turf?
2929
var/one_per_turf = FALSE
30+
/// What skill levels are required to craft this? ex. list(SKILL_MECHANICAL = EXP_HIGH, SKILL_SCIENCE = EXP_LOW)
31+
var/list/skill_requirements = list()
3032

3133
/datum/crafting_recipe/New()
3234
if(!(result in reqs))

code/datums/components/crafting/weapons.dm

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
reqs = list(/obj/item/gun = 1)
77
parts = list(/obj/item/gun = 1)
88
tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
9+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
910
time = 5 SECONDS
1011
category = CAT_MISC
1112

@@ -17,6 +18,10 @@
1718
/obj/item/assembly/igniter = 1,
1819
/obj/item/reagent_containers/food/drinks/soda_cans = 1)
1920
parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
21+
skill_requirements = list(
22+
SKILL_TECHNICAL = EXP_LOW,
23+
SKILL_SCIENCE = EXP_LOW,
24+
)
2025
time = 1.5 SECONDS
2126
category = CAT_WEAPON_RANGED
2227

@@ -27,6 +32,7 @@
2732
/obj/item/assembly/flash/handheld = 1,
2833
/obj/item/shield/riot = 1)
2934
blacklist = list(/obj/item/shield/riot/buckler, /obj/item/shield/riot/tele)
35+
skill_requirements = list(SKILL_TECHNICAL = EXP_LOW)
3036
time = 4 SECONDS
3137
category = CAT_WEAPON_MELEE
3238

@@ -45,6 +51,7 @@
4551
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
4652
/obj/item/stack/rods = 1,
4753
/obj/item/assembly/igniter = 1)
54+
skill_requirements = list(SKILL_TECHNICAL = EXP_LOW)
4855
time = 4 SECONDS
4956
category = CAT_WEAPON_MELEE
5057

@@ -55,6 +62,10 @@
5562
/obj/item/stack/rods = 1,
5663
/obj/item/assembly/igniter = 1,
5764
/obj/item/stack/ore/bluespace_crystal = 1)
65+
skill_requirements = list(
66+
SKILL_TECHNICAL = EXP_MID,
67+
SKILL_SCIENCE = EXP_LOW,
68+
)
5869
time = 4 SECONDS
5970
category = CAT_WEAPON_MELEE
6071

@@ -131,6 +142,7 @@
131142
reqs = list(/obj/item/pipe = 5,
132143
/obj/item/stack/sheet/plastic = 5,
133144
/obj/item/weaponcrafting/silkstring = 1)
145+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
134146
time = 9 SECONDS
135147
category = CAT_WEAPON_RANGED
136148

@@ -140,6 +152,7 @@
140152
reqs = list(/obj/item/pipe = 5,
141153
/obj/item/stack/tape = 3,
142154
/obj/item/stack/cable_coil = 10)
155+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
143156
time = 10 SECONDS
144157
category = CAT_WEAPON_RANGED
145158

@@ -149,6 +162,7 @@
149162
reqs = list(/obj/item/stack/sheet/mineral/wood = 8,
150163
/obj/item/stack/sheet/metal = 2,
151164
/obj/item/weaponcrafting/silkstring = 1)
165+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
152166
time = 7 SECONDS
153167
category = CAT_WEAPON_RANGED
154168

@@ -161,6 +175,7 @@
161175
/obj/item/weaponcrafting/receiver = 1,
162176
/obj/item/weaponcrafting/stock = 1)
163177
tool_behaviors = list(TOOL_SCREWDRIVER)
178+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
164179
time = 10 SECONDS
165180
category = CAT_WEAPON_RANGED
166181

@@ -172,6 +187,7 @@
172187
/obj/item/weaponcrafting/stock = 1,
173188
/obj/item/stack/packageWrap = 5)
174189
tool_behaviors = list(TOOL_SCREWDRIVER)
190+
skill_requirements = list(SKILL_MECHANICAL = EXP_MID)
175191
time = 10 SECONDS
176192
category = CAT_WEAPON_RANGED
177193

@@ -184,6 +200,11 @@
184200
/obj/item/stack/rods = 4,
185201
/obj/item/stack/cable_coil = 10)
186202
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WRENCH)
203+
skill_requirements = list(
204+
SKILL_MECHANICAL = EXP_LOW,
205+
SKILL_TECHNICAL = EXP_LOW,
206+
SKILL_SCIENCE = EXP_LOW,
207+
)
187208
result = /obj/item/gun/ballistic/gauss
188209
time = 12
189210
category = CAT_WEAPON_RANGED
@@ -195,6 +216,7 @@
195216
/obj/item/weaponcrafting/stock = 1,
196217
/obj/item/stack/packageWrap = 5)
197218
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WRENCH)
219+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
198220
result = /obj/item/gun/ballistic/maint_musket
199221
time = 10 SECONDS
200222
category = CAT_WEAPON_RANGED
@@ -206,6 +228,7 @@
206228
/obj/item/stack/sheet/plasteel = 3,
207229
/obj/item/stack/sheet/metal = 1)
208230
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WELDER)
231+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
209232
result = /obj/item/melee/sledgehammer
210233
time = 8 SECONDS
211234
category = CAT_WEAPON_MELEE
@@ -217,6 +240,7 @@
217240
/obj/item/stack/cable_coil = 3,
218241
/obj/item/stack/sheet/plasteel = 5)
219242
tool_behaviors = list(TOOL_WELDER)
243+
skill_requirements = list(SKILL_MECHANICAL = EXP_MID)
220244
time = 5 SECONDS
221245
category = CAT_WEAPON_MELEE
222246

@@ -245,6 +269,10 @@
245269
/obj/item/grenade/chem_grenade = 2
246270
)
247271
parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
272+
skill_requirements = list(
273+
SKILL_TECHNICAL = EXP_MID,
274+
SKILL_SCIENCE = EXP_MID,
275+
)
248276
time = 3 SECONDS
249277
category = CAT_MISC
250278

@@ -257,6 +285,10 @@
257285
/obj/item/grenade/chem_grenade = 2
258286
)
259287
parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
288+
skill_requirements = list(
289+
SKILL_TECHNICAL = EXP_MID,
290+
SKILL_SCIENCE = EXP_MID,
291+
)
260292
time = 5 SECONDS
261293
category = CAT_MISC
262294

@@ -333,6 +365,7 @@
333365
reqs = list(/obj/item/stack/sheet/metal = 4,
334366
/obj/item/stack/packageWrap = 8,
335367
/obj/item/pipe = 2)
368+
skill_requirements = list(SKILL_MECHANICAL = EXP_LOW)
336369
time = 5 SECONDS
337370
category = CAT_WEAPON_RANGED
338371

code/modules/asset_cache/assets/crafting.dm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
for(var/atom in GLOB.crafting_recipes_atoms)
88
add_atom_icon(atom, id++)
99
add_tool_icons()
10+
add_skill_icons()
1011

1112
/datum/asset/spritesheet/crafting/cooking
1213
name = "cooking"
@@ -49,3 +50,16 @@
4950

5051
for(var/tool in tool_icons)
5152
Insert(replacetext(tool, " ", ""), tool_icons[tool])
53+
54+
///Adds skill icons to the spritesheet
55+
/datum/asset/spritesheet/crafting/proc/add_skill_icons()
56+
var/list/skill_icons = list(
57+
SKILL_PHYSIOLOGY = icon('icons/obj/storage.dmi', "firstaid"),
58+
SKILL_MECHANICAL = icon('icons/obj/tools.dmi', "drill_bolt"),
59+
SKILL_TECHNICAL = icon('icons/obj/module.dmi', "bluespacearray"),
60+
SKILL_SCIENCE = icon('icons/obj/turrets.dmi', "mini_on", frame = 2),
61+
SKILL_FITNESS = icon('icons/obj/clothing/gloves.dmi', "boxing"),
62+
)
63+
64+
for(var/skill in skill_icons)
65+
Insert(replacetext(skill, " ", ""), skill_icons[skill])

tgui/packages/tgui/interfaces/PersonalCrafting.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,15 @@ type Recipe = {
100100
reqs: Atoms;
101101
tool_behaviors: string[];
102102
tool_paths: string[];
103+
skill_requirements: string[];
103104
foodtypes: string[];
104105
};
105106

107+
type Skill = {
108+
skill: string;
109+
level: number;
110+
};
111+
106112
type Diet = {
107113
liked_food: string[];
108114
disliked_food: string[];
@@ -707,6 +713,14 @@ const RecipeContent = ({ item, craftable, busy, mode, diet }, context) => {
707713
))}
708714
</Box>
709715
)}
716+
{(item.skill_requirements) && (
717+
<Box>
718+
<GroupTitle title="Skills" />
719+
{item.skill_requirements.map((skill_req, index) => (
720+
<SkillContent key={index} skill={skill_req.skill} level={skill_req.level} />
721+
))}
722+
</Box>
723+
)}
710724
</Box>
711725
</Stack.Item>
712726
<Stack.Item pl={1}>
@@ -797,6 +811,23 @@ const ToolContent = ({ tool }) => {
797811
) as any;
798812
};
799813

814+
const SkillContent = ({ skill, level }) => {
815+
return (
816+
<Box my={1}>
817+
<Box
818+
verticalAlign="middle"
819+
inline
820+
my={-1}
821+
mr={0.5}
822+
className={classes(['crafting32x32', skill.replace(/ /g, '')])}
823+
/>
824+
<Box inline verticalAlign="middle">
825+
{skill} {level}
826+
</Box>
827+
</Box>
828+
) as any;
829+
};
830+
800831
const GroupTitle = ({ title }) => {
801832
return (
802833
<Stack my={1}>

0 commit comments

Comments
 (0)