diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm
index 2a24c0b451..8c02d96dec 100644
--- a/code/datums/components/crafting/recipes/recipes_clothing.dm
+++ b/code/datums/components/crafting/recipes/recipes_clothing.dm
@@ -263,6 +263,16 @@
time = 30
category = CAT_CLOTHING
+/datum/crafting_recipe/twinsheath
+ name = "Twin Sword Sheath"
+ result = /obj/item/storage/belt/sabre/twin
+ reqs = list(/obj/item/stack/sheet/wood = 3,
+ /obj/item/stack/sheet/leather = 8)
+ tools = list(TOOL_WIRECUTTER)
+ time = 70
+ category = CAT_CLOTHING
+
+
/datum/crafting_recipe/durathread_reinforcement_kit
name = "Durathread Reinforcement Kit"
result = /obj/item/armorkit
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 3c554aa58e..76f87adc6a 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -492,7 +492,7 @@
icon_state = "grenadebeltnew"
item_state = "security"
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
-
+
/obj/item/storage/belt/grenade/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
@@ -815,3 +815,18 @@
attack_verb = list("bashed", "slashes", "prods", "pokes")
fitting_swords = list(/obj/item/melee/rapier)
starting_sword = /obj/item/melee/rapier
+
+/obj/item/storage/belt/sabre/twin
+ name = "twin sheath"
+ desc = "Two sheaths. One is capable of holding a katana (or bokken) and the other a wakizashi. You could put two wakizashis in if you really wanted to. Now you can really roleplay as a samurai."
+ icon_state = "twinsheath"
+ item_state = "quiver" //this'll do.
+ w_class = WEIGHT_CLASS_BULKY
+ var/list/fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken)
+ starting_sword = null
+
+/obj/item/storage/belt/sabre/twin/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 2
+ STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki.
diff --git a/code/modules/smithing/anvil.dm b/code/modules/smithing/anvil.dm
index 9bec834e29..c0f951879d 100644
--- a/code/modules/smithing/anvil.dm
+++ b/code/modules/smithing/anvil.dm
@@ -7,12 +7,13 @@
#define RECIPE_LARGEPICK "ddbp" //draw draw bend punch
#define RECIPE_SHOVEL "dfup" //draw fold upset punch
#define RECIPE_HAMMER "sfp" //shrink fold punch
-#define RECIPE_AXE "ufp" //upset fold punch
#define RECIPE_SMALLKNIFE "sdd" //shrink draw draw
#define RECIPE_SHORTSWORD "dff" //draw fold fold
+#define RECIPE_SCIMITAR "dfb" //draw fold bend
#define RECIPE_BROADSWORD "dfufd" //draw fold upset fold draw
+#define RECIPE_ZWEIHANDER "udfsf" //upset draw fold shrink fold
#define RECIPE_KATANA "fffff" //fold fold fold fold fold
@@ -23,6 +24,7 @@
#define RECIPE_JAVELIN "dbf" //draw bend fold
#define RECIPE_HALBERD "duffp" //draw upset fold fold punch
#define RECIPE_GLAIVE "usfp" //upset shrink fold punch
+#define RECIPE_PIKE "ddbf" //draw draw bend fold
/obj/structure/anvil
name = "anvil"
@@ -39,8 +41,7 @@
var/outrightfailchance = 1 //todo: document this shit
var/stepsdone = ""
var/rng = FALSE
- var/list/smithrecipes = list(RECIPE_AXE = /obj/item/smithing/axehead,
- RECIPE_HAMMER = /obj/item/smithing/hammerhead,
+ var/list/smithrecipes = list(RECIPE_HAMMER = /obj/item/smithing/hammerhead,
RECIPE_SCYTHE = /obj/item/smithing/scytheblade,
RECIPE_SHOVEL = /obj/item/smithing/shovelhead,
RECIPE_COGHEAD = /obj/item/smithing/cogheadclubhead,
@@ -48,11 +49,14 @@
RECIPE_LARGEPICK = /obj/item/smithing/pickaxehead,
RECIPE_SMALLPICK = /obj/item/smithing/prospectingpickhead,
RECIPE_SHORTSWORD = /obj/item/smithing/shortswordblade,
+ RECIPE_SCIMITAR = /obj/item/smithing/scimitarblade,
RECIPE_SMALLKNIFE = /obj/item/smithing/knifeblade,
RECIPE_BROADSWORD = /obj/item/smithing/broadblade,
+ RECIPE_ZWEIHANDER = /obj/item/smithing/zweiblade,
+ RECIPE_KATANA = /obj/item/smithing/katanablade,
RECIPE_HALBERD = /obj/item/smithing/halberdhead,
RECIPE_GLAIVE = /obj/item/smithing/glaivehead,
- RECIPE_KATANA = /obj/item/smithing/katanablade)
+ RECIPE_PIKE = /obj/item/smithing/pikehead)
/obj/structure/anvil/Initialize()
..()
@@ -172,7 +176,6 @@
/obj/structure/anvil/debugsuper
name = "super ultra epic anvil of debugging."
desc = "WOW. A DEBUG ITEM STRUCTURE. EPIC."
- icon = 'icons/obj/smith.dmi'
icon_state = "anvil"
anvilquality = 10
outrightfailchance = 0
@@ -180,8 +183,6 @@
/obj/structure/anvil/obtainable
name = "anvil"
desc = "Base class of anvil. This shouldn't exist, but is useable."
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
anvilquality = 0
outrightfailchance = 5
rng = TRUE
@@ -189,7 +190,6 @@
/obj/structure/anvil/obtainable/table
name = "table anvil"
desc = "A slightly reinforced table. Good luck."
- icon = 'icons/obj/smith.dmi'
icon_state = "anvil"
anvilquality = -2
@@ -206,38 +206,32 @@
name = "slab of bronze"
desc = "A big block of bronze. Useable as an anvil."
custom_materials = list(/datum/material/bronze=8000)
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "ratvaranvil"
anvilquality = -1
/obj/structure/anvil/obtainable/sandstone
name = "sandstone brick anvil"
desc = "A big block of sandstone. Useable as an anvil."
custom_materials = list(/datum/material/sandstone=8000)
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "sandvil"
anvilquality = -1
/obj/structure/anvil/obtainable/basalt
name = "basalt brick anvil"
desc = "A big block of basalt. Useable as an anvil, better than sandstone. Igneous!"
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "sandvilnoir"
anvilquality = -0.5
/obj/structure/anvil/obtainable/basic
name = "anvil"
desc = "An anvil. It's got wheels bolted to the bottom."
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
anvilquality = 0
/obj/structure/anvil/obtainable/ratvar
name = "brass anvil"
desc = "A big block of what appears to be brass. Useable as an anvil, if whatever's holding the brass together lets you."
custom_materials = list(/datum/material/bronze=8000)
- icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "ratvaranvil"
anvilquality = 1
/obj/structure/anvil/obtainable/ratvar/attackby(obj/item/I, mob/user)
@@ -251,11 +245,11 @@
desc = "An anvil made of a strange, runic metal."
custom_materials = list(/datum/material/runedmetal=8000)
icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "evil"
anvilquality = 1
/obj/structure/anvil/obtainable/narsie/attackby(obj/item/I, mob/user)
- if(iscultistr(user))
+ if(iscultist(user))
return ..()
else
to_chat(user, "That is not yours to use!")
diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm
index 1c8711aa2b..8f0bb99036 100644
--- a/code/modules/smithing/finished_items.dm
+++ b/code/modules/smithing/finished_items.dm
@@ -1,29 +1,3 @@
-//TODO: OBTAILABILITY, ANVIL TYPES, HAMMER TYPES, INGOTS
-
-/*
-sords:
-broadsword [x]
-gladius [x]
-dirk [x]
-zweihander [x]
-sabre
-rapier
-scimitar
-katana [x]
-
-polearms:
-halberd [x]
-glaive [x]
-javelin [x]
-pike
-
-misc:
-blacksmith's hammer [x]
-scythe [x]
-axe
-coghead club
-pickaxes [x]
-*/
/obj/item/melee/smith
name = "base class obj/item/melee/smith" //tin. handles overlay and quality and shit.
@@ -32,6 +6,9 @@ pickaxes [x]
icon_state = "mace_greyscale"
item_state = "mace_greyscale"
material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON //yeah ok
+ slot_flags = ITEM_SLOT_BELT
+ w_class = WEIGHT_CLASS_NORMAL
force = 10
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
@@ -55,7 +32,7 @@ pickaxes [x]
/obj/item/melee/smith/twohand
item_flags = NEEDS_PERMIT //it's a bigass sword/spear. beepsky is going to give you shit for it.
wielded_mult = 1.75
-
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/melee/smith/twohand/ComponentInitialize()
. = ..()
@@ -125,6 +102,7 @@ pickaxes [x]
name = "halberd"
icon_state = "halberd"
overlay_state = "spearhandle"
+ slot_flags = ITEM_SLOT_BACK
/obj/item/melee/smith/twohand/halberd/ComponentInitialize()
. = ..()
@@ -135,6 +113,7 @@ pickaxes [x]
icon_state = "javelin"
overlay_state = "longhandle"
wielded_mult = 1.5
+ slot_flags = ITEM_SLOT_BACK
/obj/item/melee/smith/twohand/javelin/ComponentInitialize()
@@ -145,17 +124,24 @@ pickaxes [x]
name = "glaive"
icon_state = "glaive"
overlay_state = "longhandle"
+ slot_flags = ITEM_SLOT_BACK
/obj/item/melee/smith/twohand/glaive/ComponentInitialize()
. = ..()
AddComponent(/datum/component/jousting)
+
+
+/obj/item/melee/smith/twohand/pike
+ name = "pike"
+ icon_state = "pike"
+ overlay_state = "longhandle"
+ reach = 2 //yeah ok
+ slot_flags = ITEM_SLOT_BACK
+
//////////////////////////
// Other Melee //
///////////////////////////
-/obj/item/melee/smith/axe
- name = "axe"
- item_flags = NEEDS_PERMIT
/obj/item/melee/smith/hammer//blacksmithing, not warhammer.
name = "hammer"
@@ -169,7 +155,9 @@ pickaxes [x]
/obj/item/melee/smith/cogheadclub
name = "coghead club"
+ icon_state = "coghead"
item_flags = NEEDS_PERMIT
+ overlay_state = "stick"
/obj/item/melee/smith/shortsword
name = "gladius"
@@ -177,11 +165,37 @@ pickaxes [x]
icon_state = "gladius"
overlay_state = "gladiushilt"
+/obj/item/melee/smith/shortsword/scimitar
+ name = "scimitar"
+ icon_state = "scimitar"
+ overlay_state = "scimitarhilt"
+
+/obj/item/melee/smith/wakizashi
+ name = "wakizashi"
+ item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY
+ icon_state = "waki"
+ overlay_state = "wakihilt"
+ block_parry_data = /datum/block_parry_data/waki
+
+/datum/block_parry_data/waki //like longbokken but worse reflect
+ parry_stamina_cost = 6
+ parry_time_windup = 0
+ parry_time_active = 15 //decent window
+ parry_time_spindown = 0
+ parry_time_perfect = 2
+ parry_time_perfect_leeway = 0.75
+ parry_imperfect_falloff_percent = 7.5
+ parry_efficiency_to_counterattack = 100
+ parry_efficiency_considered_successful = 80
+ parry_efficiency_perfect = 120
+ parry_failed_stagger_duration = 3 SECONDS
+ parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.9)
+
/obj/item/melee/smith/twohand/broadsword
name = "broadsword"
icon_state = "broadsword"
overlay_state = "broadhilt"
- force = 11
+ force = 9
wielded_mult = 1.8
/obj/item/melee/smith/twohand/zweihander
@@ -189,7 +203,7 @@ pickaxes [x]
icon_state = "zweihander"
overlay_state = "zweihilt"
force = 4
- wielded_mult = 3
+ wielded_mult = 3 //affected more by quality. a -1 is 25% less damage, a +1 is 25% more. These bonuses are tripled when wielded.
/obj/item/melee/smith/twohand/katana
name = "katana"
@@ -198,7 +212,40 @@ pickaxes [x]
force = 7
wielded_mult = 2
item_flags = ITEM_CAN_PARRY | UNIQUE_RENAME //want to name your katana "DEMON BLADE" or some shit? go ahead, idiot.
- block_parry_data = /datum/block_parry_data/captain_saber
+ block_parry_data = /datum/block_parry_data/captain_saber //todo
+
+/obj/item/melee/smith/sabre
+ name = "sabre"
+ icon_state = "sabre"
+ overlay_state = "sabrehilt"
+ armour_penetration = 15
+ force = 9
+ hitsound = 'sound/weapons/rapierhit.ogg'
+ item_flags = NEEDS_PERMIT | ITEM_CAN_PARRY
+ block_parry_data = /datum/block_parry_data/captain_saber //yeah this is fine i guess
+
+/obj/item/melee/smith/sabre/rapier
+ name = "rapier"
+ icon_state = "rapier"
+ overlay_state = "rapierhilt"
+ force = 6 //less force, stronger parry
+ armour_penetration = 30
+ block_parry_data = /datum/block_parry_data/smithrapier
+
+/datum/block_parry_data/smithrapier //parry into riposte. i am pretty sure this is going to be nearly fucking impossible to land.
+ parry_stamina_cost = 12 //dont miss
+ parry_time_active = 4
+ parry_time_perfect = 2
+ parry_time_perfect_leeway = 2
+ parry_failed_stagger_duration = 3 SECONDS
+ parry_failed_clickcd_duration = 3 SECONDS
+ parry_time_windup = 0
+ parry_time_spindown = 0
+ parry_imperfect_falloff_percent = 0
+ parry_efficiency_to_counterattack = 100
+ parry_efficiency_considered_successful = 120
+ parry_efficiency_perfect = 120
+ parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 4)
//unique hammers
/obj/item/melee/smith/hammer/toolbox
diff --git a/code/modules/smithing/furnace.dm b/code/modules/smithing/furnace.dm
index 4cc647353c..ee1d6a1b93 100644
--- a/code/modules/smithing/furnace.dm
+++ b/code/modules/smithing/furnace.dm
@@ -2,7 +2,7 @@
name = "furnace"
desc = "A furnace."
icon = 'icons/obj/smith.dmi'
- icon_state = "anvil"
+ icon_state = "furnace0"
density = TRUE
anchored = TRUE
var/debug = FALSE //debugging only
@@ -25,8 +25,11 @@
return TRUE
if(reagents.remove_reagent(/datum/reagent/fuel, fueluse))
working = TRUE
+ if(icon_state == "furnace0")
+ icon_state = "furnace1"
else
working = FALSE
+ icon_state = "furnace0"
/obj/structure/furnace/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/ingot))
@@ -44,9 +47,23 @@
default_unfasten_wrench(user, I, 5)
return TRUE
+/obj/structure/furnace/attackby(obj/item/W, mob/user, params)
+ if(W.reagents)
+ W.reagents.trans_to(src, 250)
+ else
+ return ..()
+
+/obj/structure/furnace/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+ to_chat(user, "You start furiously plunging [name].")
+ if(do_after(user, 30, target = src))
+ to_chat(user, "You finish plunging the [name].")
+ reagents.reaction(get_turf(src), TOUCH) //splash on the floor
+ reagents.clear_reagents()
+
/obj/structure/furnace/infinite
name = "fuelless furnace"
debug = TRUE
+ icon_state = "ratfurnace"
/obj/structure/furnace/infinite/ratvar
@@ -55,4 +72,4 @@
/obj/structure/furnace/infinite/narsie
name = "rune furnace"
- desc = "A runed furnace. Powered by... something, but seems otherwise safe."//todo:sprites
+ desc = "A runed furnace. Powered by... something, but seems otherwise safe."
diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm
index 8fa8e8e167..e078871b2e 100644
--- a/code/modules/smithing/smithed_items.dm
+++ b/code/modules/smithing/smithed_items.dm
@@ -124,18 +124,6 @@
mat = mat.name
finalitem.name = "[qualname] [mat] [finalitem.name]"
finalitem.forceMove(get_turf(src))
- qdel(src)
-
-
-/obj/item/smithing/axehead
- name = "smithed axe head"
- finalitem = /obj/item/melee/smith/axe
-
-
-/obj/item/smithing/axehead/startfinish()
- finalitem = new /obj/item/melee/smith/axe(src)
- finalitem.force += quality
- ..()
/obj/item/smithing/hammerhead
name = "smithed hammer head"
@@ -176,6 +164,7 @@
/obj/item/smithing/cogheadclubhead
name = "smithed coghead club head"
finalitem = /obj/item/melee/smith/cogheadclub
+ icon_state = "coghead"
/obj/item/smithing/cogheadclubhead/startfinish()
finalitem = new /obj/item/melee/smith/cogheadclub(src)
@@ -196,6 +185,19 @@
finalitem = finalforreal
..()
+/obj/item/smithing/pikehead
+ name = "smithed pike head"
+ finalitem = /obj/item/melee/smith/twohand/pike
+ icon_state = "pike"
+
+/obj/item/smithing/pikehead/startfinish()
+ var/obj/item/melee/smith/twohand/pike/finalforreal = new /obj/item/melee/smith/twohand/pike(src)
+ finalforreal.force += quality
+ finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult
+ finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]")
+ finalforreal.throwforce = finalforreal.force/10 //its a pike not a javelin
+ finalitem = finalforreal
+ ..()
/obj/item/smithing/pickaxehead
name = "smithed pickaxe head"
@@ -233,7 +235,7 @@
/obj/item/smithing/shortswordblade
- name = "smithed shortsword blade"
+ name = "smithed gladius blade"
finishingitem = /obj/item/swordhandle
finalitem = /obj/item/melee/smith/shortsword
icon_state = "gladius"
@@ -243,6 +245,18 @@
finalitem.force += quality
..()
+/obj/item/smithing/scimitarblade
+ name = "smithed scimitar blade"
+ finishingitem = /obj/item/swordhandle
+ finalitem = /obj/item/melee/smith/shortsword/scimitar
+ icon_state = "scimitar"
+
+/obj/item/smithing/shortswordblade/startfinish()
+ finalitem = new /obj/item/melee/smith/shortsword/scimitar(src)
+ finalitem.force += quality
+ ..()
+
+
/obj/item/smithing/knifeblade
name = "smithed knife blade"
finishingitem = /obj/item/swordhandle
@@ -268,6 +282,20 @@
finalitem = finalforreal
..()
+/obj/item/smithing/zweiblade
+ name = "smithed zweihander blade"
+ finishingitem = /obj/item/swordhandle
+ finalitem = /obj/item/melee/smith/twohand/zweihander
+ icon_state = "zweihander"
+
+/obj/item/smithing/zweiblade/startfinish()
+ var/obj/item/melee/smith/twohand/zweihander/finalforreal = new /obj/item/melee/smith/twohand/zweihander(src)
+ finalforreal.force += quality
+ finalforreal.wield_force = finalforreal.force*finalforreal.wielded_mult
+ finalforreal.AddComponent(/datum/component/two_handed, force_unwielded=finalforreal.force, force_wielded=finalforreal.wield_force, icon_wielded="[icon_state]")
+ finalitem = finalforreal
+ ..()
+
/obj/item/smithing/halberdhead
name = "smithed halberd head"
finalitem = /obj/item/melee/smith/twohand/halberd
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index c106bd12fc..1a98872463 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi
index e2a303112c..0af2112592 100644
Binary files a/icons/obj/smith.dmi and b/icons/obj/smith.dmi differ