diff --git a/code/__DEFINES/ai/blackboard_defines.dm b/code/__DEFINES/ai/blackboard_defines.dm
index 49a8b290ba1..eb8194fcca8 100644
--- a/code/__DEFINES/ai/blackboard_defines.dm
+++ b/code/__DEFINES/ai/blackboard_defines.dm
@@ -244,3 +244,7 @@
#define BB_GOLIATH_TENTACLES "BB_GOLIATH_TENTACLES"
/// Key where goliath stores a hole it wants to get into
#define BB_GOLIATH_HOLE_TARGET "BB_GOLIATH_HOLE"
+
+// Nian Caterpillar Keys
+/// Key that stores the silk spin ability
+#define BB_NIAN_CATERPILLAR_SPIN_MOTHSILK_ACTION "BB_nian_caterpillar_spin_mothsilk_action"
diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm
index a7b1e63320e..0241148d29d 100644
--- a/code/game/machinery/vendors/departmental_vendors.dm
+++ b/code/game/machinery/vendors/departmental_vendors.dm
@@ -409,6 +409,8 @@
/obj/item/smithing_cast/component/lens_focus = 3,
/obj/item/smithing_cast/component/lens_frame = 3,
/obj/item/smithing_cast/component/trim = 3,
+ /obj/item/smithing_cast/component/knife_blade = 3,
+ /obj/item/smithing_cast/component/knife_handle = 3,
/obj/item/smithing_cast/misc/egun_parts = 3,
/obj/item/storage/bag/smith = 2,
/obj/item/storage/box/crewvend = 1)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e6dbcb1d7a7..456e98d94fd 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -475,6 +475,17 @@ GLOBAL_LIST_INIT(durathread_recipes, list (
pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
+/obj/item/stack/sheet/mothsilk
+ name = "mothsilk spool"
+ desc = "A spool of fresh mothsilk. Fine and light as air."
+ singular_name = "strand"
+ icon_state = "sheet-mothsilk"
+ icon = 'icons/obj/stacks/organic.dmi'
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/mothsilk
+
//////////////////////////////
// MARK: CARDBOARD
//////////////////////////////
diff --git a/code/modules/mob/living/basic/friendly/nian_caterpillar.dm b/code/modules/mob/living/basic/friendly/nian_caterpillar.dm
index e6c4f4eb778..36a951002ec 100644
--- a/code/modules/mob/living/basic/friendly/nian_caterpillar.dm
+++ b/code/modules/mob/living/basic/friendly/nian_caterpillar.dm
@@ -49,6 +49,7 @@
var/list/innate_actions = list(
/datum/action/innate/nian_caterpillar_emerge,
+ /datum/action/cooldown/mob_cooldown/spin_mothsilk = BB_NIAN_CATERPILLAR_SPIN_MOTHSILK_ACTION,
)
/// List of stuff that we want to eat
@@ -177,6 +178,28 @@
user.evolve(C, H)
addtimer(CALLBACK(src, PROC_REF(emerge), C), COCOON_EMERGE_DELAY, TIMER_UNIQUE)
+/// Place some grappling tentacles underfoot
+/datum/action/cooldown/mob_cooldown/spin_mothsilk
+ name = "Spin Mothsilk"
+ desc = "Spin some mothsilk, consuming nutrition."
+ button_icon = 'icons/obj/stacks/organic.dmi'
+ button_icon_state = "stack-mothsilk-2"
+ cooldown_time = 20 SECONDS
+ click_to_activate = FALSE
+ shared_cooldown = NONE
+
+/datum/action/cooldown/mob_cooldown/spin_mothsilk/Activate(atom/target)
+ if(owner.nutrition < 425)
+ to_chat(owner, "You don't have enough nutrition to spin silk!")
+ return FALSE
+ if(!do_after(owner, 3 SECONDS))
+ return FALSE
+ new /obj/item/stack/sheet/mothsilk(get_turf(owner))
+ owner.nutrition -= 15
+ owner.visible_message("[owner] spins some mothsilk!")
+ StartCooldown()
+ return TRUE
+
/datum/ai_controller/basic_controller/mothroach
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
@@ -190,6 +213,7 @@
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/moth_caterpillar,
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
+ /datum/ai_planning_subtree/spin_mothsilk,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/find_food/nian_caterpillar,
)
@@ -209,3 +233,22 @@
speech_chance = 2
emote_hear = list("flutters.", "chitters.", "chatters.")
emote_see = list("flutters.", "chitters.", "chatters.")
+
+/datum/ai_planning_subtree/spin_mothsilk
+ /// Key storing the mothsilk spin action
+ var/action_key = BB_NIAN_CATERPILLAR_SPIN_MOTHSILK_ACTION
+
+/datum/ai_planning_subtree/spin_mothsilk/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
+ var/mob/living/basic/nian_caterpillar/caterpillar = controller.pawn
+ var/datum/action/cooldown/mob_cooldown/spin_mothsilk/silk_action = controller.blackboard[action_key]
+ if(caterpillar.nutrition >= 425 && silk_action.IsAvailable())
+ controller.queue_behavior(/datum/ai_behavior/spin_mothsilk, action_key)
+ return SUBTREE_RETURN_FINISH_PLANNING
+
+/datum/ai_behavior/spin_mothsilk/perform(seconds_per_tick, datum/ai_controller/controller, action_key)
+ . = ..()
+ var/datum/action/cooldown/mob_cooldown/spin_mothsilk/silk_action = controller.blackboard[action_key]
+ var/result = silk_action.Trigger()
+ if(result)
+ return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED
+ return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
diff --git a/code/modules/smithing/components/knife_components.dm b/code/modules/smithing/components/knife_components.dm
new file mode 100644
index 00000000000..db618d0f5a2
--- /dev/null
+++ b/code/modules/smithing/components/knife_components.dm
@@ -0,0 +1,49 @@
+/obj/item/smithed_item/component/knife_blade
+ name = "Debug knife blade"
+ desc = ABSTRACT_TYPE_DESC
+ icon_state = "knife_blade"
+ part_type = PART_PRIMARY
+ hammer_time = 4
+
+/obj/item/smithed_item/component/knife_blade/utility
+ name = "utility knife blade"
+ desc = "Smithed component part of a utility knife. The blade has yet to be honed."
+ materials = list(MAT_METAL = 18000)
+ finished_product = /obj/item/kitchen/knife/smithed/utility
+
+/obj/item/smithed_item/component/knife_blade/throwing
+ name = "throwing knife blade"
+ desc = "Lightweight smithed component part of a knife. The shape is optimally balanced."
+ materials = list(MAT_METAL = 9000, MAT_TITANIUM = 9000)
+ finished_product = /obj/item/kitchen/knife/smithed/thrown
+
+/obj/item/smithed_item/component/knife_blade/combat
+ name = "combat knife blade"
+ desc = "Heavyweight smithed component part of a knife. A toothed edge runs across the top."
+ materials = list(MAT_TITANIUM = 9000, MAT_PLASMA = 9000)
+ finished_product = /obj/item/kitchen/knife/smithed/combat
+
+/obj/item/smithed_item/component/knife_handle
+ name = "Debug knife handle"
+ desc = ABSTRACT_TYPE_DESC
+ icon_state = "knife_handle"
+ part_type = PART_SECONDARY
+ hammer_time = 2
+
+/obj/item/smithed_item/component/knife_handle/utility
+ name = "utility knife handle"
+ desc = "Smithed component part of a utility knife. The handle fits comfortably in your hand."
+ materials = list(MAT_METAL = 6000)
+ finished_product = /obj/item/kitchen/knife/smithed/utility
+
+/obj/item/smithed_item/component/knife_handle/throwing
+ name = "throwing knife blade"
+ desc = "Lightweight smithed component part of a knife. There is a small ring on the end of the handle."
+ materials = list(MAT_METAL = 3000, MAT_TITANIUM = 3000)
+ finished_product = /obj/item/kitchen/knife/smithed/thrown
+
+/obj/item/smithed_item/component/knife_handle/combat
+ name = "combat knife blade"
+ desc = "Heavyweight smithed component part of a knife. The handle is thick and rugged."
+ materials = list(MAT_TITANIUM = 3000, MAT_PLASMA = 3000)
+ finished_product = /obj/item/kitchen/knife/smithed/combat
diff --git a/code/modules/smithing/machinery/kinetic_assembler.dm b/code/modules/smithing/machinery/kinetic_assembler.dm
index db7baf5d18a..b624599b46e 100644
--- a/code/modules/smithing/machinery/kinetic_assembler.dm
+++ b/code/modules/smithing/machinery/kinetic_assembler.dm
@@ -16,7 +16,7 @@
/// Trim component
var/obj/item/smithed_item/component/trim
/// Finished product
- var/obj/item/smithed_item/finished_product
+ var/obj/item/finished_product
/// Products that are produced in batches
var/list/batched_item_types = list(
/obj/item/smithed_item/lens,
@@ -230,10 +230,21 @@
for(var/datum/smith_quality/quality in quality_list)
if(quality.stat_mult < lowest.stat_mult)
lowest = quality
- finished_product.quality = lowest
- finished_product.material = trim.material
- finished_product.set_stats()
- finished_product.update_appearance(UPDATE_NAME)
+ if(istype(finished_product, /obj/item/smithed_item))
+ var/obj/item/smithed_item/product = finished_product
+ product.quality = lowest
+ product.material = trim.material
+ product.set_stats()
+ product.update_appearance(UPDATE_NAME)
+ finished_product = product
+ else if(istype(finished_product, /obj/item/kitchen/knife/smithed)) // We need to separate these because of their different paths
+ var/obj/item/kitchen/knife/smithed/product = finished_product
+ product.quality = lowest
+ product.material = trim.material
+ product.set_stats()
+ product.update_appearance(UPDATE_NAME)
+ product.update_icon(UPDATE_OVERLAYS)
+ finished_product = product
qdel(primary)
qdel(secondary)
qdel(trim)
@@ -256,12 +267,23 @@
if(is_type_in_typecache(finished_product, batched_item_types))
total_extras += clamp(round(batch_extras * i.bit_productivity_mod / 2), 1, 4)
for(var/iterator in 1 to total_extras)
- var/obj/item/smithed_item/extra_product = new finished_product.type(src.loc)
- extra_product.quality = finished_product.quality
- extra_product.material = finished_product.material
- extra_product.set_stats()
- extra_product.update_appearance(UPDATE_NAME)
- extra_product.scatter_atom()
+ var/obj/item/product
+ if(istype(finished_product, /obj/item/smithed_item))
+ var/obj/item/smithed_item/current_product = finished_product
+ var/obj/item/smithed_item/extra_product = new finished_product.type(src.loc)
+ extra_product.quality = current_product.quality
+ extra_product.material = current_product.material
+ extra_product.set_stats()
+ product = extra_product
+ else if(istype(finished_product, /obj/item/kitchen/knife/smithed)) // We need to separate these because of their different paths
+ var/obj/item/kitchen/knife/smithed/current_product = finished_product
+ var/obj/item/kitchen/knife/smithed/extra_product = new finished_product.type(src.loc)
+ extra_product.quality = current_product.quality
+ extra_product.material = current_product.material
+ extra_product.set_stats()
+ product = extra_product
+ product.update_appearance(UPDATE_NAME)
+ product.scatter_atom()
finished_product = null
diff --git a/code/modules/smithing/smith_datums.dm b/code/modules/smithing/smith_datums.dm
index 5c1d3ef937e..9e93e44c199 100644
--- a/code/modules/smithing/smith_datums.dm
+++ b/code/modules/smithing/smith_datums.dm
@@ -84,6 +84,12 @@
var/fire_rate_multiplier = 1.0
/// Multiplier for tool uses and lens uses.
var/durability_mult = 1.0
+ /// Force multiplier
+ var/force_mult = 1.0
+ /// Throw force multiplier
+ var/throw_force_mult = 1.0
+ /// Throw embed chance multiplier
+ var/embed_chance_mult = 1.0
/// Is this material valid for secondary goals?
var/secondary_goal_candidate = FALSE
/// How much is this secondary goal worth?
@@ -103,6 +109,9 @@
durability_mult = MINOR_MATERIAL_BUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_EASY
+ force_mult = MINOR_MATERIAL_DEBUFF
+ throw_force_mult = MINOR_MATERIAL_DEBUFF
+ embed_chance_mult = MINOR_MATERIAL_DEBUFF
color_tint = "#78787b"
/datum/smith_material/silver
@@ -116,6 +125,9 @@
projectile_damage_multiplier = MINOR_MATERIAL_DEBUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_MEDIUM
+ force_mult = MINOR_MATERIAL_DEBUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MINOR_MATERIAL_DEBUFF
color_tint = "#f0f0f0"
/datum/smith_material/gold
@@ -133,6 +145,9 @@
durability_mult = MINOR_MATERIAL_DEBUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_MEDIUM
+ force_mult = MINOR_MATERIAL_DEBUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MINOR_MATERIAL_DEBUFF
color_tint = "#ffd659"
/datum/smith_material/plasma
@@ -146,6 +161,9 @@
durability_mult = MINOR_MATERIAL_DEBUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_EASY
+ force_mult = MINOR_MATERIAL_BUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_DEBUFF
color_tint = "#ba3692"
/datum/smith_material/titanium
@@ -161,6 +179,9 @@
fire_rate_multiplier = MINOR_MATERIAL_DEBUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_EASY
+ force_mult = MINOR_MATERIAL_BUFF
+ throw_force_mult = MINOR_MATERIAL_DEBUFF
+ embed_chance_mult = MINOR_MATERIAL_BUFF
color_tint = "#c1c9cf"
/datum/smith_material/uranium
@@ -182,6 +203,9 @@
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_MEDIUM
color_tint = "#2c8c46"
+ force_mult = MAJOR_MATERIAL_BUFF
+ throw_force_mult = MAJOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_DEBUFF
/// Radioactive, woah
var/radiation_amount = 15
@@ -194,6 +218,9 @@
tool_failure_mult = MINOR_MATERIAL_DEBUFF
tool_productivity_mult = MAJOR_MATERIAL_BUFF
durability_mult = MAJOR_MATERIAL_BUFF
+ force_mult = MAJOR_MATERIAL_BUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_DEBUFF
color_tint = "#aef2f4"
/datum/smith_material/bluespace
@@ -208,6 +235,9 @@
tool_productivity_mult = MAJOR_MATERIAL_BUFF
power_draw_mult = MAJOR_MATERIAL_BUFF
projectile_damage_multiplier = MAJOR_MATERIAL_BUFF
+ force_mult = MAJOR_MATERIAL_DEBUFF
+ throw_force_mult = MAJOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_BUFF
color_tint = "#2e50b7"
/datum/smith_material/plasteel
@@ -226,6 +256,9 @@
durability_mult = MAJOR_MATERIAL_BUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_MEDIUM
+ force_mult = MAJOR_MATERIAL_BUFF
+ throw_force_mult = MAJOR_MATERIAL_DEBUFF
+ embed_chance_mult = MINOR_MATERIAL_DEBUFF
color_tint = "#555053"
/datum/smith_material/plastitanium
@@ -245,6 +278,9 @@
durability_mult = MAJOR_MATERIAL_BUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_HARD
+ force_mult = MAJOR_MATERIAL_BUFF
+ throw_force_mult = MAJOR_MATERIAL_DEBUFF
+ embed_chance_mult = MAJOR_MATERIAL_DEBUFF
color_tint = "#8a838a"
/datum/smith_material/iridium
@@ -262,6 +298,9 @@
power_draw_mult = MINOR_MATERIAL_BUFF
projectile_damage_multiplier = MINOR_MATERIAL_BUFF
durability_mult = MINOR_MATERIAL_BUFF
+ force_mult = MINOR_MATERIAL_BUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MINOR_MATERIAL_BUFF
color_tint = "#62c3cc"
/datum/smith_material/palladium
@@ -279,6 +318,9 @@
power_draw_mult = MINOR_MATERIAL_DEBUFF
projectile_damage_multiplier = MINOR_MATERIAL_DEBUFF
durability_mult = MINOR_MATERIAL_BUFF
+ force_mult = MINOR_MATERIAL_BUFF
+ throw_force_mult = MAJOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_BUFF
color_tint = "#d36717"
/datum/smith_material/platinum
@@ -296,6 +338,9 @@
projectile_damage_multiplier = MINOR_MATERIAL_BUFF
power_draw_mult = MINOR_MATERIAL_BUFF
durability_mult = MINOR_MATERIAL_BUFF
+ force_mult = MAJOR_MATERIAL_BUFF
+ throw_force_mult = MINOR_MATERIAL_BUFF
+ embed_chance_mult = MAJOR_MATERIAL_BUFF
color_tint = "#c7d3f9"
/datum/smith_material/brass
@@ -316,9 +361,74 @@
durability_mult = MINOR_MATERIAL_DEBUFF
secondary_goal_candidate = TRUE
secondary_goal_difficulty = SMITH_GOAL_MEDIUM
+ force_mult = MAJOR_MATERIAL_DEBUFF
+ throw_force_mult = MAJOR_MATERIAL_DEBUFF
+ embed_chance_mult = MAJOR_MATERIAL_BUFF
color_tint = "#97681b"
#undef MAJOR_MATERIAL_BUFF
#undef MINOR_MATERIAL_BUFF
#undef MINOR_MATERIAL_DEBUFF
#undef MAJOR_MATERIAL_DEBUFF
+
+// Wrappings
+
+/datum/handle_wrapping
+ var/name = "Boring Debug"
+ /// Wrap overlay icon
+ var/wrap_overlay = "basic_wrap"
+ /// Speed modifier
+ var/speed_mod = 0.0
+ /// Productivity mod
+ var/productivity_mod = 0
+ /// damage increase
+ var/force_increase = 0
+ /// throw damage increase
+ var/throw_force_increase = 0
+ /// throw embed chance increase
+ var/embed_chance_increase = 0
+ /// Is the wrapping conductive
+ var/conductive = FALSE
+
+/datum/handle_wrapping/cable
+ name = "cable wrapping"
+ wrap_overlay = "cable_wrap"
+ speed_mod = 0.1
+ productivity_mod = -0.1
+ force_increase = 1
+ conductive = TRUE
+
+/datum/handle_wrapping/cloth
+ name = "cloth wrapping"
+ wrap_overlay = "cloth_wrap"
+ speed_mod = 0.1
+ productivity_mod = 0.1
+
+/datum/handle_wrapping/leather
+ name = "leather wrapping"
+ wrap_overlay = "leather_wrap"
+ force_increase = 1
+ throw_force_increase = 1
+ embed_chance_increase = 5
+
+/datum/handle_wrapping/durathread
+ name = "durathread wrapping"
+ wrap_overlay = "durathread_wrap"
+ speed_mod = 0.15
+ productivity_mod = 0.15
+
+/datum/handle_wrapping/goliath_hide
+ name = "goliath hide wrapping"
+ wrap_overlay = "goliath_wrap"
+ force_increase = 1
+ throw_force_increase = 1
+ embed_chance_increase = 10
+
+/datum/handle_wrapping/mothsilk
+ name = "mothsilk wrapping"
+ wrap_overlay = "moth_wrap"
+ speed_mod = 0.2
+ productivity_mod = 0.2
+ force_increase = 1.5
+ throw_force_increase = 1.5
+ embed_chance_increase = 10
diff --git a/code/modules/smithing/smithed_items/knives.dm b/code/modules/smithing/smithed_items/knives.dm
new file mode 100644
index 00000000000..552d8af6dbd
--- /dev/null
+++ b/code/modules/smithing/smithed_items/knives.dm
@@ -0,0 +1,151 @@
+/obj/item/kitchen/knife/smithed
+ name = "debug smithed knife"
+ desc = ABSTRACT_TYPE_DESC
+ icon = 'icons/obj/smithing.dmi'
+ icon_state = "debug"
+ slot_flags = ITEM_SLOT_BELT
+
+ new_attack_chain = TRUE
+ /// The quality of the item
+ var/datum/smith_quality/quality
+ /// The material of the item
+ var/datum/smith_material/material
+ /// Base Speed modifier
+ var/base_speed_mod = 0
+ /// Speed modifier
+ var/speed_mod = 1.0
+ /// Base productivity modifier
+ var/base_productivity_mod = 0
+ /// Productivity mod
+ var/productivity_mod = 1.0
+ /// damage increase
+ var/force_increase = 0
+ /// throw damage increase
+ var/throw_force_increase = 0
+ /// throw embed chance increase
+ var/embed_chance_increase = 0
+ /// Handle wrappings
+ var/datum/handle_wrapping/wrap_type
+
+/obj/item/kitchen/knife/smithed/Initialize(mapload)
+ . = ..()
+ set_name()
+
+/obj/item/kitchen/knife/smithed/proc/set_name()
+ if(!quality)
+ return
+ if(!material)
+ name = "[quality.name] " + name
+ return
+ name = "[quality.name] [material.name] [initial(name)]"
+
+/obj/item/kitchen/knife/smithed/proc/set_stats()
+ speed_mod = 1 + (base_speed_mod * quality.stat_mult * material.tool_speed_mult)
+ productivity_mod = 1 + (base_productivity_mod * quality.stat_mult * material.tool_productivity_mult)
+ force_increase = initial(force_increase) * quality.stat_mult * material.force_mult
+ throw_force_increase = initial(throw_force_increase) * quality.stat_mult * material.throw_force_mult
+ embed_chance_increase = initial(embed_chance_increase) * quality.stat_mult * material.embed_chance_mult
+ // Now we adjust the item's actual stats
+ force = initial(force) + force_increase
+ throwforce = initial(throwforce) + throw_force_increase
+ embed_chance = initial(embed_chance) + embed_chance_increase
+ // We adjust bit productivity and similar stats here because they are one and the same
+ bit_productivity_mod = initial(bit_productivity_mod) * productivity_mod
+ toolspeed = initial(toolspeed) * speed_mod
+
+ // Color
+ color = material.color_tint
+ // Radioactive baby
+ if((material == /datum/smith_material/uranium || istype(material, /datum/smith_material/uranium)) && quality)
+ var/datum/component/inherent_radioactivity/radioactivity = AddComponent(/datum/component/inherent_radioactivity, 100 * quality.stat_mult, 0, 0, 1.5)
+ START_PROCESSING(SSradiation, radioactivity)
+
+/obj/item/kitchen/knife/smithed/update_overlays()
+ . = ..()
+ overlays.Cut()
+ if(!wrap_type)
+ . += "basic_wrap"
+ return
+ . += wrap_type.wrap_overlay
+
+/obj/item/kitchen/knife/smithed/update_name()
+ . = ..()
+ set_name()
+
+/obj/item/kitchen/knife/smithed/proc/attach_wrapping(datum/handle_wrapping/wrap)
+ force += wrap.force_increase
+ throwforce += wrap.throw_force_increase
+ toolspeed += wrap.speed_mod
+ bit_productivity_mod += wrap.productivity_mod
+ embed_chance += wrap.embed_chance_increase
+ wrap_type = wrap
+ update_icon(UPDATE_OVERLAYS)
+
+/obj/item/kitchen/knife/smithed/proc/remove_wrapping()
+ force -= wrap_type.force_increase
+ throwforce -= wrap_type.throw_force_increase
+ toolspeed -= wrap_type.speed_mod
+ bit_productivity_mod -= wrap_type.productivity_mod
+ embed_chance -= wrap_type.embed_chance_increase
+ wrap_type = null
+ update_icon(UPDATE_OVERLAYS)
+
+/obj/item/kitchen/knife/smithed/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ . = ..()
+ if(!isstack(used))
+ return ITEM_INTERACT_COMPLETE
+ var/obj/item/stack/stacked_item = used
+ if(wrap_type)
+ to_chat(user, "There is already a wrap on [src]!")
+ return ITEM_INTERACT_COMPLETE
+ var/wrap_to_attach
+ if(istype(stacked_item, /obj/item/stack/cable_coil))
+ wrap_to_attach = /datum/handle_wrapping/cable
+ if(istype(stacked_item, /obj/item/stack/sheet/cloth))
+ wrap_to_attach = /datum/handle_wrapping/cloth
+ if(istype(stacked_item, /obj/item/stack/sheet/durathread))
+ wrap_to_attach = /datum/handle_wrapping/durathread
+ if(istype(stacked_item, /obj/item/stack/sheet/leather))
+ wrap_to_attach = /datum/handle_wrapping/leather
+ if(istype(stacked_item, /obj/item/stack/sheet/animalhide/goliath_hide))
+ wrap_to_attach = /datum/handle_wrapping/goliath_hide
+ if(istype(stacked_item, /obj/item/stack/sheet/mothsilk))
+ wrap_to_attach = /datum/handle_wrapping/mothsilk
+ if(!wrap_to_attach)
+ to_chat(user, "You cannot wrap [stacked_item] around [src]!")
+ return ITEM_INTERACT_COMPLETE
+ if(do_after_once(user, 5 SECONDS, target = src))
+ if(stacked_item.use(5))
+ attach_wrapping(wrap_to_attach)
+ return ITEM_INTERACT_COMPLETE
+
+/obj/item/kitchen/knife/smithed/wirecutter_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(wrap_type)
+ to_chat(user, "You cut off the wrap on [src].")
+ remove_wrapping()
+
+/obj/item/kitchen/knife/smithed/utility
+ name = "utility knife"
+ desc = "A custom-made knife designed for general purpose use."
+ icon_state = "utility_knife"
+ base_speed_mod = 0.25
+ base_productivity_mod = 0.25
+
+/obj/item/kitchen/knife/smithed/thrown
+ name = "throwing knife"
+ desc = "A lightweight, balanced throwing knife. The sharp blade enhances the chance to embed."
+ icon_state = "throwing_knife"
+ base_speed_mod = -0.25
+ base_productivity_mod = -0.25
+ throw_force_increase = 6 // 16 throw force at standard, 22 throw force at masterwork
+ embed_chance_increase = 25 // +25% chance to embed at standard, +50% at masterwork
+
+/obj/item/kitchen/knife/smithed/combat
+ name = "combat knife"
+ desc = "A heavyweight, toothed-edge combat knife. The thick blade is designed to rip and tear, and it has an integrated bayonet mount."
+ icon_state = "combat_knife"
+ base_productivity_mod = -0.25
+ force_increase = 6 // 16 force at standard, 22 force at masterwork
+ embed_chance_increase = 5
+ bayonet = TRUE
diff --git a/code/modules/smithing/smithing_cast.dm b/code/modules/smithing/smithing_cast.dm
index 4456e68dd4f..dcc53a86d03 100644
--- a/code/modules/smithing/smithing_cast.dm
+++ b/code/modules/smithing/smithing_cast.dm
@@ -166,6 +166,20 @@
product_type = /obj/item/smithed_item/component/lens_focus
basin_state = "cast_focus"
+/obj/item/smithing_cast/component/knife_blade
+ name = "knife blade cast"
+ desc = "A cast for creating knife blades."
+ icon_state = "knife_blade_cast"
+ product_type = /obj/item/smithed_item/component/knife_blade
+ basin_state = "cast_knife_blade"
+
+/obj/item/smithing_cast/component/knife_handle
+ name = "knife handle cast"
+ desc = "A cast for creating knife handles."
+ icon_state = "knife_handle_cast"
+ product_type = /obj/item/smithed_item/component/knife_handle
+ basin_state = "cast_knife_handle"
+
/obj/item/smithing_cast/component/trim
name = "trim cast"
icon_state = "trim_cast"
diff --git a/icons/obj/machines/smithing_machines.dmi b/icons/obj/machines/smithing_machines.dmi
index 55452a70cbe..5aa23d313a7 100644
Binary files a/icons/obj/machines/smithing_machines.dmi and b/icons/obj/machines/smithing_machines.dmi differ
diff --git a/icons/obj/smithing.dmi b/icons/obj/smithing.dmi
index 9ad42d26bf7..b3336d72223 100644
Binary files a/icons/obj/smithing.dmi and b/icons/obj/smithing.dmi differ
diff --git a/icons/obj/stacks/organic.dmi b/icons/obj/stacks/organic.dmi
index 745da24390c..47306c90914 100644
Binary files a/icons/obj/stacks/organic.dmi and b/icons/obj/stacks/organic.dmi differ
diff --git a/paradise.dme b/paradise.dme
index b7d876dfd58..f080269edea 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -3164,6 +3164,7 @@
#include "code\modules\smithing\smith_machinery.dm"
#include "code\modules\smithing\smithing_cast.dm"
#include "code\modules\smithing\components\inserts_components.dm"
+#include "code\modules\smithing\components\knife_components.dm"
#include "code\modules\smithing\components\lens_components.dm"
#include "code\modules\smithing\components\tool_bits_components.dm"
#include "code\modules\smithing\components\trim.dm"
@@ -3174,6 +3175,7 @@
#include "code\modules\smithing\machinery\power_hammer.dm"
#include "code\modules\smithing\machinery\smart_hopper.dm"
#include "code\modules\smithing\smithed_items\inserts.dm"
+#include "code\modules\smithing\smithed_items\knives.dm"
#include "code\modules\smithing\smithed_items\lens.dm"
#include "code\modules\smithing\smithed_items\misc_smithed.dm"
#include "code\modules\smithing\smithed_items\tool_bits.dm"