diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index e469f18c7799..12c417054d22 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -451,14 +451,6 @@
/obj/item/construction/rcd/loaded,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"bo" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/obj/item/pickaxe,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"bp" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -512,16 +504,6 @@
/obj/item/flashlight/lantern,
/turf/open/indestructible/boss/air,
/area/ruin/unpowered/ash_walkers)
-"bv" = (
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/structure/closet/crate,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
"bw" = (
/obj/structure/stone_tile/block{
dir = 1
@@ -542,20 +524,6 @@
/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"by" = (
-/obj/structure/closet/crate,
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile/cracked,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
"bz" = (
/obj/structure/stone_tile{
dir = 4
@@ -655,12 +623,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"bP" = (
-/obj/structure/stone_tile/block,
-/obj/item/twohanded/spear,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"bQ" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
@@ -775,20 +737,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"cf" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/closet/crate/internals,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"cg" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -828,25 +776,6 @@
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"ck" = (
-/obj/item/twohanded/spear,
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cl" = (
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/item/twohanded/spear,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"cm" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -939,17 +868,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"cz" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/item/twohanded/spear,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
"cA" = (
/obj/structure/stone_tile/slab/cracked{
dir = 4;
@@ -957,44 +875,10 @@
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cB" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/effect/decal/cleanable/blood,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"cD" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
-/obj/item/flashlight/lantern,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
"cE" = (
/obj/structure/stone_tile/surrounding/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cF" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/table/wood,
-/obj/item/twohanded/spear,
-/obj/item/storage/belt,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
"cI" = (
/obj/structure/stone_tile/cracked{
dir = 4
@@ -1005,14 +889,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"cJ" = (
-/obj/item/shovel,
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"cK" = (
/obj/machinery/hydroponics/soil,
/obj/structure/stone_tile/block/cracked{
@@ -1021,50 +897,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"cL" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/table/wood,
-/obj/item/twohanded/spear,
-/obj/item/scythe,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"cM" = (
-/obj/structure/stone_tile/block{
- dir = 1
- },
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/table/wood,
-/obj/item/twohanded/spear,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"cN" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/table/wood,
-/obj/item/twohanded/spear,
-/obj/item/clothing/head/helmet/roman/legionnaire,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
"cO" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
@@ -1218,14 +1050,6 @@
/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"dp" = (
-/obj/item/pickaxe,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"dq" = (
/obj/item/stack/sheet/mineral/wood,
/obj/structure/stone_tile{
@@ -1348,6 +1172,74 @@
},
/turf/closed/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors)
+"fp" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood,
+/obj/structure/table/wood,
+/obj/item/kitchen/knife/combat/bone{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/kitchen/knife/combat/bone,
+/obj/item/kitchen/knife/combat/bone{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"kr" = (
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/flare,
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/item/hand_labeler,
+/obj/item/hand_labeler_refill,
+/obj/structure/closet/crate/wooden,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"pt" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/item/storage/belt/quiver/ashwalker{
+ pixel_y = 2
+ },
+/obj/item/storage/belt/quiver/ashwalker{
+ pixel_y = -2
+ },
+/obj/item/gun/ballistic/bow/ashen{
+ pixel_x = 1;
+ pixel_y = 1
+ },
+/obj/item/gun/ballistic/bow/ashen{
+ pixel_x = -1;
+ pixel_y = -1
+ },
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
"ue" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -1368,6 +1260,145 @@
/obj/item/seeds/bamboo,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"xe" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/kitchen/knife/combat/bone,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"zF" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/twohanded/bonespear,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"AD" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/closet/crate/wooden/ashwalker,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"CB" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"FI" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/table/wood,
+/obj/item/twohanded/bonespear,
+/obj/item/twohanded/bonespear{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/item/twohanded/bonespear{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Gv" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/structure/closet/crate/wooden,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"JH" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/pickaxe/bonepickaxe,
+/obj/item/pickaxe/bonepickaxe,
+/obj/item/pickaxe/bonepickaxe,
+/obj/item/pickaxe/bonepickaxe,
+/obj/item/pickaxe/bonepickaxe,
+/obj/item/pickaxe/bonepickaxe,
+/obj/structure/closet/crate/wooden,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Kk" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/shovel/spade/bone,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Og" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/table/wood,
+/obj/item/scythe,
+/obj/item/flashlight/lantern,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Rc" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/pickaxe/bonepickaxe,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"RD" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/storage/belt,
+/obj/item/clothing/head/helmet/roman/legionnaire,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"RM" = (
+/obj/structure/stone_tile/block,
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/kitchen/knife/combat/bone,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Sr" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/pickaxe/bonepickaxe,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"ST" = (
/obj/structure/stone_tile{
dir = 4
@@ -1381,22 +1412,28 @@
/obj/item/clothing/glasses/science,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"Vq" = (
-/obj/structure/closet/crate/radiation,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/flare,
+"YG" = (
/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile{
dir = 8
},
+/obj/structure/stone_tile/cracked,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/structure/closet/crate/wooden,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"ZU" = (
/obj/structure/stone_tile/cracked{
- dir = 1
+ dir = 8
},
-/obj/item/hand_labeler,
-/obj/item/hand_labeler_refill,
+/obj/effect/mapping_helpers/no_lava,
+/obj/item/seeds/cotton,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
+/area/lavaland/surface/outdoors)
(1,1,1) = {"
aa
@@ -1458,7 +1495,7 @@ ah
ah
bN
bY
-dp
+Rc
ah
ah
ah
@@ -1473,12 +1510,12 @@ aA
aM
cY
bj
-bv
+Gv
ak
cP
bN
cg
-cl
+xe
cq
cq
dv
@@ -1526,7 +1563,7 @@ dg
cs
cy
bY
-cq
+ZU
ah
ah
"}
@@ -1539,7 +1576,7 @@ cW
aP
aZ
bm
-by
+YG
ak
bV
cb
@@ -1560,7 +1597,7 @@ as
ST
aQ
am
-Vq
+kr
bz
ak
cb
@@ -1570,7 +1607,7 @@ co
bO
dq
bZ
-cJ
+Kk
ah
ah
"}
@@ -1604,7 +1641,7 @@ at
aF
aR
aR
-bo
+Sr
bA
cZ
dd
@@ -1651,7 +1688,7 @@ ak
ak
ak
ak
-bP
+RM
bL
bX
co
@@ -1744,9 +1781,9 @@ cd
bX
dj
as
-cz
-cD
-cL
+AD
+CB
+pt
as
ah
"}
@@ -1763,12 +1800,12 @@ ak
ak
bU
cg
-ck
+zF
bS
cv
cA
cE
-cM
+FI
as
ah
"}
@@ -1788,9 +1825,9 @@ bX
bN
ah
as
-cB
-cF
-cN
+fp
+RD
+Og
ak
cP
"}
@@ -1806,7 +1843,7 @@ ak
ak
bI
bW
-cf
+JH
ah
cp
as
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index 8bf69794bdd2..88de177d718c 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -84,7 +84,10 @@
#define CAT_MISC "Misc"
#define CAT_PRIMAL "Tribal"
#define CAT_STRUCTURES "Structures"
+#define CAT_APPAREL "Apparel"
#define CAT_CLOTHING "Clothing"
+#define CAT_ARMOR "Armor"
+#define CAT_EQUIPMENT "Equipment"
#define CAT_FOOD "Foods"
#define CAT_BREAD "Breads"
#define CAT_BURGER "Burgers"
diff --git a/code/datums/components/crafting/antag.dm b/code/datums/components/crafting/antag.dm
new file mode 100644
index 000000000000..2766075c59aa
--- /dev/null
+++ b/code/datums/components/crafting/antag.dm
@@ -0,0 +1,142 @@
+///////////////////////////////////////////////////
+/// Antag recipes ///
+// see granters.dm - at the top for easy viewing //
+///////////////////////////////////////////////////
+
+// Weapons
+/datum/crafting_recipe/baseball_bat
+ name = "Baseball Bat"
+ result = /obj/item/melee/baseball_bat
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 30
+ )
+ tools = list(TOOL_HATCHET) //to carve the wood into shape
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+/datum/crafting_recipe/lance
+ name = "Explosive Lance (Grenade)"
+ result = /obj/item/twohanded/spear
+ reqs = list(/obj/item/twohanded/spear = 1,
+ /obj/item/grenade = 1)
+ blacklist = list(/obj/item/twohanded/spear/explosive,
+ /obj/item/grenade/flashbang)
+ parts = list(/obj/item/twohanded/spear = 1,
+ /obj/item/grenade = 1)
+ time = 1.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+/datum/crafting_recipe/knifeboxing
+ name = "Knife-boxing Gloves"
+ result = /obj/item/clothing/gloves/knifeboxing
+ reqs = list(/obj/item/clothing/gloves/boxing = 1,
+ /obj/item/kitchen/knife = 2)
+ time = 10 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+/datum/crafting_recipe/pipebomb
+ name = "Pipe Bomb"
+ result = /obj/item/grenade/pipebomb
+ reqs = list(/datum/reagent/fuel = 50,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/pipe = 1,
+ /obj/item/assembly/mousetrap = 1)
+ tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_WIRECUTTER)
+ time = 1.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE //This was such a bad idea
+
+/datum/crafting_recipe/flamethrower
+ name = "Flamethrower"
+ result = /obj/item/flamethrower
+ reqs = list(/obj/item/weldingtool = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/assembly/igniter = 1,
+ /obj/item/weldingtool = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 1 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+/datum/crafting_recipe/makeshiftpistol
+ name = "Makeshift Pistol"
+ result = /obj/item/gun/ballistic/automatic/pistol/makeshift
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
+ /obj/item/stack/sheet/metal = 4,
+ /obj/item/stack/rods = 2,
+ /obj/item/stack/tape = 3)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 12 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+/datum/crafting_recipe/makeshiftsuppressor
+ name = "Makeshift Suppressor"
+ result = /obj/item/suppressor/makeshift
+ reqs = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/tape = 1)
+ time = 12 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+ always_availible = FALSE
+
+// Ammo
+
+/datum/crafting_recipe/makeshiftmagazine
+ name = "Makeshift Pistol Magazine (10mm)"
+ result = /obj/item/ammo_box/magazine/m10mm/makeshift
+ reqs = list(/obj/item/stack/sheet/metal = 2,
+ /obj/item/stack/tape = 2)
+ time = 12 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+ always_availible = FALSE
+
+/datum/crafting_recipe/bola_arrow
+ name = "Bola arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bola
+ time = 3 SECONDS
+ reqs = list(/obj/item/ammo_casing/caseless/arrow = 1,
+ /obj/item/stack/sheet/silk = 1,
+ /obj/item/restraints/legcuffs/bola = 1)
+ parts = list(/obj/item/ammo_casing/caseless/arrow = 1, /obj/item/restraints/legcuffs/bola = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+ always_availible = FALSE
+
+/*
+/datum/crafting_recipe/explosive_arrow
+ name = "Explosive arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/explosive
+ time = 3 SECONDS
+ reqs = list(/obj/item/ammo_casing/caseless/arrow = 1,
+ /obj/item/stack/sheet/silk = 1,
+ /obj/item/grenade = 1)
+ parts = list(/obj/item/ammo_casing/caseless/arrow = 1, /obj/item/grenade = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+ always_availible = FALSE
+*/
+
+/datum/crafting_recipe/flaming_arrow
+ name = "Flaming arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/flaming
+ time = 3 SECONDS
+ reqs = list(/obj/item/ammo_casing/caseless/arrow = 1,
+ /obj/item/stack/sheet/cloth = 1,
+ /datum/reagent/fuel = 10)
+ parts = list(/obj/item/ammo_casing/caseless/arrow = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+ always_availible = FALSE
diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm
index c52254f2be9c..f9d19ab7fdca 100644
--- a/code/datums/components/crafting/crafting.dm
+++ b/code/datums/components/crafting/crafting.dm
@@ -41,7 +41,11 @@
CAT_SPAGHETTI,
),
CAT_DRINK = CAT_NONE,
- CAT_CLOTHING = CAT_NONE,
+ CAT_APPAREL = list(
+ CAT_CLOTHING,
+ CAT_ARMOR,
+ CAT_EQUIPMENT
+ ),
)
var/cur_category = CAT_NONE
@@ -65,28 +69,40 @@
-/datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
+/datum/component/personal_crafting/proc/check_contents(mob/user, datum/crafting_recipe/R, list/contents)
+ var/list/item_instances = contents["instances"]
contents = contents["other"]
- main_loop:
- for(var/A in R.reqs)
- var/needed_amount = R.reqs[A]
- for(var/B in contents)
- if(ispath(B, A))
- if (R.blacklist.Find(B))
- continue
- if(contents[B] >= R.reqs[A])
- continue main_loop
- else
- needed_amount -= contents[B]
- if(needed_amount <= 0)
- continue main_loop
- else
- continue
- return 0
- for(var/A in R.chem_catalysts)
- if(contents[A] < R.chem_catalysts[A])
- return 0
- return 1
+
+ var/list/requirements_list = list()
+
+ // Process all requirements
+ for(var/requirement_path in R.reqs)
+ // Check we have the appropriate ammount avalible in the contents list
+ var/needed_amount = R.reqs[requirement_path]
+ for(var/content_item_path in contents)
+ // Right path and not blacklisted
+ if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(requirement_path))
+ continue
+
+ needed_amount -= contents[content_item_path]
+ if(needed_amount <= 0)
+ break
+
+ if(needed_amount > 0)
+ return FALSE
+
+ // Store the instances of what we will use for R.check_requirements() for requirement_path
+ var/list/instances_list = list()
+ for(var/instance_path in item_instances)
+ if(ispath(instance_path in item_instances))
+ instances_list += item_instances[instance_path]
+
+ requirements_list[requirement_path] = instances_list
+
+ for(var/requirement_path in R.chem_catalysts)
+ if(contents[requirement_path] < R.chem_catalysts[requirement_path])
+ return FALSE
+ return R.check_requirements(user, requirements_list)
/datum/component/personal_crafting/proc/get_environment(mob/user)
. = list()
@@ -108,11 +124,14 @@
. = list()
.["tool_behaviour"] = list()
.["other"] = list()
+ .["instances"] = list()
for(var/obj/item/I in get_environment(user))
- if(I.flags_1 & HOLOGRAM_1)
- continue
- if(I.status_traits && HAS_TRAIT(I,TRAIT_NODROP))
+ if(I.status_traits && HAS_TRAIT(I,TRAIT_NODROP) || I.flags_1 & HOLOGRAM_1)
continue
+ if(.["instances"][I.type])
+ .["instances"][I.type] += I
+ else
+ .["instances"][I.type] = list(I)
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
.["other"][I.type] += S.amount
@@ -163,11 +182,11 @@
var/send_feedback = 1
if(HAS_TRAIT(user, TRAIT_CRAFTY))
R.time *= 0.75
- if(check_contents(R, contents))
+ if(check_contents(user, R, contents))
if(check_tools(user, R, contents))
if(do_after(user, R.time, user))
contents = get_surroundings(user)
- if(!check_contents(R, contents))
+ if(!check_contents(user, R, contents))
return ", missing component."
if(!check_tools(user, R, contents))
return ", missing tool."
@@ -342,7 +361,7 @@
if((R.category != cur_category) || (R.subcategory != cur_subcategory))
continue
- craftability["[REF(R)]"] = check_contents(R, surroundings)
+ craftability["[REF(R)]"] = check_contents(user, R, surroundings)
data["craftability"] = craftability
return data
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index d96be9be1069..3d9d7fed2018 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -13,3 +13,9 @@
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
icon = 'icons/obj/improvised.dmi'
icon_state = "riflestock"
+
+/obj/item/weaponcrafting/silkstring
+ name = "silkstring"
+ desc = "A long piece of Silk that looks like a cable coil."
+ icon = 'icons/obj/improvised.dmi'
+ icon_state = "silkstring"
diff --git a/code/datums/components/crafting/makeshift.dm b/code/datums/components/crafting/makeshift.dm
index 049901ef9d3e..7ca46e0089e4 100644
--- a/code/datums/components/crafting/makeshift.dm
+++ b/code/datums/components/crafting/makeshift.dm
@@ -1,57 +1,3 @@
-//////////
-// GUNS //
-//////////
-
-/datum/crafting_recipe/makeshiftpistol
- name = "Makeshift Pistol"
- result = /obj/item/gun/ballistic/automatic/pistol/makeshift
- reqs = list(/obj/item/weaponcrafting/receiver = 1,
- /obj/item/stack/sheet/metal = 4,
- /obj/item/stack/rods = 2,
- /obj/item/stack/tape = 3)
- tools = list(TOOL_SCREWDRIVER)
- time = 12 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
-
-/datum/crafting_recipe/makeshiftmagazine
- name = "Makeshift Pistol Magazine (10mm)"
- result = /obj/item/ammo_box/magazine/m10mm/makeshift
- reqs = list(/obj/item/stack/sheet/metal = 2,
- /obj/item/stack/tape = 2)
- time = 12 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
- always_availible = FALSE
-
-/datum/crafting_recipe/makeshiftsuppressor
- name = "Makeshift Suppressor"
- result = /obj/item/suppressor/makeshift
- reqs = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1,
- /obj/item/stack/rods = 1,
- /obj/item/stack/sheet/cloth = 2,
- /obj/item/stack/tape = 1)
- time = 12 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
-
-/datum/crafting_recipe/gauss
- name = "Makeshift gauss rifle"
- reqs = list(/obj/item/stock_parts/cell = 1,
- /obj/item/weaponcrafting/stock = 1,
- /obj/item/weaponcrafting/receiver = 1,
- /obj/item/stack/tape = 1,
- /obj/item/stack/rods = 4,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER,TOOL_WELDER,TOOL_WRENCH)
- result = /obj/item/gun/ballistic/gauss
- time = 12
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-
///////////
// TOOLS //
///////////
@@ -141,3 +87,13 @@
time = 12 SECONDS
category = CAT_TOOLS
always_availible = FALSE
+
+/datum/crafting_recipe/makeshiftid
+ name = "Makeshift ID"
+ result = /obj/item/card/id/makeshift
+ reqs = list(/obj/item/stack/sheet/cardboard = 2,
+ /obj/item/stack/tape = 1,
+ /obj/item/pen = 1)
+ tools = list(TOOL_WIRECUTTER)
+ time = 30
+ category = CAT_MISC
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index 16b5ad6318bc..6e7ab831d44c 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -12,184 +12,20 @@
var/subcategory = CAT_NONE
var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
-//Antag recipes - see granters.dm - at the top for easy viewing
-/datum/crafting_recipe/baseball_bat
- name = "Baseball Bat"
- result = /obj/item/melee/baseball_bat
- reqs = list(/obj/item/stack/sheet/mineral/wood = 30
- )
- tools = list(TOOL_HATCHET) //to carve the wood into shape
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
-
-/datum/crafting_recipe/lance
- name = "Explosive Lance (Grenade)"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/twohanded/spear = 1,
- /obj/item/grenade = 1)
- blacklist = list(/obj/item/twohanded/spear/explosive,
- /obj/item/grenade/flashbang)
- parts = list(/obj/item/twohanded/spear = 1,
- /obj/item/grenade = 1)
- time = 1.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
-
-/datum/crafting_recipe/knifeboxing
- name = "Knife-boxing Gloves"
- result = /obj/item/clothing/gloves/knifeboxing
- reqs = list(/obj/item/clothing/gloves/boxing = 1,
- /obj/item/kitchen/knife = 2)
- time = 10 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
+/datum/crafting_recipe/New()
+ if(!(result in reqs))
+ blacklist += result
+
+/**
+ * Run custom pre-craft checks for this recipe
+ *
+ * user: the /mob that initiated the crafting
+ * collected_requirements: A list of lists of /obj/item instances that satisfy reqs. Top level list is keyed by requirement path.
+ */
+/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements)
+ return TRUE
//Normal recipes
-/datum/crafting_recipe/pin_removal
- name = "Pin Removal"
- result = /obj/item/gun
- reqs = list(/obj/item/gun = 1)
- parts = list(/obj/item/gun = 1)
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- time = 5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/IED
- name = "IED"
- result = /obj/item/grenade/iedcasing
- reqs = list(/datum/reagent/fuel = 50,
- /obj/item/stack/cable_coil = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
- time = 1.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/pipebomb
- name = "Pipe Bomb"
- result = /obj/item/grenade/pipebomb
- reqs = list(/datum/reagent/fuel = 50,
- /obj/item/stack/cable_coil = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/pipe = 1,
- /obj/item/assembly/mousetrap = 1)
- tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_WIRECUTTER)
- time = 1.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE //This was such a bad idea
-
-/datum/crafting_recipe/strobeshield
- name = "Strobe Shield"
- result = /obj/item/shield/riot/flash
- reqs = list(/obj/item/wallframe/flasher = 1,
- /obj/item/assembly/flash/handheld = 1,
- /obj/item/shield/riot = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/molotov
- name = "Molotov"
- result = /obj/item/reagent_containers/food/drinks/bottle/molotov
- reqs = list(/obj/item/reagent_containers/glass/rag = 1,
- /obj/item/reagent_containers/food/drinks/bottle = 1)
- parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/stunprod
- name = "Stunprod"
- result = /obj/item/melee/baton/cattleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/teleprod
- name = "Teleprod"
- result = /obj/item/melee/baton/cattleprod/teleprod
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/rods = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/ore/bluespace_crystal = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bola
- name = "Bola"
- result = /obj/item/restraints/legcuffs/bola
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/sheet/metal = 6)
- time = 2 SECONDS //15 faster than crafting them by hand!
- category= CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/gonbola
- name = "Gonbola"
- result = /obj/item/restraints/legcuffs/bola/gonbola
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/stack/sheet/metal = 6,
- /obj/item/stack/sheet/animalhide/gondola = 1)
- time = 4 SECONDS
- category= CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/tailclub
- name = "Tail Club"
- result = /obj/item/tailclub
- reqs = list(/obj/item/organ/tail/lizard = 1,
- /obj/item/stack/sheet/metal = 1)
- blacklist = list(/obj/item/organ/tail/lizard/fake)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/tailwhip
- name = "Liz O' Nine Tails"
- result = /obj/item/melee/chainofcommand/tailwhip
- reqs = list(/obj/item/organ/tail/lizard = 1,
- /obj/item/stack/cable_coil = 1)
- blacklist = list(/obj/item/organ/tail/lizard/fake)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/catwhip
- name = "Cat O' Nine Tails"
- result = /obj/item/melee/chainofcommand/tailwhip/kitty
- reqs = list(/obj/item/organ/tail/cat = 1,
- /obj/item/stack/cable_coil = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/greatruinousknife
- name = "Great Ruinous Knife"
- result = /obj/item/kitchen/knife/ritual/holy/strong
- reqs = list(/obj/item/kitchen/knife/ritual/holy = 1,
- /obj/item/stack/sheet/ruinous_metal = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bloodyruinousknife
- name = "Blood Soaked Ruinous Knife"
- result = /obj/item/kitchen/knife/ritual/holy/strong/blood
- reqs = list(/obj/item/kitchen/knife/ritual/holy/strong = 1,
- /obj/item/stack/sheet/runed_metal = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
/datum/crafting_recipe/ed209
name = "ED209"
@@ -279,162 +115,6 @@
time = 6 SECONDS
category = CAT_ROBOT
-/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
- name = "Pneumatic Cannon"
- result = /obj/item/pneumatic_cannon/ghetto
- tools = list(TOOL_WELDER, TOOL_WRENCH)
- reqs = list(/obj/item/stack/sheet/metal = 4,
- /obj/item/stack/packageWrap = 8,
- /obj/item/pipe = 2)
- time = 5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/flamethrower
- name = "Flamethrower"
- result = /obj/item/flamethrower
- reqs = list(/obj/item/weldingtool = 1,
- /obj/item/assembly/igniter = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/assembly/igniter = 1,
- /obj/item/weldingtool = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 1 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
- always_availible = FALSE
-
-/datum/crafting_recipe/pulseslug
- name = "Pulse Slug Shell"
- result = /obj/item/ammo_casing/shotgun/pulseslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/dragonsbreath
- name = "Dragonsbreath Shell"
- result = /obj/item/ammo_casing/shotgun/dragonsbreath
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/ionslug
- name = "Ion Scatter Shell"
- result = /obj/item/ammo_casing/shotgun/ion
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/subspace/crystal = 1)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/improvisedslug
- name = "Improvised Shotgun Shell"
- result = /obj/item/ammo_casing/shotgun/improvised
- reqs = list(/obj/item/grenade/chem_grenade = 1,
- /obj/item/stack/sheet/metal = 1,
- /obj/item/stack/cable_coil = 1,
- /datum/reagent/fuel = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/laserbuckshot
- name = "Laser Buckshot Shell"
- result = /obj/item/ammo_casing/shotgun/laserbuckshot
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/adv = 1,
- /obj/item/stock_parts/micro_laser/high = 2)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/thundershot
- name = "Thundershot Shell"
- result = /obj/item/ammo_casing/shotgun/thundershot
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stock_parts/capacitor/super = 1,
- /datum/reagent/teslium = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/laserslug
- name = "Bolts"
- result = /obj/item/ammo_casing/caseless/bolts
- reqs = list(/obj/item/stack/rods = 1)
- tools = list(TOOL_WIRECUTTER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/depleteduraniumslug
- name = "Depleted Uranium Slug Shell"
- result = /obj/item/ammo_casing/shotgun/uraniumpenetrator
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/stack/sheet/mineral/uranium = 3,
- /obj/item/stack/rods = 2,
- /datum/reagent/thermite = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-/datum/crafting_recipe/cryoshot
- name = "Cryoshot Shell"
- result = /obj/item/ammo_casing/shotgun/cryoshot
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /datum/reagent/medicine/c2/rhigoxane = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 0.5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
-
-/datum/crafting_recipe/ishotgun
- name = "Improvised Shotgun"
- result = /obj/item/gun/ballistic/shotgun/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/receiver = 1,
- /obj/item/pipe = 1,
- /obj/item/weaponcrafting/stock = 1,
- /obj/item/stack/packageWrap = 5)
- tools = list(TOOL_SCREWDRIVER)
- time = 10 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chainsaw
- name = "Chainsaw"
- result = /obj/item/twohanded/required/chainsaw
- reqs = list(/obj/item/circular_saw = 1,
- /obj/item/stack/cable_coil = 3,
- /obj/item/stack/sheet/plasteel = 5)
- tools = list(TOOL_WELDER)
- time = 5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/spear
- name = "Spear"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/restraints/handcuffs/cable = 1,
- /obj/item/shard = 1,
- /obj/item/stack/rods = 1)
- parts = list(/obj/item/shard = 1)
- time = 4 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
/datum/crafting_recipe/spooky_camera
name = "Camera Obscura"
result = /obj/item/camera/spooky
@@ -444,28 +124,6 @@
parts = list(/obj/item/camera = 1)
category = CAT_MISC
-/datum/crafting_recipe/lizardhat
- name = "Lizard Cloche Hat"
- result = /obj/item/clothing/head/lizard
- time = 1 SECONDS
- reqs = list(/obj/item/organ/tail/lizard = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/lizardhat_alternate
- name = "Lizard Cloche Hat"
- result = /obj/item/clothing/head/lizard
- time = 1 SECONDS
- reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
- category = CAT_MISC
-
-/datum/crafting_recipe/kittyears
- name = "Kitty Ears"
- result = /obj/item/clothing/head/kitty/genuine
- time = 1 SECONDS
- reqs = list(/obj/item/organ/tail/cat = 1,
- /obj/item/organ/ears/cat = 1)
- category = CAT_MISC
-
/datum/crafting_recipe/skateboard
name = "Skateboard"
result = /obj/vehicle/ridden/scooter/skateboard
@@ -608,13 +266,6 @@
result = /obj/structure/toilet
category = CAT_STRUCTURES
-/datum/crafting_recipe/extendohand
- name = "Extendo-Hand"
- reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
- result = /obj/item/extendohand
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
/datum/crafting_recipe/cloth_curtain
name = "Curtains"
reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/rods = 1)
@@ -644,204 +295,20 @@
result = /obj/machinery/door/poddoor/preopen
category = CAT_STRUCTURES
-/datum/crafting_recipe/chemical_payload
- name = "Chemical Payload (C4)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/grenade/plastic/c4 = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 3 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/chemical_payload2
- name = "Chemical Payload (Gibtonite)"
- result = /obj/item/bombcore/chemical
- reqs = list(
- /obj/item/stock_parts/matter_bin = 1,
- /obj/item/twohanded/required/gibtonite = 1,
- /obj/item/grenade/chem_grenade = 2
- )
- parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
- time = 5 SECONDS
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/bonearmor
- name = "Bone Armor"
- result = /obj/item/clothing/suit/armor/bone
- time = 3 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 6)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/tribalcoat
- name = "Tribal Coat"
- result = /obj/item/clothing/suit/armor/tribalcoat
- time = 3 SECONDS
- reqs = list(/obj/item/stack/sheet/leather = 2,
- /obj/item/stack/sheet/bone = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonetalisman
- name = "Bone Talisman"
- result = /obj/item/clothing/accessory/talisman
- time = 2 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonecodpiece
- name = "Skull Codpiece"
- result = /obj/item/clothing/accessory/skullcodpiece
- time = 2 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/resinband
- name = "Resin armband"
- result = /obj/item/clothing/accessory/resinband
- time = 2 SECONDS
- reqs = list(/obj/item/stack/sheet/ashresin = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bracers
- name = "Bone Bracers"
- result = /obj/item/clothing/gloves/bracer
- time = 2 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/skullhelm
- name = "Skull Helmet"
- result = /obj/item/clothing/head/helmet/skull
- time = 3 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/shamanhat
- name = "Shaman Headdress"
- result = /obj/item/clothing/head/helmet/shaman
- time = 3 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/resincrown
- name = "Resin Crown"
- result = /obj/item/clothing/head/crown/resin
- time = 4 SECONDS
- reqs = list(/obj/item/stack/sheet/ashresin = 2,
- /obj/item/stack/sheet/mineral/mythril = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/goliathcloak
- name = "Goliath Cloak"
- result = /obj/item/clothing/suit/hooded/cloak/goliath
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/leather = 2,
- /obj/item/stack/sheet/sinew = 1,
- /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/goliathshield
- name = "Goliath shield"
- result = /obj/item/shield/riot/goliath
- time = 6 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/pathkasa
- name = "Pathfinder Kasa"
- result = /obj/item/clothing/head/helmet/kasa
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 8,
- /obj/item/stack/sheet/sinew = 4,
- /obj/item/stack/sheet/animalhide/weaver_chitin = 10) //3 spiders assuming you get leather from one
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/pathcloak
- name = "Pathfinder Cloak"
- result = /obj/item/clothing/suit/armor/pathfinder
- time = 5 SECONDS
- reqs = list(/obj/item/clothing/suit/hooded/cloak/goliath = 1,
- /obj/item/stack/sheet/animalhide/goliath_hide = 2, //2 plates for the cloak plus 2 here plus 3 for plating the armor = 7 total
- /obj/item/stack/sheet/sinew = 6)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/pathtreads
- name = "Pathfinder Treads"
- result = /obj/item/clothing/shoes/pathtreads
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/weaver_chitin = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonesword
- name = "Bone Sword"
- result = /obj/item/claymore/bone
- time = 4 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 3,
- /obj/item/stack/sheet/sinew = 2)
- category = CAT_PRIMAL
-
/datum/crafting_recipe/bonepickaxe
name = "Bone Pickaxe"
result = /obj/item/pickaxe/bonepickaxe
- time = 50
+ time = 5 SECONDS
reqs = list(/obj/item/stack/sheet/bone = 3,
/obj/item/stack/sheet/sinew = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/drakecloak
- name = "Ash Drake Armour"
- result = /obj/item/clothing/suit/hooded/cloak/drake
- time = 6 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 10,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/ashdrake = 5)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/carpsuit
- name = "Space Dragon Armour"
- result = /obj/item/clothing/suit/space/hardsuit/carp/dragon
- time = 6 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 10,
- /obj/item/stack/sheet/sinew = 2,
- /obj/item/stack/sheet/animalhide/carpdragon = 5)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/sinewbelt
- name = "Sinew Belt"
- result = /obj/item/storage/belt/mining/primitive
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/sinew = 4)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/medpouchcloth
- name = "Cloth Medicinal Pouch"
- result = /obj/item/storage/bag/medpouch
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/cloth = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/medpouchleather //whatever material tickles your fancy.
- name = "Leather Medicinal Pouch"
- result = /obj/item/storage/bag/medpouch
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/leather = 1)
- category = CAT_PRIMAL
+ category = CAT_TOOLS
/datum/crafting_recipe/firebrand
name = "Firebrand"
result = /obj/item/match/firebrand
time = 10 SECONDS //Long construction time. Making fire is hard work.
reqs = list(/obj/item/stack/sheet/mineral/wood = 2)
- category = CAT_PRIMAL
+ category = CAT_TOOLS
/datum/crafting_recipe/gold_horn
name = "Golden Bike Horn"
@@ -851,39 +318,6 @@
/obj/item/bikehorn = 1)
category = CAT_MISC
-/datum/crafting_recipe/bonedagger
- name = "Bone Dagger"
- result = /obj/item/kitchen/knife/combat/bone
- time = 2 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonespear
- name = "Bone Spear"
- result = /obj/item/twohanded/bonespear
- time = 3 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boneaxe
- name = "Bone Axe"
- result = /obj/item/twohanded/fireaxe/boneaxe
- time = 5 SECONDS
- reqs = list(/obj/item/stack/sheet/bone = 6,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/chitinspear
- name = "Chitin Spear"
- result = /obj/item/twohanded/bonespear/chitinspear //take a bonespear, reinforce it with some chitin and resin, profit?
- time = 7.5 SECONDS
- reqs = list(/obj/item/twohanded/bonespear = 1,
- /obj/item/stack/sheet/sinew = 3,
- /obj/item/stack/sheet/ashresin = 1,
- /obj/item/stack/sheet/animalhide/weaver_chitin = 6)
- category = CAT_PRIMAL
-
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 6 SECONDS
@@ -891,19 +325,19 @@
result = /obj/structure/bonfire
category = CAT_PRIMAL
-/datum/crafting_recipe/rake //Category resorting incoming
+/datum/crafting_recipe/rake
name = "Rake"
time = 3 SECONDS
reqs = list(/obj/item/stack/sheet/mineral/wood = 5)
result = /obj/item/cultivator/rake
- category = CAT_PRIMAL
+ category = CAT_TOOLS
/datum/crafting_recipe/woodbucket
name = "Wooden Bucket"
time = 3 SECONDS
reqs = list(/obj/item/stack/sheet/mineral/wood = 3)
result = /obj/item/reagent_containers/glass/bucket/wooden
- category = CAT_PRIMAL
+ category = CAT_TOOLS
/datum/crafting_recipe/cleanleather
name = "Clean Leather"
@@ -919,7 +353,8 @@
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
/obj/item/twohanded/spear = 1)
- result = /obj/structure/headpike
+ blacklist = list(/obj/item/twohanded/bonespear, /obj/item/twohanded/bamboospear)
+ result = /obj/structure/headpike/glass
category = CAT_PRIMAL
/datum/crafting_recipe/headpikebone
@@ -932,6 +367,16 @@
result = /obj/structure/headpike/bone
category = CAT_PRIMAL
+/datum/crafting_recipe/headpikebamboo
+ name = "Spike Head (Bamboo Spear)"
+ time = 6.5 SECONDS
+ reqs = list(/obj/item/twohanded/bamboospear = 1,
+ /obj/item/bodypart/head = 1)
+ parts = list(/obj/item/bodypart/head = 1,
+ /obj/item/twohanded/bamboospear = 1)
+ result = /obj/structure/headpike/bamboo
+ category = CAT_PRIMAL
+
/datum/crafting_recipe/smallcarton
name = "Small Carton"
result = /obj/item/reagent_containers/food/drinks/sillycup/smallcarton
@@ -956,20 +401,7 @@
time = 4 SECONDS
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 15)
- category = CAT_MISC
-
-/datum/crafting_recipe/mummy
- name = "Mummification Bandages (Mask)"
- result = /obj/item/clothing/mask/mummy
- time = 1 SECONDS
- tools = list(/obj/item/nullrod/egyptian)
- reqs = list(/obj/item/stack/sheet/cloth = 2)
- category = CAT_CLOTHING
-
-/datum/crafting_recipe/mummy/body
- name = "Mummification Bandages (Body)"
- result = /obj/item/clothing/under/mummy
- reqs = list(/obj/item/stack/sheet/cloth = 5)
+ category = CAT_TOOLS
/datum/crafting_recipe/guillotine
name = "Guillotine"
@@ -1001,14 +433,6 @@
/obj/item/stack/cable_coil = 5)
category = CAT_MISC
-/datum/crafting_recipe/ghettojetpack
- name = "Improvised Jetpack"
- result = /obj/item/tank/jetpack/improvised
- time = 3 SECONDS
- reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = MAXCOIL)
- category = CAT_MISC
- tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
-
/datum/crafting_recipe/urinal
name = "Urinal"
reqs = list(/obj/item/stack/sheet/metal = 4 , /obj/item/pipe = 2)
@@ -1056,27 +480,6 @@
)
category = CAT_STRUCTURES
-// Shank - Makeshift weapon that can embed on throw
-/datum/crafting_recipe/shank
- name = "Shank"
- reqs = list(/obj/item/shard = 1,
- /obj/item/stack/rods = 1,
- /obj/item/stack/cable_coil = 10)
- result = /obj/item/kitchen/knife/shank
- time = 10
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/makeshiftid
- name = "Makeshift ID"
- result = /obj/item/card/id/makeshift
- reqs = list(/obj/item/stack/sheet/cardboard = 2,
- /obj/item/stack/tape = 1,
- /obj/item/pen = 1)
- tools = list(TOOL_WIRECUTTER)
- time = 30
- category = CAT_MISC
-
/datum/crafting_recipe/tape
name = "tape"
reqs = list(/obj/item/stack/sheet/cloth = 1,
@@ -1084,3 +487,87 @@
result = /obj/item/stack/tape
time = 1
category = CAT_MISC
+
+/datum/crafting_recipe/goliath_drapes
+ name = "Goliath Drapes"
+ result = /obj/item/surgical_drapes/goliath
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/sinew = 1,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_scalpel
+ name = "Bone Scalpel"
+ result = /obj/item/scalpel/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/stack/sheet/mineral/diamond = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_retractor
+ name = "Bone Retractor"
+ result = /obj/item/retractor/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_bonesaw
+ name = "Bone Bonesaw"
+ result = /obj/item/circular_saw/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/organ/regenerative_core = 1,
+ /obj/item/stack/sheet/mineral/diamond = 2)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_hemostat
+ name = "Bone Hemostat"
+ result = /obj/item/hemostat/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_bonesetter
+ name = "Bone Bonersetter"
+ result = /obj/item/bonesetter/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_cautery
+ name = "Bone Cautery"
+ result = /obj/item/cautery/bone
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1,
+ /obj/item/stack/sheet/mineral/plasma = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_spade
+ name = "Bone Spade"
+ result = /obj/item/shovel/spade/bone
+ time = 80
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_hatchet
+ name = "Bone Hatchet"
+ result = /obj/item/hatchet/bone
+ time = 80
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
+
+/datum/crafting_recipe/bone_cultivator
+ name = "Bone Cultivator"
+ result = /obj/item/cultivator/bone
+ time = 80
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_TOOLS
diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm
index 1f1f455c4be7..f0f119136b3b 100644
--- a/code/datums/components/crafting/tailoring.dm
+++ b/code/datums/components/crafting/tailoring.dm
@@ -1,10 +1,13 @@
+// Clothing //
+
/datum/crafting_recipe/durathread_vest
name = "Durathread Vest"
result = /obj/item/clothing/suit/armor/vest/durathread
reqs = list(/obj/item/stack/sheet/cloth/durathread = 5,
/obj/item/stack/sheet/leather = 4)
time = 5 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
/datum/crafting_recipe/durathread_helmet
name = "Durathread Helmet"
@@ -12,35 +15,356 @@
reqs = list(/obj/item/stack/sheet/cloth/durathread = 4,
/obj/item/stack/sheet/leather = 5)
time = 4 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
/datum/crafting_recipe/durathread_jumpsuit
name = "Durathread Jumpsuit"
result = /obj/item/clothing/under/durathread
reqs = list(/obj/item/stack/sheet/cloth/durathread = 4)
time = 4 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
/datum/crafting_recipe/durathread_beret
name = "Durathread Beret"
result = /obj/item/clothing/head/beret/durathread
reqs = list(/obj/item/stack/sheet/cloth/durathread = 2)
time = 4 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
/datum/crafting_recipe/durathread_beanie
name = "Durathread Beanie"
result = /obj/item/clothing/head/beanie/durathread
reqs = list(/obj/item/stack/sheet/cloth/durathread = 2)
time = 4 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
/datum/crafting_recipe/durathread_bandana
name = "Durathread Bandana"
result = /obj/item/clothing/mask/bandana/durathread
reqs = list(/obj/item/stack/sheet/cloth/durathread = 1)
time = 2.5 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/ghostsheet
+ name = "Ghost Sheet"
+ result = /obj/item/clothing/suit/ghost_sheet
+ time = 0.5 SECONDS
+ tools = list(TOOL_WIRECUTTER)
+ reqs = list(/obj/item/bedsheet = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/cowboyboots
+ name = "Cowboy Boots"
+ result = /obj/item/clothing/shoes/cowboy
+ reqs = list(/obj/item/stack/sheet/leather = 2)
+ time = 4.5 SECONDS
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/lizardboots
+ name = "Lizard Skin Boots"
+ result = /obj/effect/spawner/lootdrop/lizardboots
+ reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1, /obj/item/stack/sheet/leather = 1)
+ time = 6 SECONDS
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/lizardhat
+ name = "Lizard Cloche Hat"
+ result = /obj/item/clothing/head/lizard
+ time = 1 SECONDS
+ reqs = list(/obj/item/organ/tail/lizard = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/lizardhat_alternate
+ name = "Lizard Cloche Hat"
+ result = /obj/item/clothing/head/lizard
+ time = 1 SECONDS
+ reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/kittyears
+ name = "Kitty Ears"
+ result = /obj/item/clothing/head/kitty/genuine
+ time = 1 SECONDS
+ reqs = list(/obj/item/organ/tail/cat = 1,
+ /obj/item/organ/ears/cat = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/footwrapsgoliath
+ name = "Goliath Hide Footwraps"
+ result = /obj/item/clothing/shoes/xeno_wraps/goliath
+ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/leather = 1)
+ time = 6 SECONDS
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/footwrapsdragon
+ name = "Ash Drake Hide Footwraps"
+ result = /obj/item/clothing/shoes/xeno_wraps/dragon
+ reqs = list(/obj/item/stack/sheet/animalhide/ashdrake = 1, /obj/item/stack/sheet/leather = 1)
+ time = 6 SECONDS
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/footwrapscarpdragon
+ name = "Carp Dragon Hide Footwraps"
+ result = /obj/item/clothing/shoes/xeno_wraps/carpdragon
+ reqs = list(/obj/item/stack/sheet/animalhide/carpdragon = 1, /obj/item/stack/sheet/leather = 1)
+ time = 6 SECONDS
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/mummy
+ name = "Mummification Bandages (Mask)"
+ result = /obj/item/clothing/mask/mummy
+ time = 1 SECONDS
+ tools = list(/obj/item/nullrod/egyptian)
+ reqs = list(/obj/item/stack/sheet/cloth = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/mummy/body
+ name = "Mummification Bandages (Body)"
+ result = /obj/item/clothing/under/mummy
+ reqs = list(/obj/item/stack/sheet/cloth = 5)
+
+/datum/crafting_recipe/chestwrap
+ name = "Loincloth and Chestwrap"
+ result = /obj/item/clothing/under/chestwrap
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+
+/datum/crafting_recipe/raider_leather
+ name = "Scavenged Rags"
+ result = /obj/item/clothing/under/raider_leather
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/rods = 2,
+ /obj/item/stack/sheet/leather = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/tribal_wraps
+ name = "Metal Plated Rags"
+ result = /obj/item/clothing/under/tribal
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/sheet/leather = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/ash_robe
+ name = "Tribal Robes"
+ result = /obj/item/clothing/under/ash_robe
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/cloth = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/ash_robe/young
+ name = "Tribal Rags"
+ result = /obj/item/clothing/under/ash_robe/young
+
+/datum/crafting_recipe/ash_robe/hunter
+ name = "Hunter Tribal Rags"
+ result = /obj/item/clothing/under/ash_robe/hunter
+
+/datum/crafting_recipe/ash_robe/chief
+ name = "Chief Tribal Rags"
+ result = /obj/item/clothing/under/ash_robe/chief
+
+/datum/crafting_recipe/ash_robe/shaman
+ name = "Shaman Tribal Rags"
+ result = /obj/item/clothing/under/ash_robe/shaman
+
+/datum/crafting_recipe/ash_robe/tunic
+ name = "Tribal Tunic"
+ result = /obj/item/clothing/under/ash_robe/tunic
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 1)
+
+/datum/crafting_recipe/ash_robe/dress
+ name = "Tribal Dress"
+ result = /obj/item/clothing/under/ash_robe/dress
+ reqs = list(/obj/item/stack/sheet/cloth = 3)
+
+/datum/crafting_recipe/shamanash
+ name = "Shaman Skull"
+ result = /obj/item/clothing/head/shamanash
+ reqs = list(/obj/item/stack/sheet/cloth = 1,
+ /obj/item/stack/sheet/bone = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/tribalmantle
+ name = "Ornate Mantle"
+ result = /obj/item/clothing/neck/cloak/tribalmantle
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/leathercape
+ name = "Brown Leather Cape"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath/desert
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 5)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+/datum/crafting_recipe/hidemantle
+ name = "Hide Mantle"
+ result = /obj/item/clothing/suit/leather_mantle
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/cloth = 2,
+ /obj/item/stack/sheet/leather = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_CLOTHING
+ always_availible = FALSE
+
+
+// Armor //
+
+/datum/crafting_recipe/bonearmor
+ name = "Bone Armor"
+ result = /obj/item/clothing/suit/armor/bone
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 6)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/heavybonearmor
+ name = "Heavy Bone Armor"
+ result = /obj/item/clothing/suit/armor/bone/heavy
+ time = 6 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 8,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/tribalcoat
+ name = "Tribal Coat"
+ result = /obj/item/clothing/suit/armor/tribalcoat
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/bone = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/bracers
+ name = "Bone Bracers"
+ result = /obj/item/clothing/gloves/bracer
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/skullhelm
+ name = "Skull Helmet"
+ result = /obj/item/clothing/head/helmet/skull
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 4)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/shamanhat
+ name = "Shaman Headdress"
+ result = /obj/item/clothing/head/helmet/shaman
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 4)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/resincrown
+ name = "Resin Crown"
+ result = /obj/item/clothing/head/crown/resin
+ time = 4 SECONDS
+ reqs = list(/obj/item/stack/sheet/ashresin = 2,
+ /obj/item/stack/sheet/mineral/mythril = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/goliathcloak
+ name = "Goliath Cloak"
+ result = /obj/item/clothing/suit/hooded/cloak/goliath
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/pathkasa
+ name = "Pathfinder Kasa"
+ result = /obj/item/clothing/head/helmet/kasa
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 8,
+ /obj/item/stack/sheet/sinew = 4,
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 10) //3 spiders assuming you get leather from one
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/pathcloak
+ name = "Pathfinder Cloak"
+ result = /obj/item/clothing/suit/armor/pathfinder
+ time = 5 SECONDS
+ reqs = list(/obj/item/clothing/suit/hooded/cloak/goliath = 1,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2, //2 plates for the cloak plus 2 here plus 3 for plating the armor = 7 total
+ /obj/item/stack/sheet/sinew = 6)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/pathtreads
+ name = "Pathfinder Treads"
+ result = /obj/item/clothing/shoes/pathtreads
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/drakecloak
+ name = "Ash Drake Armour"
+ result = /obj/item/clothing/suit/hooded/cloak/drake
+ time = 6 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 10,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/ashdrake = 5)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+/datum/crafting_recipe/carpsuit
+ name = "Space Dragon Armour"
+ result = /obj/item/clothing/suit/space/hardsuit/carp/dragon
+ time = 6 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 10,
+ /obj/item/stack/sheet/sinew = 2,
+ /obj/item/stack/sheet/animalhide/carpdragon = 5)
+ category = CAT_APPAREL
+ subcategory = CAT_ARMOR
+
+
+// Equipment //
/datum/crafting_recipe/fannypack
name = "Fannypack"
@@ -48,7 +372,17 @@
reqs = list(/obj/item/stack/sheet/cloth = 2,
/obj/item/stack/sheet/leather = 1)
time = 2 SECONDS
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/ghettojetpack
+ name = "Improvised Jetpack"
+ result = /obj/item/tank/jetpack/improvised
+ time = 3 SECONDS
+ reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = MAXCOIL)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+ tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
/datum/crafting_recipe/hudsunmeson
name = "Meson Sunglasses"
@@ -59,8 +393,17 @@
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
blacklist = list(/obj/item/clothing/glasses/sunglasses/cheap)
- category = CAT_CLOTHING
-
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/hudsunmesonremoval
+ name = "Meson HUD removal"
+ result = /obj/item/clothing/glasses/sunglasses
+ time = 2 SECONDS
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/meson/sunglasses = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsunsec
name = "Security HUDsunglasses"
@@ -71,7 +414,8 @@
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
blacklist = list(/obj/item/clothing/glasses/sunglasses/cheap)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsunsecremoval
name = "Security HUD removal"
@@ -79,7 +423,8 @@
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsunmed
name = "Medical HUDsunglasses"
@@ -90,7 +435,8 @@
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
blacklist = list(/obj/item/clothing/glasses/sunglasses/cheap)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsunmedremoval
name = "Medical HUD removal"
@@ -98,7 +444,8 @@
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsundiag
name = "Diagnostic HUDsunglasses"
@@ -110,7 +457,8 @@
/obj/item/stack/cable_coil = 5)
blacklist = list(/obj/item/clothing/glasses/sunglasses/cheap)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/hudsundiagremoval
name = "Diagnostic HUD removal"
@@ -118,7 +466,8 @@
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/beergoggles
name = "Beer Goggles"
@@ -129,7 +478,8 @@
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
blacklist = list(/obj/item/clothing/glasses/sunglasses/cheap)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
/datum/crafting_recipe/beergogglesremoval
name = "Beer Goggles removal"
@@ -137,26 +487,82 @@
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
- category = CAT_CLOTHING
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
-/datum/crafting_recipe/ghostsheet
- name = "Ghost Sheet"
- result = /obj/item/clothing/suit/ghost_sheet
- time = 0.5 SECONDS
- tools = list(TOOL_WIRECUTTER)
- reqs = list(/obj/item/bedsheet = 1)
- category = CAT_CLOTHING
+/datum/crafting_recipe/bonetalisman
+ name = "Bone Talisman"
+ result = /obj/item/clothing/accessory/talisman
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
-/datum/crafting_recipe/cowboyboots
- name = "Cowboy Boots"
- result = /obj/item/clothing/shoes/cowboy
- reqs = list(/obj/item/stack/sheet/leather = 2)
- time = 4.5 SECONDS
- category = CAT_CLOTHING
+/datum/crafting_recipe/bonecodpiece
+ name = "Skull Codpiece"
+ result = /obj/item/clothing/accessory/skullcodpiece
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
-/datum/crafting_recipe/lizardboots
- name = "Lizard Skin Boots"
- result = /obj/effect/spawner/lootdrop/lizardboots
- reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1, /obj/item/stack/sheet/leather = 1)
- time = 6 SECONDS
- category = CAT_CLOTHING
+/datum/crafting_recipe/skilt
+ name = "Sinew Kilt"
+ result = /obj/item/clothing/accessory/skilt
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 2)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/resinband
+ name = "Resin armband"
+ result = /obj/item/clothing/accessory/resinband
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/ashresin = 3)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/sinewbelt
+ name = "Sinew Belt"
+ result = /obj/item/storage/belt/mining/primitive
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/sinew = 4)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/medpouchcloth
+ name = "Cloth Medicinal Pouch"
+ result = /obj/item/storage/bag/medpouch
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/cloth = 3)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/medpouchleather //whatever material tickles your fancy.
+ name = "Leather Medicinal Pouch"
+ result = /obj/item/storage/bag/medpouch
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/quiver
+ name = "Quiver"
+ result = /obj/item/storage/belt/quiver
+ time = 8 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 3,
+ /obj/item/stack/sheet/sinew = 4)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
+
+/datum/crafting_recipe/goliathgloves
+ name = "Goliath Gloves"
+ result = /obj/item/clothing/gloves/color/black/goliath
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/leather = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_APPAREL
+ subcategory = CAT_EQUIPMENT
diff --git a/code/datums/components/crafting/weapons.dm b/code/datums/components/crafting/weapons.dm
new file mode 100644
index 000000000000..bac8dbfd518a
--- /dev/null
+++ b/code/datums/components/crafting/weapons.dm
@@ -0,0 +1,535 @@
+// Weapons
+
+/datum/crafting_recipe/pin_removal
+ name = "Pin Removal"
+ result = /obj/item/gun
+ reqs = list(/obj/item/gun = 1)
+ parts = list(/obj/item/gun = 1)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ time = 5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/IED
+ name = "IED"
+ result = /obj/item/grenade/iedcasing
+ reqs = list(/datum/reagent/fuel = 50,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1)
+ time = 1.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/strobeshield
+ name = "Strobe Shield"
+ result = /obj/item/shield/riot/flash
+ reqs = list(/obj/item/wallframe/flasher = 1,
+ /obj/item/assembly/flash/handheld = 1,
+ /obj/item/shield/riot = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/molotov
+ name = "Molotov"
+ result = /obj/item/reagent_containers/food/drinks/bottle/molotov
+ reqs = list(/obj/item/reagent_containers/glass/rag = 1,
+ /obj/item/reagent_containers/food/drinks/bottle = 1)
+ parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/stunprod
+ name = "Stunprod"
+ result = /obj/item/melee/baton/cattleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/teleprod
+ name = "Teleprod"
+ result = /obj/item/melee/baton/cattleprod/teleprod
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stack/ore/bluespace_crystal = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bola
+ name = "Bola"
+ result = /obj/item/restraints/legcuffs/bola
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6)
+ time = 2 SECONDS //15 faster than crafting them by hand!
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/watcherbola
+ name = "Watcher Bola"
+ result = /obj/item/restraints/legcuffs/bola/watcher
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 2,
+ /obj/item/restraints/handcuffs/cable/sinew = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/gonbola
+ name = "Gonbola"
+ result = /obj/item/restraints/legcuffs/bola/gonbola
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/stack/sheet/metal = 6,
+ /obj/item/stack/sheet/animalhide/gondola = 1)
+ time = 4 SECONDS
+ category= CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/tailclub
+ name = "Tail Club"
+ result = /obj/item/tailclub
+ reqs = list(/obj/item/organ/tail/lizard = 1,
+ /obj/item/stack/sheet/metal = 1)
+ blacklist = list(/obj/item/organ/tail/lizard/fake)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/tailwhip
+ name = "Liz O' Nine Tails"
+ result = /obj/item/melee/chainofcommand/tailwhip
+ reqs = list(/obj/item/organ/tail/lizard = 1,
+ /obj/item/stack/cable_coil = 1)
+ blacklist = list(/obj/item/organ/tail/lizard/fake)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/catwhip
+ name = "Cat O' Nine Tails"
+ result = /obj/item/melee/chainofcommand/tailwhip/kitty
+ reqs = list(/obj/item/organ/tail/cat = 1,
+ /obj/item/stack/cable_coil = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/greatruinousknife
+ name = "Great Ruinous Knife"
+ result = /obj/item/kitchen/knife/ritual/holy/strong
+ reqs = list(/obj/item/kitchen/knife/ritual/holy = 1,
+ /obj/item/stack/sheet/ruinous_metal = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bloodyruinousknife
+ name = "Blood Soaked Ruinous Knife"
+ result = /obj/item/kitchen/knife/ritual/holy/strong/blood
+ reqs = list(/obj/item/kitchen/knife/ritual/holy/strong = 1,
+ /obj/item/stack/sheet/runed_metal = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/pipebow
+ name = "Pipe Bow"
+ result = /obj/item/gun/ballistic/bow/pipe
+ reqs = list(/obj/item/pipe = 5,
+ /obj/item/stack/sheet/plastic = 5,
+ /obj/item/weaponcrafting/silkstring = 1)
+ time = 45 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/maint
+ name = "Makeshift Bow"
+ result = /obj/item/gun/ballistic/bow/maint
+ reqs = list(/obj/item/pipe = 5,
+ /obj/item/stack/tape = 3,
+ /obj/item/stack/cable_coil = 10)
+ time = 45 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/woodenbow
+ name = "Wooden Bow"
+ result = /obj/item/gun/ballistic/bow
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 8,
+ /obj/item/stack/sheet/metal = 2,
+ /obj/item/weaponcrafting/silkstring = 1)
+ time = 12 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/woodencrossbow
+ name = "Wooden Crossbow"
+ result = /obj/item/gun/ballistic/bow/crossbow
+ reqs = list(/obj/item/gun/ballistic/bow = 1,
+ /obj/item/stack/sheet/mineral/wood = 2,
+ /obj/item/stack/sheet/metal = 1,
+ /obj/item/weaponcrafting/receiver = 1,
+ /obj/item/weaponcrafting/stock = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 16 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/ishotgun
+ name = "Improvised Shotgun"
+ result = /obj/item/gun/ballistic/shotgun/doublebarrel/improvised
+ reqs = list(/obj/item/weaponcrafting/receiver = 1,
+ /obj/item/pipe = 1,
+ /obj/item/weaponcrafting/stock = 1,
+ /obj/item/stack/packageWrap = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 10 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/gauss
+ name = "Makeshift gauss rifle"
+ reqs = list(/obj/item/stock_parts/cell = 1,
+ /obj/item/weaponcrafting/stock = 1,
+ /obj/item/weaponcrafting/receiver = 1,
+ /obj/item/stack/tape = 1,
+ /obj/item/stack/rods = 4,
+ /obj/item/stack/cable_coil = 10)
+ tools = list(TOOL_SCREWDRIVER,TOOL_WELDER,TOOL_WRENCH)
+ result = /obj/item/gun/ballistic/gauss
+ time = 12
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chainsaw
+ name = "Chainsaw"
+ result = /obj/item/twohanded/required/chainsaw
+ reqs = list(/obj/item/circular_saw = 1,
+ /obj/item/stack/cable_coil = 3,
+ /obj/item/stack/sheet/plasteel = 5)
+ tools = list(TOOL_WELDER)
+ time = 5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/spear
+ name = "Spear"
+ result = /obj/item/twohanded/spear
+ reqs = list(/obj/item/restraints/handcuffs/cable = 1,
+ /obj/item/shard = 1,
+ /obj/item/stack/rods = 1)
+ parts = list(/obj/item/shard = 1)
+ time = 4 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/extendohand
+ name = "Extendo-Hand"
+ reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
+ result = /obj/item/extendohand
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chemical_payload
+ name = "Chemical Payload (C4)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/grenade/plastic/c4 = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 3 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chemical_payload2
+ name = "Chemical Payload (Gibtonite)"
+ result = /obj/item/bombcore/chemical
+ reqs = list(
+ /obj/item/stock_parts/matter_bin = 1,
+ /obj/item/twohanded/required/gibtonite = 1,
+ /obj/item/grenade/chem_grenade = 2
+ )
+ parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
+ time = 5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/goliathshield
+ name = "Goliath shield"
+ result = /obj/item/shield/riot/goliath
+ time = 6 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bonesword
+ name = "Bone Sword"
+ result = /obj/item/claymore/bone
+ time = 4 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 3,
+ /obj/item/stack/sheet/sinew = 2)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bone_bow
+ name = "Bone Bow"
+ result = /obj/item/gun/ballistic/bow/ashen
+ time = 20 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 8,
+ /obj/item/stack/sheet/sinew = 4)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bonedagger
+ name = "Bone Dagger"
+ result = /obj/item/kitchen/knife/combat/bone
+ time = 2 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/bonespear
+ name = "Bone Spear"
+ result = /obj/item/twohanded/bonespear
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/boneaxe
+ name = "Bone Axe"
+ result = /obj/item/twohanded/fireaxe/boneaxe
+ time = 5 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 6,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/chitinspear
+ name = "Chitin Spear"
+ result = /obj/item/twohanded/bonespear/chitinspear //take a bonespear, reinforce it with some chitin and resin, profit?
+ time = 7.5 SECONDS
+ reqs = list(/obj/item/twohanded/bonespear = 1,
+ /obj/item/stack/sheet/sinew = 3,
+ /obj/item/stack/sheet/ashresin = 1,
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 6)
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
+ name = "Pneumatic Cannon"
+ result = /obj/item/pneumatic_cannon/ghetto
+ tools = list(TOOL_WELDER, TOOL_WRENCH)
+ reqs = list(/obj/item/stack/sheet/metal = 4,
+ /obj/item/stack/packageWrap = 8,
+ /obj/item/pipe = 2)
+ time = 5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+// Shank - Makeshift weapon that can embed on throw
+/datum/crafting_recipe/shank
+ name = "Shank"
+ reqs = list(/obj/item/shard = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/stack/cable_coil = 10)
+ result = /obj/item/kitchen/knife/shank
+ time = 1 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
+
+// Ammo
+
+/datum/crafting_recipe/pulseslug
+ name = "Pulse Slug Shell"
+ result = /obj/item/ammo_casing/shotgun/pulseslug
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor/adv = 2,
+ /obj/item/stock_parts/micro_laser/ultra = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/dragonsbreath
+ name = "Dragonsbreath Shell"
+ result = /obj/item/ammo_casing/shotgun/dragonsbreath
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ionslug
+ name = "Ion Scatter Shell"
+ result = /obj/item/ammo_casing/shotgun/ion
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/micro_laser/ultra = 1,
+ /obj/item/stock_parts/subspace/crystal = 1)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/improvisedslug
+ name = "Improvised Shotgun Shell"
+ result = /obj/item/ammo_casing/shotgun/improvised
+ reqs = list(/obj/item/grenade/chem_grenade = 1,
+ /obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/cable_coil = 1,
+ /datum/reagent/fuel = 10)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/laserbuckshot
+ name = "Laser Buckshot Shell"
+ result = /obj/item/ammo_casing/shotgun/laserbuckshot
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor/adv = 1,
+ /obj/item/stock_parts/micro_laser/high = 2)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/thundershot
+ name = "Thundershot Shell"
+ result = /obj/item/ammo_casing/shotgun/thundershot
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stock_parts/capacitor/super = 1,
+ /datum/reagent/teslium = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/depleteduraniumslug
+ name = "Depleted Uranium Slug Shell"
+ result = /obj/item/ammo_casing/shotgun/uraniumpenetrator
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /obj/item/stack/sheet/mineral/uranium = 3,
+ /obj/item/stack/rods = 2,
+ /datum/reagent/thermite = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/cryoshot
+ name = "Cryoshot Shell"
+ result = /obj/item/ammo_casing/shotgun/cryoshot
+ reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
+ /datum/reagent/medicine/c2/rhigoxane = 5)
+ tools = list(TOOL_SCREWDRIVER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/laserslug
+ name = "Bolts"
+ result = /obj/item/ammo_casing/caseless/bolts
+ reqs = list(/obj/item/stack/rods = 1)
+ tools = list(TOOL_WIRECUTTER)
+ time = 0.5 SECONDS
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/wood_arrow
+ name = "Wood Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/wood
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/stack/sheet/silk = 1,
+ /obj/item/stack/rods = 1) //1 metal sheet = 2 rods= 2 arrows
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/ashen_arrow
+ name = "Fire hardened arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/ash
+ tools = list(TOOL_WELDER)
+ time = 3 SECONDS
+ reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bone_tipped_arrow
+ name = "Bone Tipped Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bone_tipped
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/ammo_casing/caseless/arrow/ash = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bone_arrow
+ name = "Bone Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bone
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/chitin_arrow
+ name = "Chitin Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/chitin
+ time = 3 SECONDS
+ reqs = list(/obj/item/ammo_casing/caseless/arrow/bone = 1,
+ /obj/item/stack/sheet/sinew = 1,
+ /obj/item/stack/sheet/ashresin = 1,
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 2)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bamboo_arrow
+ name = "Bamboo Arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bamboo
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/bronze_arrow
+ name = "Bronze arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/bronze
+ time = 3 SECONDS
+ reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/stack/tile/bronze = 1,
+ /obj/item/stack/sheet/silk = 1)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/glass_arrow
+ name = "Glass arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/glass
+ time = 3 SECONDS
+ reqs = list(/obj/item/shard = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/stack/cable_coil = 3)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
+
+/datum/crafting_recipe/plasma_glass_arrow
+ name = "Plasma glass arrow"
+ result = /obj/item/ammo_casing/caseless/arrow/glass/plasma
+ time = 3 SECONDS
+ reqs = list(/obj/item/shard/plasma = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/stack/cable_coil = 3)
+ category = CAT_WEAPONRY
+ subcategory = CAT_AMMO
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index d0b34ff8af57..03fee51d9cf2 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -153,19 +153,6 @@
to_chat(mob_viewer, span_notice("You succesfuly remove the durathread strand."))
L.remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
-
-/datum/status_effect/pacify/on_creation(mob/living/new_owner, set_duration)
- if(isnum(set_duration))
- duration = set_duration
- . = ..()
-
-/datum/status_effect/pacify/on_apply()
- ADD_TRAIT(owner, TRAIT_PACIFISM, "status_effect")
- return ..()
-
-/datum/status_effect/pacify/on_remove()
- REMOVE_TRAIT(owner, TRAIT_PACIFISM, "status_effect")
-
//OTHER DEBUFFS
/datum/status_effect/pacify
id = "pacify"
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 0996bb4048aa..b55dcbd101b1 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -9,6 +9,8 @@
flags_1 = CONDUCT_1
force = 3
throwforce = 10
+ var/acti_sound = 'sound/items/welderactivate.ogg'
+ var/deac_sound = 'sound/items/welderdeactivate.ogg'
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL
@@ -16,6 +18,7 @@
resistance_flags = FIRE_PROOF
var/status = FALSE
var/lit = FALSE //on or off
+ light_color = LIGHT_COLOR_FIRE
var/operating = FALSE//cooldown
var/obj/item/weldingtool/weldtool = null
var/obj/item/assembly/igniter/igniter = null
@@ -159,11 +162,15 @@
to_chat(user, span_notice("You [lit ? "extinguish" : "ignite"] [src]!"))
lit = !lit
if(lit)
+ set_light(1)
+ playsound(loc, acti_sound, 50, TRUE)
START_PROCESSING(SSobj, src)
if(!warned_admins)
message_admins("[ADMIN_LOOKUPFLW(user)] has lit a flamethrower.")
warned_admins = TRUE
else
+ set_light(0)
+ playsound(loc, deac_sound, 50, TRUE)
STOP_PROCESSING(SSobj,src)
update_icon()
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index d21816293e57..e3575748d999 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -439,7 +439,7 @@
/obj/item/book/granter/crafting_recipe/weapons
name = "makeshift weapons 101"
desc = "A book filled with directions on how to make various weaponry."
- crafting_recipe_types = list(/datum/crafting_recipe/baseball_bat, /datum/crafting_recipe/lance, /datum/crafting_recipe/knifeboxing, /datum/crafting_recipe/flamethrower, /datum/crafting_recipe/pipebomb, /datum/crafting_recipe/makeshiftpistol, /datum/crafting_recipe/makeshiftmagazine, /datum/crafting_recipe/makeshiftsuppressor, /datum/crafting_recipe/makeshiftcrowbar, /datum/crafting_recipe/makeshiftwrench, /datum/crafting_recipe/makeshiftwirecutters, /datum/crafting_recipe/makeshiftweldingtool, /datum/crafting_recipe/makeshiftmultitool, /datum/crafting_recipe/makeshiftscrewdriver, /datum/crafting_recipe/makeshiftknife, /datum/crafting_recipe/makeshiftpickaxe, /datum/crafting_recipe/makeshiftradio)
+ crafting_recipe_types = list(/datum/crafting_recipe/baseball_bat, /datum/crafting_recipe/lance, /datum/crafting_recipe/knifeboxing, /datum/crafting_recipe/flamethrower, /datum/crafting_recipe/pipebomb, /datum/crafting_recipe/makeshiftpistol, /datum/crafting_recipe/makeshiftmagazine, /datum/crafting_recipe/makeshiftsuppressor, /datum/crafting_recipe/makeshiftcrowbar, /datum/crafting_recipe/makeshiftwrench, /datum/crafting_recipe/makeshiftwirecutters, /datum/crafting_recipe/makeshiftweldingtool, /datum/crafting_recipe/makeshiftmultitool, /datum/crafting_recipe/makeshiftscrewdriver, /datum/crafting_recipe/makeshiftknife, /datum/crafting_recipe/makeshiftpickaxe, /datum/crafting_recipe/makeshiftradio, /datum/crafting_recipe/bola_arrow, /datum/crafting_recipe/flaming_arrow)
icon_state = "bookCrafting"
oneuse = TRUE
@@ -448,4 +448,25 @@
desc = "A book containing knowledge how to make roburgers."
crafting_recipe_types = list(/datum/crafting_recipe/food/roburger)
icon_state = "bookCrafting"
- oneuse = FALSE
\ No newline at end of file
+ oneuse = FALSE
+
+// For testing
+/obj/item/book/granter/crafting_recipe/ashwalker
+ name = "sandstone slab"
+ desc = "A book filled with directions on how to make various tribal clothes and weapons."
+ icon_state = "stone_tablet"
+ crafting_recipe_types = list(/datum/crafting_recipe/bola_arrow,
+ /datum/crafting_recipe/flaming_arrow,
+ /datum/crafting_recipe/raider_leather,
+ /datum/crafting_recipe/tribal_wraps,
+ /datum/crafting_recipe/ash_robe,
+ /datum/crafting_recipe/ash_robe/young,
+ /datum/crafting_recipe/ash_robe/hunter,
+ /datum/crafting_recipe/ash_robe/chief,
+ /datum/crafting_recipe/ash_robe/shaman,
+ /datum/crafting_recipe/ash_robe/tunic,
+ /datum/crafting_recipe/ash_robe/dress,
+ /datum/crafting_recipe/shamanash,
+ /datum/crafting_recipe/tribalmantle,
+ /datum/crafting_recipe/leathercape,
+ /datum/crafting_recipe/hidemantle)
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 17ce5a465826..69fa372d66cf 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -342,6 +342,9 @@
name = "bola"
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
icon_state = "bola"
+ item_state = "bola"
+ lefthand_file = 'icons/mob/inhands/weapons/thrown_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/thrown_righthand.dmi'
breakouttime = 35//easy to apply, easy to break out of
gender = NEUTER
break_strength = 3
@@ -353,34 +356,52 @@
playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
+ if(..())//if it gets caught or the target can't be cuffed,
return//abort
- var/mob/living/carbon/C = hit_atom
- if(!C.legcuffed && C.get_num_legs(FALSE) >= 2)
- visible_message(span_danger("\The [src] ensnares [C]!"))
- C.legcuffed = src
- forceMove(C)
- C.update_inv_legcuffed()
- SSblackbox.record_feedback("tally", "handcuffs", 1, type)
- to_chat(C, span_userdanger("\The [src] ensnares you!"))
- C.Immobilize(immobilize)
- playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
+ if(iscarbon(hit_atom))
+ return impactCarbon(hit_atom, throwingdatum)
+ if(isanimal(hit_atom))
+ return impactAnimal(hit_atom, throwingdatum)
+
+/obj/item/restraints/legcuffs/bola/proc/impactCarbon(mob/living/carbon/hit_carbon, datum/thrownthing/throwingdatum)
+ if(hit_carbon.legcuffed || !hit_carbon.get_num_legs(FALSE) >= 2)
+ return
+ visible_message(span_danger("\The [src] ensnares [hit_carbon]!"))
+ hit_carbon.legcuffed = src
+ forceMove(hit_carbon)
+ hit_carbon.update_inv_legcuffed()
+ SSblackbox.record_feedback("tally", "handcuffs", 1, type)
+ to_chat(hit_carbon, span_userdanger("\The [src] ensnares you!"))
+ hit_carbon.Immobilize(immobilize)
+ playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
+
+/obj/item/restraints/legcuffs/bola/proc/impactAnimal(mob/living/simple_animal/hit_animal, datum/thrownthing/throwingdatum)
+ return // Does nothing by default
/obj/item/restraints/legcuffs/bola/tactical//traitor variant
name = "reinforced bola"
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
icon_state = "bola_r"
+ item_state = "bola_r"
breakouttime = 70
immobilize = 20
break_strength = 4
+/obj/item/restraints/legcuffs/bola/watcher //tribal bola for tribal lizards
+ name = "watcher Bola"
+ desc = "A Bola made from the stretchy sinew of fallen watchers."
+ icon_state = "bola_watcher"
+ item_state = "bola_watcher"
+ breakouttime = 45
+
/obj/item/restraints/legcuffs/bola/energy //For Security
name = "energy bola"
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
icon_state = "ebola"
+ item_state = "ebola"
hitsound = 'sound/weapons/taserhit.ogg'
w_class = WEIGHT_CLASS_SMALL
- breakouttime = 60
+ breakouttime = 6 SECONDS
break_strength = 2
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
@@ -394,15 +415,14 @@
name = "gonbola"
desc = "Hey, if you have to be hugged in the legs by anything, it might as well be this little guy."
icon_state = "gonbola"
+ item_state = "ebola"
breakouttime = 300
slowdown = 0
var/datum/status_effect/gonbolaPacify/effectReference
-/obj/item/restraints/legcuffs/bola/gonbola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/restraints/legcuffs/bola/gonbola/impactCarbon(mob/living/carbon/hit_carbon, datum/thrownthing/throwingdatum)
. = ..()
- if(iscarbon(hit_atom))
- var/mob/living/carbon/C = hit_atom
- effectReference = C.apply_status_effect(STATUS_EFFECT_GONBOLAPACIFY)
+ effectReference = hit_carbon.apply_status_effect(STATUS_EFFECT_GONBOLAPACIFY)
/obj/item/restraints/legcuffs/bola/gonbola/dropped(mob/user)
. = ..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 0b23bc01be72..5535f8bc3ca3 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -300,6 +300,15 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 70), \
new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 10), \
new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 30, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("bamboo stool", /obj/structure/chair/stool/bamboo, 2, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, 1, 4, 20), \
+ null, \
+ new/datum/stack_recipe_list("bamboo benches", list(
+ new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE)
+ )), \
))
/obj/item/stack/sheet/mineral/bamboo
@@ -362,9 +371,36 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cloth
+ is_fabric = TRUE
+ pull_effort = 2 SECONDS
+ loom_result = /obj/item/stack/sheet/silk
drop_sound = 'sound/items/handling/cloth_drop.ogg'
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
+/*
+ * Silk
+ */
+
+GLOBAL_LIST_INIT(silk_recipes, list ( \
+ new/datum/stack_recipe("silk string", /obj/item/weaponcrafting/silkstring, 2, time = 40)
+ ))
+
+/obj/item/stack/sheet/silk
+ name = "silk"
+ desc = "A long soft material. This one is made from cotton rather than spidersilk."
+ singular_name = "Silk Sheet"
+ icon_state = "sheet-silk"
+ item_state = "sheet-silk"
+ icon = 'icons/obj/stack_objects.dmi'
+ novariants = TRUE
+ merge_type = /obj/item/stack/sheet/silk
+ drop_sound = 'sound/items/handling/cloth_drop.ogg'
+ pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
+
+/obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.silk_recipes
+ return ..()
+
/obj/item/stack/sheet/cloth/durathread
name = "durathread"
desc = "A fabric sown from incredibly durable threads, known for its usefulness in armor production."
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 8cef94bb85e6..8f0808ac5bda 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -153,6 +153,16 @@
turf_type = /turf/open/floor/wood
resistance_flags = FLAMMABLE
+//Bamboo
+/obj/item/stack/tile/bamboo
+ name = "bamboo mat pieces"
+ singular_name = "bamboo mat piece"
+ desc = "A piece of a bamboo mat with a decorative trim."
+ icon_state = "tile-bamboo"
+ item_state = "tile-bamboo"
+ turf_type = /turf/open/floor/bamboo
+ resistance_flags = FLAMMABLE
+
//Basalt
/obj/item/stack/tile/basalt
name = "basalt tile"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index ada013637571..092005f3fd8b 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -332,7 +332,9 @@
/obj/item/storage/bag/plants,
/obj/item/stack/marker_beacon,
/obj/item/handdrill,
- /obj/item/jawsoflife
+ /obj/item/jawsoflife,
+ /obj/item/restraints/legcuffs/bola/watcher,
+ /obj/item/claymore/bone
))
@@ -619,7 +621,44 @@
var/static/items_inside = list(
/obj/item/gun/ballistic/revolver/detective = 1,
/obj/item/ammo_box/c38 = 2)
- generate_items_inside(items_inside,src)
+ generate_items_inside(items_inside, src)
+
+/obj/item/storage/belt/quiver
+ name = "leather quiver"
+ desc = "A quiver made from the hide of some animal. Used to hold arrows."
+ icon_state = "quiver"
+ item_state = "quiver"
+
+/obj/item/storage/belt/quiver/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 15
+ STR.display_numerical_stacking = TRUE
+ STR.set_holdable(list(
+ /obj/item/ammo_casing/caseless/arrow,
+ /obj/item/stand_arrow,
+ /obj/item/throwing_star/magspear
+ ))
+
+/obj/item/storage/belt/quiver/ashwalker/PopulateContents()
+ for(var/i in 1 to 10)
+ new /obj/item/ammo_casing/caseless/arrow/bone(src)
+
+/obj/item/storage/belt/quiver/admin
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/storage/belt/quiver/admin/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_combined_w_class = 100
+ STR.max_items = 100
+
+/obj/item/storage/belt/quiver/admin/full/PopulateContents()
+ for(var/arrow in typesof(/obj/item/ammo_casing/caseless/arrow))
+ if(istype(arrow, /obj/item/ammo_casing/caseless/arrow/energy))
+ continue
+ for(var/i in 1 to 10)
+ new arrow(src)
/obj/item/storage/belt/fannypack
name = "fannypack"
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index f7cdce24db31..963c57088e4a 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -256,6 +256,16 @@
icon_state = "bar"
item_chair = /obj/item/chair/stool/bar
+/obj/structure/chair/stool/bamboo
+ name = "bamboo stool"
+ desc = "A makeshift bamboo stool with a rustic look."
+ icon_state = "bamboo_stool"
+ resistance_flags = FLAMMABLE
+ max_integrity = 60
+ buildstacktype = /obj/item/stack/sheet/mineral/bamboo
+ buildstackamount = 2
+ item_chair = /obj/item/chair/stool/bamboo
+
/obj/item/chair
name = "chair"
desc = "Bar brawl essential."
@@ -350,6 +360,15 @@
item_state = "stool_bar"
origin_type = /obj/structure/chair/stool/bar
+/obj/item/chair/stool/bamboo
+ name = "bamboo stool"
+ icon_state = "bamboo_stool_toppled"
+ item_state = "stool_bamboo"
+ hitsound = 'sound/weapons/genhit1.ogg'
+ origin_type = /obj/structure/chair/stool/bamboo
+ materials = null
+ break_chance = 50 //Submissive and breakable unlike the chad iron stool
+
/obj/item/chair/stool/narsie_act()
return //sturdy enough to ignore a god
diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm
index f75654ac22b1..9f2d3d0f7fcc 100644
--- a/code/game/objects/structures/beds_chairs/sofa.dm
+++ b/code/game/objects/structures/beds_chairs/sofa.dm
@@ -13,3 +13,19 @@
/obj/structure/chair/sofa/corner
icon_state = "sofacorner"
+
+// Bamboo benches
+/obj/structure/chair/sofa/bamboo
+ name = "bamboo bench"
+ desc = "A makeshift bench with a rustic aesthetic."
+ icon_state = "bamboo_sofamiddle"
+ resistance_flags = FLAMMABLE
+ max_integrity = 60
+ buildstacktype = /obj/item/stack/sheet/mineral/bamboo
+ buildstackamount = 3
+
+/obj/structure/chair/sofa/bamboo/left
+ icon_state = "bamboo_sofaend_left"
+
+/obj/structure/chair/sofa/bamboo/right
+ icon_state = "bamboo_sofaend_right"
diff --git a/code/game/objects/structures/crates_lockers/crates/wooden.dm b/code/game/objects/structures/crates_lockers/crates/wooden.dm
index ed7e6027fefd..ea6f2bc9cd95 100644
--- a/code/game/objects/structures/crates_lockers/crates/wooden.dm
+++ b/code/game/objects/structures/crates_lockers/crates/wooden.dm
@@ -16,4 +16,36 @@
new /obj/item/pneumatic_cannon/pie(src)
new /obj/item/reagent_containers/food/snacks/pie/cream(src)
new /obj/item/storage/crayons(src)
- new /obj/item/bikehorn/rubber_pigeon(src) //yogs a single rubber pigeon
\ No newline at end of file
+ new /obj/item/bikehorn/rubber_pigeon(src) //yogs a single rubber pigeon
+
+/obj/structure/closet/crate/wooden/ashwalker
+ name = "tribal clothing box"
+ desc = "An wooden box covered in ash, contains clothing used by an ashwalker tribe."
+
+/obj/structure/closet/crate/wooden/ashwalker/PopulateContents()
+ . = ..()
+ new /obj/item/clothing/under/chestwrap(src)
+ new /obj/item/clothing/under/chestwrap(src)
+ new /obj/item/clothing/under/ash_robe(src)
+ new /obj/item/clothing/under/ash_robe(src)
+ new /obj/item/clothing/under/ash_robe(src)
+ new /obj/item/clothing/under/ash_robe/young(src)
+ new /obj/item/clothing/under/ash_robe/young(src)
+ new /obj/item/clothing/under/ash_robe/hunter(src)
+ new /obj/item/clothing/under/ash_robe/hunter(src)
+ new /obj/item/clothing/under/ash_robe/chief(src)
+ new /obj/item/clothing/under/ash_robe/shaman(src)
+ new /obj/item/clothing/neck/cloak/tribalmantle(src)
+ new /obj/item/clothing/neck/cloak/tribalmantle(src)
+ new /obj/item/clothing/suit/hooded/cloak/goliath/desert(src)
+ new /obj/item/clothing/suit/hooded/cloak/goliath/desert(src)
+ new /obj/item/clothing/suit/leather_mantle(src)
+ new /obj/item/clothing/suit/leather_mantle(src)
+
+// Testing
+/obj/structure/closet/crate/wooden/ashwalker/extra/PopulateContents()
+ . = ..()
+ new /obj/item/clothing/under/raider_leather(src)
+ new /obj/item/clothing/under/tribal(src)
+ new /obj/item/clothing/under/ash_robe/tunic(src)
+ new /obj/item/clothing/under/ash_robe/dress(src)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index a0c2991c5b75..398153724a21 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -290,6 +290,15 @@
walltype = /turf/closed/wall/mineral/wood
canSmoothWith = list(/obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood)
+/obj/structure/falsewall/bamboo
+ name = "bamboo wall"
+ desc = "A wall with bamboo finish. Zen."
+ icon = 'icons/turf/walls/bamboo_wall.dmi'
+ icon_state = "bamboo"
+ mineral = /obj/item/stack/sheet/mineral/bamboo
+ walltype = /turf/closed/wall/mineral/bamboo
+ canSmoothWith = list(/obj/structure/falsewall/bamboo, /turf/closed/wall/mineral/bamboo)
+
/obj/structure/falsewall/iron
name = "rough metal wall"
desc = "A wall with rough metal plating."
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index c9e883920a38..01034c9dd052 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -57,11 +57,6 @@
new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
- if(ishuman(new_spawn))
- var/mob/living/carbon/human/H = new_spawn
- H.underwear = "Nude"
- H.update_body()
-
/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam)
. = ..()
var/area/A = get_area(src)
@@ -70,9 +65,54 @@
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACKORBIT, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
/datum/outfit/ashwalker
- name ="Ashwalker"
- head = /obj/item/clothing/head/helmet/gladiator
- uniform = /obj/item/clothing/under/gladiator/ash_walker
+ name = "Ashwalker"
+ uniform = /obj/item/clothing/under/chestwrap
+
+/datum/outfit/ashwalker/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ H.underwear = "Nude"
+ H.update_body()
+
+/datum/outfit/ashwalker/tribesperson
+ name = "Ashwalker Tribesperson"
+ uniform = /obj/item/clothing/under/ash_robe
+
+/datum/outfit/ashwalker/hunter
+ name = "Ashwalker Hunter"
+ uniform = /obj/item/clothing/under/ash_robe/hunter
+ suit = /obj/item/clothing/suit/hooded/cloak/goliath/desert
+ back = /obj/item/gun/ballistic/bow/ashen
+ belt = /obj/item/storage/belt/quiver/ashwalker
+ shoes = /obj/item/clothing/shoes/xeno_wraps
+
+/datum/outfit/ashwalker/warrior
+ name = "Ashwalker Warrior"
+ uniform = /obj/item/clothing/under/tribal
+ head = /obj/item/clothing/head/helmet/skull
+ suit = /obj/item/clothing/suit/armor/bone/heavy
+ back = /obj/item/twohanded/bonespear
+ gloves = /obj/item/clothing/gloves/bracer
+ belt = /obj/item/storage/belt/mining/primitive
+ shoes = /obj/item/clothing/shoes/xeno_wraps
+ r_hand = /obj/item/shield/riot/goliath
+ l_hand = /obj/item/claymore/bone
+
+/datum/outfit/ashwalker/chief
+ name = "Ashwalker Chief"
+ uniform = /obj/item/clothing/under/ash_robe/chief
+ head = /obj/item/clothing/head/crown/resin
+ suit = /obj/item/clothing/suit/armor/bone
+ back = /obj/item/twohanded/bonespear/chitinspear
+ gloves = /obj/item/clothing/gloves/color/black/goliath
+ shoes = /obj/item/clothing/shoes/xeno_wraps/goliath
+ neck = /obj/item/clothing/neck/cloak/tribalmantle
+
+/datum/outfit/ashwalker/shaman
+ name = "Ashwalker Shaman"
+ uniform = /obj/item/clothing/under/ash_robe/shaman
+ head = /obj/item/clothing/head/shamanash
+ suit = /obj/item/clothing/suit/leather_mantle
+ belt = /obj/item/storage/bag/medpouch
+ gloves = /obj/item/clothing/gloves/color/black/goliath
//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past.
diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm
index a76c4bb1b18c..68c1f77770b4 100644
--- a/code/game/objects/structures/headpike.dm
+++ b/code/game/objects/structures/headpike.dm
@@ -2,26 +2,37 @@
name = "spooky head on a spear"
desc = "When you really want to send a message."
icon = 'icons/obj/structures.dmi'
- icon_state = "headpike"
density = FALSE
anchored = TRUE
- var/bonespear = FALSE
var/obj/item/twohanded/spear/spear
var/obj/item/bodypart/head/victim
+/obj/structure/headpike/glass //for regular spears
+ icon_state = "headpike"
+
/obj/structure/headpike/bone //for bone spears
icon_state = "headpike-bone"
- bonespear = TRUE
+
+/obj/structure/headpike/bamboo //for bamboo spears
+ icon_state = "headpike-bamboo"
/obj/structure/headpike/CheckParts(list/parts_list)
- ..()
victim = locate(/obj/item/bodypart/head) in parts_list
name = "[victim.name] on a spear"
+ ..()
update_icon()
- if(bonespear)
- spear = locate(/obj/item/twohanded/bonespear) in parts_list
- else
- spear = locate(/obj/item/twohanded/spear) in parts_list
+
+/obj/structure/headpike/glass/CheckParts(list/parts_list)
+ spear = locate(/obj/item/twohanded/spear) in parts_list
+ ..()
+
+/obj/structure/headpike/bone/CheckParts(list/parts_list)
+ spear = locate(/obj/item/twohanded/bonespear) in parts_list
+ ..()
+
+/obj/structure/headpike/bamboo/CheckParts(list/parts_list)
+ spear = locate(/obj/item/twohanded/bamboospear) in parts_list
+ ..()
/obj/structure/headpike/Initialize()
. = ..()
@@ -45,4 +56,4 @@
victim = null
spear.forceMove(drop_location())
spear = null
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9d5cc5b019a8..4101efd3ac69 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -50,7 +50,7 @@
"oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar",
"carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5",
"ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11",
- "ironsand12", "ironsand13", "ironsand14", "ironsand15")
+ "ironsand12", "ironsand13", "ironsand14", "ironsand15", "bamboo", "bamboosymbol", "bamboostar")
if(broken || burnt || (icon_state in icons_to_ignore_at_floor_init)) //so damaged/burned tiles or plating icons aren't saved as the default
icon_state_regular_floor = "floor"
icon_regular_floor = 'icons/turf/floors.dmi'
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 54b9b06dabd4..9e1f148f50aa 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -70,6 +70,25 @@
/turf/open/floor/wood/lavaland
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+/turf/open/floor/bamboo
+ desc = "A bamboo mat with a decorative trim."
+ icon = 'icons/turf/floors/bamboo_mat.dmi'
+ icon_state = "bamboo"
+ floor_tile = /obj/item/stack/tile/bamboo
+ broken_states = list("damaged")
+ smooth = SMOOTH_TRUE
+ canSmoothWith = list(/turf/open/floor/bamboo)
+ flags_1 = NONE
+ footstep = FOOTSTEP_WOOD
+ barefootstep = FOOTSTEP_WOOD_BAREFOOT
+ clawfootstep = FOOTSTEP_WOOD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
+ tiled_dirt = FALSE
+
+/turf/open/floor/carpet/examine(mob/user)
+ . = ..()
+ . += "There's a small crack on the edge of it."
+
/turf/open/floor/grass
name = "grass patch"
desc = "You can't tell if this is real grass or just cheap plastic imitation."
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index b588c3ee3edf..1b61e97445e7 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -135,6 +135,15 @@
explosion_block = 0
canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal)
+/turf/closed/wall/mineral/bamboo
+ name = "bamboo wall"
+ desc = "A wall with a bamboo finish."
+ icon = 'icons/turf/walls/bamboo_wall.dmi'
+ icon_state = "bamboo"
+ sheet_type = /obj/item/stack/sheet/mineral/bamboo
+ hardness = 60
+ canSmoothWith = list(/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo)
+
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.is_sharp() && W.force)
var/duration = (48/W.force) * 2 //In seconds, for now.
diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm
index f43ac79dbe98..c25d3b8b693b 100644
--- a/code/modules/antagonists/ashwalker/ashwalker.dm
+++ b/code/modules/antagonists/ashwalker/ashwalker.dm
@@ -28,6 +28,9 @@
/datum/antagonist/ashwalker/on_gain()
. = ..()
+ var/obj/item/book/granter/crafting_recipe/ashwalker/crafting_book
+ for(var/datum/crafting_recipe/R in crafting_book.crafting_recipe_types)
+ owner.teach_crafting_recipe(R)
RegisterSignal(owner.current, COMSIG_MOB_EXAMINATE, .proc/on_examinate)
/datum/antagonist/ashwalker/on_removal()
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
index ab60ee5ddfee..54e011f7c563 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm
@@ -195,6 +195,25 @@
desc = "Calls a Ratvarian spear into your hands to fight your enemies."
weapon_type = /obj/item/clockwork/weapon/ratvarian_spear
+//Brass Bow: Creates a brass bow, which is capable of firing redlight arrows.
+/datum/clockwork_scripture/create_object/brass_bow
+ descname = "Self Recharging Ranged Weapon"
+ name = "Brass Bow"
+ desc = "Creates a bow capable of firing redlight arrows, doing moderate damage but recharges after use. The bow will recharge after 1 1/2 seconds."
+ invocations = list("Grant me armaments...", "...from the forge of Armorer!") // Temp text
+ channel_time = 10
+ power_cost = 400
+ whispered = TRUE
+ object_path = /obj/item/gun/ballistic/bow/energy/clockwork
+ creator_message = span_brass("You form a Brass Bow, which is capable of firing redlight arrows.")
+ usage_tip = "The bow will recharge after 1 1/2 seconds."
+ tier = SCRIPTURE_SCRIPT
+ space_allowed = TRUE
+ primary_component = BELLIGERENT_EYE
+ sort_priority = 6
+ quickbind = TRUE
+ quickbind_desc = "Creates a brass bow capable of firing redlight arrows, doing moderate damage but recharges after use."
+
//Spatial Gateway: Allows the invoker to teleport themselves and any nearby allies to a conscious servant or clockwork obelisk.
/datum/clockwork_scripture/spatial_gateway
@@ -210,7 +229,7 @@
usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal."
tier = SCRIPTURE_SCRIPT
primary_component = GEIS_CAPACITOR
- sort_priority = 6
+ sort_priority = 7
quickbind = TRUE
quickbind_desc = "Allows you to create a one-way Spatial Gateway to a living Servant or Clockwork Obelisk."
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 495bed220bf5..67552b798e27 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -266,6 +266,7 @@
name = "nar'sien bola"
desc = "A strong bola, bound with dark magic that allows it to pass harmlessly through Nar'sien cultists. Throw it to trip and slow your victim."
icon_state = "bola_cult"
+ item_state = "bola_cult"
breakouttime = 60
immobilize = 20
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
index 67deb271757f..26f182272b82 100644
--- a/code/modules/cargo/bounties/mining.dm
+++ b/code/modules/cargo/bounties/mining.dm
@@ -24,6 +24,12 @@
reward = 7500
wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe)
+/datum/bounty/item/mining/bone_bow
+ name = "Bone Bow"
+ description = "Central Command is holding an archery competition. Ship a special bow for our top athlete."
+ reward = 10000
+ wanted_types = list(/obj/item/gun/ballistic/bow/ashen)
+
/datum/bounty/item/mining/bone_armor
name = "Bone Armor"
description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor."
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 14a1be885058..891d72d95e61 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -66,6 +66,21 @@
qdel(src)
..()
+/obj/item/clothing/gloves/color/black/goliath
+ name = "goliath gloves"
+ desc = "Rudimentary gloves that aid in carrying."
+ icon_state = "goligloves"
+ item_state = "goligloves"
+
+/obj/item/clothing/gloves/color/black/goliath/equipped(mob/user, slot)
+ ..()
+ if(slot == SLOT_GLOVES)
+ ADD_TRAIT(user, TRAIT_QUICK_CARRY, CLOTHING_TRAIT)
+
+/obj/item/clothing/gloves/color/black/goliath/dropped(mob/user)
+ ..()
+ REMOVE_TRAIT(user, TRAIT_QUICK_CARRY, CLOTHING_TRAIT)
+
/obj/item/clothing/gloves/color/orange
name = "orange gloves"
desc = "A pair of gloves, they don't look special in any way."
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 888f05ae54c9..34709a41f34f 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -446,3 +446,8 @@
return
playsound(loc, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE)
recharge_time = world.time + recharge_rate
+
+/obj/item/clothing/head/shamanash
+ name = "shaman skull"
+ desc = "The skull of a long dead animal bolted to the front of a repurposed pan."
+ icon_state = "shamskull"
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 08eaf9ed707c..f4deb64f030c 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -352,43 +352,7 @@
desc = "Worn by the right hand of the captain. It smells faintly of bureaucracy."
icon_state = "hopcloak"
-/obj/item/clothing/suit/hooded/cloak/goliath
- name = "goliath cloak"
- icon_state = "goliath_cloak"
- desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
- resistance_flags = FIRE_PROOF
- hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
- body_parts_covered = CHEST|GROIN|ARMS
-
-/obj/item/clothing/head/hooded/cloakhood/goliath
- name = "goliath cloak hood"
- icon_state = "golhood"
- desc = "A protective & concealing hood."
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10)
- resistance_flags = FIRE_PROOF
- flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
- transparent_protection = HIDEMASK
-
-/obj/item/clothing/suit/hooded/cloak/drake
- name = "drake armour"
- icon_state = "dragon"
- desc = "A suit of armour fashioned from the remains of an ash drake."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear)
- armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
- hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
- heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | ACID_PROOF
- transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES
-
-/obj/item/clothing/head/hooded/cloakhood/drake
- name = "drake helm"
- icon_state = "dragon"
- desc = "The skull of a dragon."
- armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
- heat_protection = HEAD
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | ACID_PROOF
+/obj/item/clothing/neck/cloak/tribalmantle
+ name = "ornate mantle"
+ desc = "An ornate mantle commonly worn by a shaman or chieftain."
+ icon_state = "tribal-mantle"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 380df3a701ae..33f26ea16013 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -473,13 +473,10 @@
desc = "These make your feet feel snug and secure, while still being breathable and light."
icon_state = "footwraps_s"
item_state = "footwraps_s"
- strip_delay = 25 // Half time to take off
- equip_delay_other = 25 // Half time
+ strip_delay = 2.5 SECONDS // Half time to take off
+ equip_delay_other = 2.5 SECONDS // Half time
resistance_flags = NONE
permeability_coefficient = 0.70 // Fabric is more permeable than boot, but still somewhat resistant
- // pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes -- No storage pocket for wraps
- xenoshoe = EITHER_STYLE // This can be worn by digitigrade or straight legs, or a hybridization thereof (one prosthetic one digitigrade). Xenoshoe variable will default to NO_DIGIT, excluding digitigrade feet.
- mutantrace_variation = MUTANTRACE_VARIATION // Yes these shoes account for non-straight leg situations, such as jumpskirts
/obj/item/clothing/shoes/xeno_wraps/command // Not applicable unless 11505 merges - Digitigrade-exclusive shoes for Command positions
name = "command footwraps"
@@ -487,7 +484,41 @@
icon_state = "footwraps_c"
item_state = "footwraps_c"
xenoshoe = YES_DIGIT // This is digitigrade leg exclusive
- mutantrace_variation = MUTANTRACE_VARIATION // Yes these shoes account for non-straight leg situations, such as jumpskirts
+
+/obj/item/clothing/shoes/xeno_wraps/goliath
+ name = "goliath hide footwraps"
+ desc = "These make your feet feel snug and secure, while still being breathable and light."
+ icon_state = "footwraps_goliath"
+ item_state = "footwraps_goliath"
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0)
+ body_parts_covered = LEGS|FEET
+ resistance_flags = FIRE_PROOF
+ strip_delay = 2.5 SECONDS
+ equip_delay_other = 2.5 SECONDS
+
+/obj/item/clothing/shoes/xeno_wraps/dragon
+ name = "ash drake hide footwraps"
+ desc = "These make your feet feel snug and secure, while still being breathable and light."
+ icon_state = "footwraps_dragon"
+ item_state = "footwraps_dragon"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 15, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 15, "acid" = 0)
+ body_parts_covered = LEGS|FEET
+ strip_delay = 5 SECONDS
+ equip_delay_other = 5 SECONDS
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ permeability_coefficient = 0.70
+
+/obj/item/clothing/shoes/xeno_wraps/carpdragon
+ name = "carp dragon hide footwraps"
+ desc = "These make your feet feel snug and secure, while still being breathable and light."
+ icon_state = "footwraps_carpdragon"
+ item_state = "footwraps_carpdragon"
+ armor = list("melee" = 15, "bullet" = 15, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0)
+ body_parts_covered = LEGS|FEET
+ strip_delay = 5 SECONDS
+ equip_delay_other = 5 SECONDS
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ permeability_coefficient = 0.70
/obj/item/clothing/shoes/xeno_wraps/engineering
name = "engineering footwraps"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 81208ecbe063..48b456ae3dd8 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -140,6 +140,14 @@
armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10)
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS
+/obj/item/clothing/suit/armor/bone/heavy
+ name = "heavy bone armor"
+ desc = "A heavy tribal armor plate, crafted from a lot animal bone."
+ icon_state = "hbonearmor"
+ item_state = "hbonearmor"
+ armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 15, BOMB = 20, BIO = 0, RAD = 0, FIRE = 60, ACID = 30, WOUND = 20)
+ slowdown = 0.20
+
/obj/item/clothing/suit/armor/tribalcoat
name = "tribal coat"
desc = "A light yet tough leather coat reinforced with bone pauldrons."
@@ -318,3 +326,61 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
armor = list(MELEE = 30, BULLET = 30, LASER = 50, ENERGY = 15, BOMB = 30, BIO = 20, RAD = 10, FIRE = 80, ACID = 80, WOUND = 10)
slowdown = 0.9
+
+/obj/item/clothing/suit/hooded/cloak/goliath
+ name = "goliath cloak"
+ icon_state = "goliath_cloak"
+ desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival)
+ armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
+ resistance_flags = FIRE_PROOF
+ hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
+ body_parts_covered = CHEST|GROIN|ARMS
+
+/obj/item/clothing/head/hooded/cloakhood/goliath
+ name = "goliath cloak hood"
+ icon_state = "golhood"
+ desc = "A protective & concealing hood."
+ armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10)
+ resistance_flags = FIRE_PROOF
+ flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
+ transparent_protection = HIDEMASK
+
+/obj/item/clothing/suit/hooded/cloak/goliath/desert
+ name = "brown leather cape"
+ desc = "An ash coated cloak."
+ icon_state = "desertcloak"
+ armor = list()
+ resistance_flags = 0
+ hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath/desert
+
+/obj/item/clothing/head/hooded/cloakhood/goliath/desert
+ name = "goliath cloak hood"
+ icon_state = "desertcloak"
+ desc = "An ash coated cloak hood."
+ armor = list()
+ resistance_flags = 0
+ flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
+ transparent_protection = HIDEMASK
+
+/obj/item/clothing/suit/hooded/cloak/drake
+ name = "drake armour"
+ icon_state = "dragon"
+ desc = "A suit of armour fashioned from the remains of an ash drake."
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear)
+ armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
+ hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
+ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES
+
+/obj/item/clothing/head/hooded/cloakhood/drake
+ name = "drake helm"
+ icon_state = "dragon"
+ desc = "The skull of a dragon."
+ armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
+ heat_protection = HEAD
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 7b9432aec9a3..22345cb8829e 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -672,3 +672,8 @@
w_class = WEIGHT_CLASS_TINY
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
alternate_worn_layer = UNDER_HEAD_LAYER
+
+/obj/item/clothing/suit/leather_mantle
+ name = "hide mantle"
+ desc = "The tanned hide of some brown furred creature."
+ icon_state = "mantle_liz"
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
old mode 100755
new mode 100644
index 2c9fae1b1a5f..01057516b5ea
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -8,6 +8,7 @@
slot_flags = 0
w_class = WEIGHT_CLASS_SMALL
var/above_suit = FALSE
+ var/above_suit_adjustable = FALSE
var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed
var/datum/component/storage/detached_pockets
var/attachment_slot = CHEST
@@ -75,7 +76,7 @@
/obj/item/clothing/accessory/AltClick(mob/user)
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- if(initial(above_suit))
+ if(above_suit_adjustable)
above_suit = !above_suit
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
@@ -117,6 +118,7 @@
var/medaltype = "medal" //Sprite used for medalbox
var/commended = FALSE
above_suit = TRUE
+ above_suit_adjustable = TRUE
//Pinning medals on people
/obj/item/clothing/accessory/medal/attack(mob/living/carbon/human/M, mob/living/user)
@@ -252,6 +254,7 @@
item_color = "redband"
attachment_slot = null
above_suit = TRUE
+ above_suit_adjustable = TRUE
/obj/item/clothing/accessory/armband/deputy
name = "security deputy armband"
@@ -357,6 +360,7 @@
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
attachment_slot = null
above_suit = TRUE
+ above_suit_adjustable = TRUE
/obj/item/clothing/accessory/skullcodpiece
name = "skull codpiece"
@@ -364,6 +368,17 @@
icon_state = "skull"
item_color = "skull"
above_suit = TRUE
+ above_suit_adjustable = TRUE
+ armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
+ attachment_slot = GROIN
+
+/obj/item/clothing/accessory/skilt
+ name = "Sinew Skirt"
+ desc = "For the last time. IT'S A KILT not a skirt."
+ icon_state = "skilt"
+ item_color = "skilt"
+ above_suit_adjustable = TRUE
+ minimize_when_attached = FALSE
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
attachment_slot = GROIN
@@ -375,15 +390,20 @@
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25)
attachment_slot = null
above_suit = TRUE
+ above_suit_adjustable = TRUE
+
/////////////
//Poppy Pin//
/////////////
+
/obj/item/clothing/accessory/poppypin
name = "Poppy pins"
desc = "A poppy pin that is meant to commemorate the fallen soldiers in wars. It symbolizes the gunshot that killed the soldiers."
icon_state = "poppy"
item_color = "poppy"
+
+
//////////////
//Ooh shiny!//
//////////////
@@ -394,6 +414,7 @@
icon_state = "sing_necklace"
item_color = "sing_necklace"
above_suit = TRUE
+ above_suit_adjustable = TRUE
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = -5, FIRE = 0, ACID = 0) //It IS radioactive after all. Watch me get yelled at for powergaming because I'm making this my """donator""" item - Mqiib
attachment_slot = null
light_power = 2
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 515990037cad..51a317cfc8d7 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -923,3 +923,85 @@
item_state = "weiner"
item_color = "weiner"
can_adjust = FALSE
+
+// Ashwalker Clothes
+/obj/item/clothing/under/chestwrap
+ name = "loincloth and chestwrap"
+ desc = "A poorly sewn dress made of leather."
+ icon_state = "chestwrap"
+ has_sensor = NO_SENSORS
+ body_parts_covered = CHEST|GROIN
+
+/obj/item/clothing/under/raider_leather
+ name = "scavenged rags"
+ desc = "A porly made outfit made of scrapped materials."
+ icon_state = "raider_leather"
+ item_state = "raider_leather"
+ item_color = "raider_leather"
+ armor = list(MELEE = 5, FIRE = 5)
+ has_sensor = NO_SENSORS
+ can_adjust = FALSE
+ mutantrace_variation = MUTANTRACE_VARIATION
+
+/obj/item/clothing/under/tribal
+ name = "metal plated rags"
+ desc = "Thin metal bolted over poorly tanned leather."
+ icon_state = "tribal"
+ item_state = "tribal"
+ item_color = "tribal"
+ body_parts_covered = CHEST|GROIN|ARMS
+ armor = list(MELEE = 5)
+ has_sensor = NO_SENSORS
+ can_adjust = FALSE
+
+/obj/item/clothing/under/ash_robe
+ name = "tribal robes"
+ desc = "A robe from the ashlands. This one seems to be for common tribespeople."
+ icon_state = "robe_liz"
+ item_state = "robe_liz"
+ item_color = "robe_liz"
+ body_parts_covered = CHEST|GROIN
+ has_sensor = NO_SENSORS
+ can_adjust = FALSE
+
+/obj/item/clothing/under/ash_robe/young
+ name = "tribal rags"
+ desc = "Rags from Lavaland, coated with light ash. This one seems to be for the juniors of a tribe."
+ icon_state = "tribalrags"
+ item_state = "tribalrags"
+ item_color = "tribalrags"
+
+/obj/item/clothing/under/ash_robe/hunter
+ name = "hunter tribal rags"
+ desc = "A robe from the ashlands. This one seems to be for hunters."
+ icon_state = "hhunterrags"
+ item_state = "hhunterrags"
+ item_color = "hhunterrags"
+
+/obj/item/clothing/under/ash_robe/chief
+ name = "chief tribal rags"
+ desc = "Rags from Lavaland, coated with heavy ash. This one seems to be for the elders of a tribe."
+ icon_state = "chiefrags"
+ item_state = "chiefrags"
+ item_color = "chiefrags"
+
+/obj/item/clothing/under/ash_robe/shaman
+ name = "shaman tribal rags"
+ desc = "Rags from Lavaland, drenched with ash, it has fine jewel coated bones sewn around the neck. This one seems to be for the shaman of a tribe."
+ icon_state = "shamanrags"
+ item_state = "shamanrags"
+ item_color = "shamanrags"
+
+/obj/item/clothing/under/ash_robe/tunic
+ name = "tribal tunic"
+ desc = "A tattered red tunic of reddened fabric."
+ icon_state = "caesar_clothes"
+ item_state = "caesar_clothes"
+ item_color = "caesar_clothes"
+
+/obj/item/clothing/under/ash_robe/dress
+ name = "tribal dress"
+ desc = "A tattered dress of white fabric."
+ icon_state = "cheongsam_s"
+ item_state = "cheongsam_s"
+ item_color = "cheongsam_s"
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 2fa3f7beb151..397d62645ffa 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -75,6 +75,12 @@
flags_1 = NONE
resistance_flags = FLAMMABLE
+/obj/item/cultivator/bone
+ name = "bone cultivator"
+ desc = "A handle and a few bones tied together to resemble a hoe. Should work for removing weeds."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "cultivator_bone"
+
/obj/item/hatchet
name = "hatchet"
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
@@ -110,6 +116,12 @@
materials = null
flags_1 = NONE
+/obj/item/hatchet/bone
+ name = "bone hatchet"
+ desc = "A primitive hatchet made out of mostly bone, with some sinew to keep it together. It just might do for cutting logs into planks."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "hatchet_bone"
+
/obj/item/scythe
icon_state = "scythe0"
icon = 'icons/obj/hydroponics/equipment.dmi'
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index b8c333b29d01..19d9da7f32ec 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -154,3 +154,9 @@ obj/item/pickaxe/bonepickaxe
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/shovel/spade/bone
+ name = "bone spade"
+ desc = "A bone spade, suitable for digging and moving dirt."
+ icon_state = "spade_bone"
+ toolspeed = 0.75
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index cf5cbd64b0ec..438e4d107d1f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -289,7 +289,7 @@
return
var/damage_amount = I.embedding.embedded_unsafe_removal_pain_multiplier * I.w_class
L.receive_damage(damage_amount, sharpness = SHARP_EDGED)//It hurts to rip it out, get surgery you dingus.
- if(remove_embedded_object(I, get_turf(src), damage_amount))
+ if(remove_embedded_object(I, get_turf(src), (damage_amount == 0)))
usr.put_in_hands(I)
usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!", span_notice("You successfully remove [I] from your [L.name]."))
return
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 8745139d0eb9..5228bd8ed82a 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -54,7 +54,7 @@
if(istype(I, /obj/item))
if(((throwingdatum ? throwingdatum.speed : I.throw_speed) >= EMBED_THROWSPEED_THRESHOLD) || I.embedding.embedded_ignore_throwspeed_threshold)
var/obj/item/bodypart/body_part = pick(bodyparts)
- if(prob(clamp(I.embedding.embed_chance - run_armor_check(body_part, MELEE), 0, 100)) && embed_object(I, deal_damage = TRUE))
+ if(prob(clamp(I.embedding.embed_chance - run_armor_check(body_part, MELEE), 0, 100)) && embed_object(I, body_part, deal_damage = TRUE))
hitpush = FALSE
skipcatch = TRUE //can't catch the now embedded item
if(!skipcatch) //ugly, but easy
@@ -112,8 +112,6 @@
body_part = part
if(!body_part)
return
- if(!embedded.on_embed_removal(src))
- return
body_part.embedded_objects -= embedded
if(!silent)
emote("scream")
@@ -122,6 +120,7 @@
SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded")
if(new_loc)
embedded.forceMove(new_loc)
+ embedded.on_embed_removal(src)
return TRUE
/**
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index 4810c6279239..29045d127c0a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -46,7 +46,7 @@
var/obj/item/T = AM
if(!stat)
Aggro()
- if(T.throwforce <= 20)
+ if(T.throwforce <= 20 && !istype(T, /obj/item/restraints/legcuffs/bola))
visible_message(span_notice("The [T.name] [throw_message] [src.name]!"))
return
..()
diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm
new file mode 100644
index 000000000000..c64b1f75258b
--- /dev/null
+++ b/code/modules/projectiles/ammunition/caseless/arrow.dm
@@ -0,0 +1,198 @@
+/obj/item/ammo_casing/caseless/arrow
+ name = "arrow"
+ desc = "An arrow, typically fired from a bow."
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow
+ caliber = "arrow"
+ icon_state = "arrow"
+ force = 5
+ throwforce = 5 //good luck hitting someone with the pointy end of the arrow
+ throw_speed = 3
+ sharpness = SHARP_POINTY
+ embedding = list("embed_chance" = 25, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/wood
+ name = "wooden arrow"
+ desc = "An arrow made of wood, typically fired from a bow."
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/wood
+
+/obj/item/ammo_casing/caseless/arrow/ash
+ name = "ashen arrow"
+ desc = "An arrow made from wood, hardened by fire"
+ icon_state = "ashenarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/ash
+ embedding = list("embed_chance" = 30, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/bone_tipped
+ name = "bone tipped arrow"
+ desc = "An arrow made of bone, wood, and sinew. The tip is sharp enough to pierce goliath hide."
+ icon_state = "bonetippedarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/bone_tipped
+ embedding = list("embed_chance" = 10, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/bone
+ name = "bone arrow"
+ desc = "A flimsy arrow made of bone. Not strong or durable, but is easy to make."
+ icon_state = "bonearrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/bone
+ embedding = list("embed_chance" = 10, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/chitin
+ name = "chitin tipped arrow"
+ desc = "A sharp arrow made of the guts of lavaland monsters. The tip is sharp and jagged, making it easier to get stuck into your target."
+ icon_state = "chitinarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/chitin
+ embedding = list("embed_chance" = 10, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/bamboo
+ name = "bamboo arrow"
+ desc = "A flimsy arrow made of bamboo. Not strong or durable, but is easy to make."
+ icon_state = "bambooarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/bamboo
+ embedding = list("embed_chance" = 15, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/bronze
+ name = "bronze arrow"
+ desc = "An arrow made from wood. tipped with bronze."
+ icon_state = "bronzearrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/bronze
+ embedding = list("embed_chance" = 15, "embedded_fall_chance" = 0)
+
+/obj/item/ammo_casing/caseless/arrow/glass
+ name = "glass arrow"
+ desc = "An arrow made from a metal rod, wrapped in wires, and tipped with glass."
+ icon_state = "glassarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/glass
+ variance = 10
+
+/obj/item/ammo_casing/caseless/arrow/glass/plasma
+ name = "plasma glass arrow"
+ desc = "An arrow made from a metal rod, wrapped in wires, and tipped with plasma glass."
+ icon_state = "plasmaglassarrow"
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/glass/plasma
+ variance = 10
+
+/obj/item/ammo_casing/caseless/arrow/bola
+ name = "bola arrow"
+ desc = "An arrow made from wood. a bola is wrapped around it."
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/bola
+
+/obj/item/ammo_casing/caseless/arrow/bola/Initialize()
+ ..()
+ var/obj/item/ammo_casing/caseless/arrow/A = locate(/obj/item/ammo_casing/caseless/arrow) in contents
+ if(istype(A))
+ icon = A.icon
+ icon_state = A.icon_state
+ var/obj/item/projectile/bullet/reusable/arrow/AA = A.BB
+ var/obj/item/projectile/bullet/reusable/arrow/BBB = BB
+ if(istype(AA) && istype(BBB))
+ BBB.damage = AA.damage * 0.5
+ BBB.armour_penetration = AA.armour_penetration * 0.5
+ BBB.embed_chance = AA.embed_chance * 0.5
+ BBB.ammo_type = AA.ammo_type
+
+ var/obj/item/restraints/legcuffs/bola/bola = locate(/obj/item/restraints/legcuffs/bola) in contents
+ var/obj/item/projectile/bullet/reusable/arrow/bola/bola_arrow = BB
+ if(!istype(bola))
+ bola = new(src)
+ if(istype(bola) && istype(bola_arrow))
+ bola_arrow.bola = bola
+
+ add_overlay(mutable_appearance(icon, "arrow_bola"), TRUE)
+/*
+/obj/item/ammo_casing/caseless/arrow/explosive
+ name = "explosive arrow"
+ desc = "An arrow made from wood. an explosive is attached to it."
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/explosive
+
+/obj/item/ammo_casing/caseless/arrow/explosive/Initialize()
+ ..()
+ var/obj/item/ammo_casing/caseless/arrow/A = locate(/obj/item/ammo_casing/caseless/arrow) in contents
+ if(istype(A))
+ icon = A.icon
+ icon_state = A.icon_state
+ var/obj/item/projectile/bullet/reusable/AA = A.BB
+ var/obj/item/projectile/bullet/reusable/BBB = BB
+ if(istype(AA) && istype(BBB))
+ BBB.damage = AA.damage * 0.5
+ BBB.armour_penetration = AA.armour_penetration * 0.5
+ BBB.ammo_type = AA.ammo_type
+
+ var/obj/item/grenade/explosive = locate(/obj/item/grenade) in contents
+ var/obj/item/projectile/bullet/reusable/arrow/explosive/explosive_arrow = BB
+ if(!istype(explosive))
+ explosive = new /obj/item/grenade/plastic/c4(src)
+ if(istype(explosive) && istype(explosive_arrow))
+ explosive_arrow.explosive = explosive
+
+ add_overlay(mutable_appearance(icon, "arrow_explosive"), TRUE)
+*/
+/obj/item/ammo_casing/caseless/arrow/flaming
+ name = "flaming arrow"
+ desc = "An arrow made from wood. lit on fire."
+ projectile_type = /obj/item/projectile/bullet/reusable/arrow/flaming
+
+/obj/item/ammo_casing/caseless/arrow/flaming/Initialize()
+ ..()
+ var/obj/item/ammo_casing/caseless/arrow/A = locate(/obj/item/ammo_casing/caseless/arrow) in contents
+ if(istype(A))
+ icon = A.icon
+ icon_state = A.icon_state
+ var/obj/item/projectile/bullet/reusable/arrow/AA = A.BB
+ var/obj/item/projectile/bullet/reusable/arrow/BBB = BB
+ if(istype(AA) && istype(BBB))
+ BBB.damage = AA.damage * 0.5
+ BBB.armour_penetration = AA.armour_penetration * 0.5
+ BBB.embed_chance = AA.embed_chance * 0.5
+ BBB.ammo_type = AA.ammo_type
+
+ add_overlay(mutable_appearance(icon, "arrow_fire"), TRUE)
+
+// Energy Arrows //
+
+/obj/item/ammo_casing/caseless/arrow/energy
+ name = "energy bolt"
+ desc = "An arrow made from hardlight."
+ icon_state = "arrow_energy"
+ item_flags = DROPDEL
+ embedding = list("embedded_pain_chance" = 0, "embedded_pain_multiplier" = 0, "embedded_unsafe_removal_pain_multiplier" = 0, "embedded_pain_chance" = 0, "embedded_fall_chance" = 0)
+ projectile_type = /obj/item/projectile/energy/arrow
+ var/overlay_state = "redlight"
+
+ var/ticks = 0
+ var/tick_max = 10
+ var/tick_damage = 1
+ var/tick_damage_type = FIRE
+ var/tick_sound = 'sound/effects/sparks4.ogg'
+
+/obj/item/ammo_casing/caseless/arrow/energy/on_embed_removal(mob/living/carbon/human/embedde)
+ qdel(src)
+
+/obj/item/ammo_casing/caseless/arrow/energy/embed_tick(mob/living/carbon/human/embedde, obj/item/bodypart/part)
+ if(ticks >= tick_max)
+ embedde.remove_embedded_object(src, , TRUE, TRUE)
+ return
+ ticks++
+ playsound(embedde, tick_sound , 10, 0)
+ embedde.apply_damage(tick_damage, BB.damage_type, part.body_zone)
+
+/obj/item/ammo_casing/caseless/arrow/energy/disabler
+ name = "disabler bolt"
+ desc = "An arrow made from hardlight. This one stuns the victim in a non-lethal way."
+ icon_state = "arrow_disable"
+ overlay_state = "disable"
+ projectile_type = /obj/item/projectile/energy/arrow/disabler
+ harmful = FALSE
+ tick_damage_type = STAMINA
+
+/obj/item/ammo_casing/caseless/arrow/energy/xray
+ name = "X-ray bolt"
+ desc = "An arrow made from hardlight. This one can pass through obstructions."
+ icon_state = "arrow_xray"
+ overlay_state = "xray"
+ projectile_type = /obj/item/projectile/energy/arrow/xray
+ tick_damage_type = TOX
+
+/obj/item/ammo_casing/caseless/arrow/energy/clockbolt
+ name = "redlight bolt"
+ desc = "An arrow made from a strange energy."
+ projectile_type = /obj/item/projectile/energy/arrow/clockbolt
diff --git a/code/modules/projectiles/boxes_magazines/internal/bow.dm b/code/modules/projectiles/boxes_magazines/internal/bow.dm
new file mode 100644
index 000000000000..a6e8b7811d2e
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/internal/bow.dm
@@ -0,0 +1,28 @@
+/obj/item/ammo_box/magazine/internal/bow
+ name = "bow... magazine?" //shouldnt see this item
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ caliber = "arrow"
+ max_ammo = 1
+ start_empty = TRUE
+
+/obj/item/ammo_box/magazine/internal/bow/energy
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/energy
+ start_empty = FALSE
+ var/list/selectable_types = list(/obj/item/ammo_casing/caseless/arrow/energy, /obj/item/ammo_casing/caseless/arrow/energy/disabler)
+
+/obj/item/ammo_box/magazine/internal/bow/energy/advanced
+ selectable_types = list(/obj/item/ammo_casing/caseless/arrow/energy, /obj/item/ammo_casing/caseless/arrow/energy/disabler, /obj/item/ammo_casing/caseless/arrow/energy/xray)
+
+/obj/item/ammo_box/magazine/internal/bow/energy/syndicate
+ selectable_types = list(/obj/item/ammo_casing/caseless/arrow/energy, /obj/item/ammo_casing/caseless/arrow/energy/xray)
+
+/obj/item/ammo_box/magazine/internal/bow/energy/clockcult
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/energy/clockbolt
+ selectable_types = list(/obj/item/ammo_casing/caseless/arrow/energy/clockbolt)
+
+/obj/item/ammo_box/magazine/arrow
+ name = "crossbow magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ icon_state = ".50mag"
+ caliber = "arrow"
+ max_ammo = 5
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 0ae1655d0ee9..4b6db25ec01e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -46,6 +46,7 @@
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns
+ var/no_pin_required = FALSE //whether the gun can be fired without a pin
var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one.
var/obj/item/flashlight/seclite/gun_light
@@ -74,7 +75,10 @@
/obj/item/gun/Initialize()
. = ..()
if(pin)
- pin = new pin(src)
+ if(no_pin_required)
+ pin = null
+ else
+ pin = new pin(src)
if(gun_light)
alight = new(src)
build_zooming()
@@ -124,10 +128,11 @@
/obj/item/gun/examine(mob/user)
. = ..()
- if(pin)
- . += "It has \a [pin] installed."
- else
- . += "It doesn't have a firing pin installed, and won't fire."
+ if(!no_pin_required)
+ if(pin)
+ . += "It has \a [pin] installed."
+ else
+ . += "It doesn't have a firing pin installed, and won't fire."
if(gun_light)
. += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it."
@@ -268,6 +273,8 @@
return FALSE
/obj/item/gun/proc/handle_pins(mob/living/user)
+ if(no_pin_required)
+ return TRUE
if(pin)
if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED))
return TRUE
diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm
new file mode 100644
index 000000000000..d4c081b3a566
--- /dev/null
+++ b/code/modules/projectiles/guns/ballistic/bow.dm
@@ -0,0 +1,282 @@
+/obj/item/gun/ballistic/bow
+ name = "wooden bow"
+ desc = "some sort of primitive projectile weapon. used to fire arrows."
+ icon_state = "bow"
+ item_state = "bow"
+ w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_HEAVY //need both hands to fire
+ force = 5
+ spread = 1
+ mag_type = /obj/item/ammo_box/magazine/internal/bow
+ fire_sound = 'sound/weapons/sound_weapons_bowfire.ogg'
+ slot_flags = ITEM_SLOT_BACK
+ item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND
+ casing_ejector = FALSE
+ internal_magazine = TRUE
+ pin = null
+ no_pin_required = TRUE
+ trigger_guard = TRIGGER_GUARD_ALLOW_ALL //so ashwalkers can use it
+
+ var/drawing = FALSE
+ var/drop_release_draw = TRUE
+ var/move_drawing = TRUE
+ var/draw_time = 0.5 SECONDS
+ var/draw_slowdown = 1.5
+ var/draw_sound = 'sound/weapons/sound_weapons_bowdraw.ogg'
+ var/mutable_appearance/arrow_overlay
+
+/obj/item/gun/ballistic/bow/shoot_with_empty_chamber()
+ return
+
+/obj/item/gun/ballistic/bow/chamber_round()
+ chambered = magazine.get_round(1)
+ update_icon()
+
+/obj/item/gun/ballistic/bow/dropped()
+ . = ..()
+ if(drop_release_draw && !QDELING(src))
+ addtimer(CALLBACK(src, .proc/release_draw_if_not_held))
+
+/obj/item/gun/ballistic/bow/proc/release_draw_if_not_held()
+ if(!ismob(loc))
+ release_draw()
+
+/obj/item/gun/ballistic/bow/proc/release_draw()
+ var/old_chambered = chambered
+ chambered = null
+ magazine.give_round(old_chambered)
+ update_slowdown()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/process_chamber()
+ chambered = null
+ magazine.get_round(0)
+ update_slowdown()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/attack_self(mob/living/user)
+ if(chambered)
+ var/obj/item/ammo_casing/AC = magazine.get_round(0)
+ user.put_in_hands(AC)
+ chambered = null
+ to_chat(user, span_notice("You gently release the bowstring, removing the arrow."))
+ else if(get_ammo())
+ drawing = TRUE
+ update_slowdown()
+ if (!do_after(user, draw_time, src, TRUE, stayStill = !move_drawing))
+ drawing = FALSE
+ update_slowdown()
+ return
+ drawing = FALSE
+ to_chat(user, span_notice("You draw back the bowstring."))
+ playsound(src, draw_sound, 75, 0, falloff = 3) //gets way too high pitched if the freq varies
+ chamber_round()
+ update_slowdown()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/attackby(obj/item/I, mob/user, params)
+ if (magazine.attackby(I, user, params, 1))
+ to_chat(user, span_notice("You notch the arrow."))
+ update_slowdown()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/update_icon()
+ cut_overlay(arrow_overlay, TRUE)
+ icon_state = "[initial(icon_state)][chambered ? "_firing" : ""]"
+ if(get_ammo())
+ var/obj/item/ammo_casing/caseless/arrow/energy/E = magazine.get_round(TRUE)
+ arrow_overlay = mutable_appearance(icon, "[initial(E.icon_state)][chambered ? "_firing" : ""]")
+ add_overlay(arrow_overlay, TRUE)
+
+/obj/item/gun/ballistic/bow/proc/update_slowdown()
+ if(chambered || drawing)
+ slowdown = draw_slowdown
+ else
+ slowdown = initial(slowdown)
+
+/obj/item/gun/ballistic/bow/can_shoot()
+ return chambered
+
+/obj/item/gun/ballistic/bow/ashen
+ name = "Bone Bow"
+ desc = "Some sort of primitive projectile weapon made of bone and wrapped sinew."
+ icon_state = "ashenbow"
+ item_state = "ashenbow"
+ spread = 3
+ force = 8
+
+/obj/item/gun/ballistic/bow/pipe
+ name = "Pipe Bow"
+ desc = "A crude projectile weapon made from silk string, pipe and lots of bending."
+ icon_state = "pipebow"
+ item_state = "pipebow"
+ force = 7
+ spread = 5
+ draw_time = 1 SECONDS
+
+/obj/item/gun/ballistic/bow/maint
+ name = "Makeshift Bow"
+ desc = "A crude projectile weapon made from cables, pipe, tape and lots of bending."
+ icon_state = "makeshift_bow"
+ item_state = "makeshift_bow"
+ force = 7
+ spread = 10
+ draw_time = 2 SECONDS
+
+/obj/item/gun/ballistic/bow/crossbow
+ name = "wooden crossbow"
+ desc = "A bow with a locing mechanism that more closly resembles a modern gun."
+ icon_state = "crossbow"
+ spread = 0
+ draw_time = 2 SECONDS
+ draw_slowdown = FALSE
+ drop_release_draw = FALSE
+ move_drawing = FALSE
+
+/obj/item/gun/ballistic/bow/crossbow/magfed
+ name = "wooden magfed crossbow"
+ desc = "A bow with a locing mechanism that more closly resembles a modern gun. This one seems to be outfited with a automatic loading mechanism."
+ mag_type = /obj/item/ammo_box/magazine/arrow
+ internal_magazine = FALSE
+
+/obj/item/gun/ballistic/bow/attackby(obj/item/I, mob/user, params)
+ if (!internal_magazine && istype(I, /obj/item/ammo_box/magazine))
+ var/obj/item/ammo_box/magazine/AM = I
+ if (!magazine)
+ insert_magazine(user, AM)
+ else
+ if (tac_reloads)
+ eject_magazine(user, FALSE, AM)
+ else
+ to_chat(user, span_notice("There's already a [magazine_wording] in \the [src]."))
+ return
+ ..()
+
+/obj/item/gun/ballistic/bow/energy
+ name = "Hardlight Bow"
+ desc = "A modern bow that can fabricate hardlight arrows using an internal energy."
+ icon_state = "bow_hardlight"
+ item_state = "bow_hardlight"
+ mag_type = /obj/item/ammo_box/magazine/internal/bow/energy
+ no_pin_required = FALSE
+ draw_slowdown = 0
+ var/recharge_time = 1.5 SECONDS
+
+/obj/item/gun/ballistic/bow/energy/update_icon()
+ cut_overlay(arrow_overlay, TRUE)
+ if(get_ammo())
+ var/obj/item/ammo_casing/caseless/arrow/energy/E = magazine.get_round(TRUE)
+ arrow_overlay = mutable_appearance(icon, "[initial(E.icon_state)][chambered ? "_firing" : ""]")
+ add_overlay(arrow_overlay, TRUE)
+
+/obj/item/gun/ballistic/bow/energy/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message)
+ . = ..()
+ if(recharge_time)
+ TIMER_COOLDOWN_START(src, "arrow_recharge", recharge_time)
+ addtimer(CALLBACK(src, .proc/end_cooldown), recharge_time)
+
+/obj/item/gun/ballistic/bow/energy/proc/end_cooldown()
+ playsound(src, 'sound/effects/sparks4.ogg', 25, 0)
+
+/obj/item/gun/ballistic/bow/energy/attack_self(mob/living/user)
+ if(chambered)
+ chambered = null
+ to_chat(user, span_notice("You disperse the arrow."))
+ else if(get_ammo())
+ drawing = TRUE
+ update_slowdown()
+ if (!do_after(user, draw_time, src, TRUE, stayStill = FALSE))
+ drawing = FALSE
+ update_slowdown()
+ return
+ drawing = FALSE
+ to_chat(user, span_notice("You draw back the bowstring."))
+ playsound(src, draw_sound, 75, 0, falloff = 3) //gets way too high pitched if the freq varies
+ chamber_round()
+ else if(!recharge_time || !TIMER_COOLDOWN_CHECK(src, "arrow_recharge"))
+ to_chat(user, span_notice("You fabricate an arrow."))
+ recharge_bolt()
+ update_slowdown()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/energy/proc/recharge_bolt()
+ if(magazine.get_round(TRUE))
+ return
+ var/ammo_type = magazine.ammo_type
+ magazine.give_round(new ammo_type())
+
+ update_icon()
+
+/obj/item/gun/ballistic/bow/energy/attackby(obj/item/I, mob/user, params)
+ return
+
+/obj/item/gun/ballistic/bow/energy/AltClick(mob/living/user)
+ select_projectile(user)
+ var/current_round = magazine.get_round(TRUE)
+ if(current_round)
+ QDEL_NULL(current_round)
+ if(!TIMER_COOLDOWN_CHECK(src, "arrow_recharge"))
+ recharge_bolt()
+ update_icon()
+
+/obj/item/gun/ballistic/bow/energy/proc/select_projectile(mob/living/user)
+ var/obj/item/ammo_box/magazine/internal/bow/energy/M = magazine
+ if(!istype(M) || !M.selectable_types)
+ return
+ var/list/selectable_types = M.selectable_types
+
+ if(selectable_types.len == 1)
+ M.ammo_type = selectable_types[1]
+ to_chat(user, span_notice("\The [src] doesn't have any other firing modes."))
+ update_icon()
+ return
+
+ if(selectable_types.len == 2)
+ selectable_types = selectable_types - M.ammo_type
+ M.ammo_type = selectable_types[1]
+ to_chat(user, span_notice("You switch \the [src]'s firing mode."))
+ update_icon()
+ return
+
+ var/list/choice_list = list()
+ for(var/arrow_type in M.selectable_types)
+ var/obj/item/ammo_casing/caseless/arrow/energy/arrow = new arrow_type()
+ choice_list[arrow] = image(arrow)
+ var/obj/item/ammo_casing/caseless/arrow/energy/choice = show_radial_menu(user, user, choice_list, tooltips = TRUE)
+ if(!choice || !(choice.type in M.selectable_types))
+ return
+ M.ammo_type = choice.type
+ to_chat(user, span_notice("You switch \the [src]'s firing mode to \"[choice]\"."))
+ for(var/arrow in choice_list)
+ QDEL_NULL(choice_list[arrow])
+ QDEL_NULL(arrow)
+ QDEL_NULL(choice_list)
+ update_icon()
+
+/obj/item/gun/ballistic/bow/energy/advanced
+ name = "Advanced Hardlight Bow"
+ mag_type = /obj/item/ammo_box/magazine/internal/bow/energy/advanced
+ recharge_time = 0
+ pin = /obj/item/firing_pin
+
+/obj/item/gun/ballistic/bow/energy/syndicate
+ name = "Syndicate Hardlight Bow"
+ desc = "A modern bow that can fabricate hardlight arrows using an internal energy. This one is designed for silent takedowns of targets by the syndicate."
+ icon_state = "bow_syndicate"
+ item_state = "bow_syndicate"
+ mag_type = /obj/item/ammo_box/magazine/internal/bow/energy/syndicate
+ recharge_time = 2 SECONDS
+ zoomable = TRUE
+ zoom_amt = 10
+ zoom_out_amt = 5
+ pin = /obj/item/firing_pin/implant/pindicate
+ fire_sound = null
+ draw_sound = null
+
+/obj/item/gun/ballistic/bow/energy/clockwork
+ name = "Brass Bow"
+ desc = "A bow made from brass and other components that you can't quite understand. It glows with a deep energy and frabricates arrows by itself."
+ icon_state = "bow_clockwork"
+ item_state = "bow_clockwork"
+ mag_type = /obj/item/ammo_box/magazine/internal/bow/energy/clockcult
+ pin = /obj/item/firing_pin/clockie
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index b56b56ae4d7a..6098c5bdefcb 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -10,11 +10,14 @@
materials = list(/datum/material/iron=2000)
clumsy_check = 0
fire_sound = 'sound/items/syringeproj.ogg'
+ var/load_sound = 'sound/weapons/shotguninsert.ogg'
var/list/syringes = list()
var/max_syringes = 1
+ var/has_syringe_overlay = TRUE ///If it has an overlay for inserted syringes. If true, the overlay is determined by the number of syringes inserted into it.
/obj/item/gun/syringe/Initialize()
. = ..()
+ update_icon()
chambered = new /obj/item/ammo_casing/syringegun(src)
/obj/item/gun/syringe/handle_atom_del(atom/A)
@@ -33,6 +36,7 @@
/obj/item/gun/syringe/process_chamber()
if(chambered && !chambered.BB) //we just fired
recharge_newshot()
+ update_icon()
/obj/item/gun/syringe/examine(mob/user)
. = ..()
@@ -41,18 +45,18 @@
/obj/item/gun/syringe/attack_self(mob/living/user)
if(!syringes.len)
to_chat(user, span_warning("[src] is empty!"))
- return 0
+ return FALSE
var/obj/item/reagent_containers/syringe/S = syringes[syringes.len]
if(!S)
- return 0
+ return FALSE
user.put_in_hands(S)
syringes.Remove(S)
to_chat(user, span_notice("You unload [S] from \the [src]."))
- return 1
+ return TRUE
/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE)
if(istype(A, /obj/item/reagent_containers/syringe))
@@ -62,11 +66,20 @@
to_chat(user, span_notice("You load [A] into \the [src]."))
syringes += A
recharge_newshot()
+ update_icon()
+ playsound(loc, load_sound, 40)
return TRUE
else
to_chat(user, span_warning("[src] cannot hold more syringes!"))
return FALSE
+/obj/item/gun/syringe/update_icon()
+ . = ..()
+ if(!has_syringe_overlay)
+ return
+ var/syringe_count = syringes.len
+ add_overlay("[initial(icon_state)]_[syringe_count ? clamp(syringe_count, 1, initial(max_syringes)) : "empty"]")
+
/obj/item/gun/syringe/rapidsyringe
name = "rapid syringe gun"
desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
@@ -103,6 +116,8 @@
to_chat(user, span_notice("You load \the [D] into \the [src]."))
syringes += D
recharge_newshot()
+ update_icon()
+ playsound(loc, load_sound, 40)
return TRUE
else
to_chat(user, span_warning("[src] cannot hold more syringes!"))
@@ -114,6 +129,7 @@
icon_state = "blowgun"
item_state = "blowgun"
fire_sound = 'sound/items/syringeproj.ogg'
+ no_pin_required = TRUE
trigger_guard = TRIGGER_GUARD_ALLOW_ALL //it's a fucking blowgun it shouldn't even have a triggerguard
/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 46ff00ac8799..dbe96a173d3d 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -23,6 +23,8 @@
if(proximity_flag)
if(istype(target, /obj/item/gun))
var/obj/item/gun/G = target
+ if(G.no_pin_required)
+ return
if(G.pin && (force_replace || G.pin.pin_removeable))
G.pin.forceMove(get_turf(G))
if(!G.pin.gun_remove(user))
@@ -77,6 +79,13 @@
name = "magic crystal shard"
desc = "A small enchanted shard which allows magical weapons to fire."
+/obj/item/firing_pin/clockie
+ name = "clockwork crystal shard"
+ desc = "A small enchanted shard which allows followers of Ratvar to use their weapons."
+
+///can the pin be used by whoever is firing its gun
+/obj/item/firing_pin/clockie/pin_auth(mob/living/user)
+ return is_clockcult(user)
// Test pin, works only near firing range.
/obj/item/firing_pin/test_range
diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm
index df19d5a0b55b..e6a6e0137ae5 100644
--- a/code/modules/projectiles/projectile/reusable/_reusable.dm
+++ b/code/modules/projectiles/projectile/reusable/_reusable.dm
@@ -7,13 +7,13 @@
/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE)
. = ..()
- handle_drop()
+ handle_drop(target)
/obj/item/projectile/bullet/reusable/on_range()
handle_drop()
..()
-/obj/item/projectile/bullet/reusable/proc/handle_drop()
+/obj/item/projectile/bullet/reusable/proc/handle_drop(atom/target)
if(!dropped)
var/turf/T = get_turf(src)
new ammo_type(T)
diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm
new file mode 100644
index 000000000000..cd6313b206de
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable/arrow.dm
@@ -0,0 +1,182 @@
+/obj/item/projectile/bullet/reusable/arrow //Base arrow. Good against fauna, not perfect, but well-rounded.
+ name = "Arrow"
+ desc = "Woosh!"
+ damage = 20
+ flag = MELEE
+ icon_state = "arrow"
+ ammo_type = /obj/item/ammo_casing/caseless/arrow
+ var/embed_chance = 0.5
+ var/break_chance = 10
+ var/fauna_damage_bonus = 20
+
+/obj/item/projectile/bullet/reusable/arrow/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))
+ L.apply_damage(fauna_damage_bonus)
+
+/obj/item/projectile/bullet/reusable/arrow/handle_drop(atom/target)
+ if(prob(break_chance))
+ return
+ var/obj/item/dropping = new ammo_type()
+ if(iscarbon(target))
+ var/mob/living/carbon/embede = target
+ var/obj/item/bodypart/part = embede.get_bodypart(def_zone)
+ if(prob(embed_chance * clamp((100 - (embede.getarmor(part, flag) - armour_penetration)), 0, 100)) && embede.embed_object(dropping, part, TRUE))
+ dropped = TRUE
+
+ // Icky code, but i dont want to create a new obj, delete it, then make a new one
+ if(!dropped)
+ dropping.forceMove(get_turf(src))
+ dropped = TRUE
+
+/obj/item/projectile/bullet/reusable/arrow/wood
+ name = "Wooden arrow"
+ desc = "Wooden arrow."
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/wood
+
+/obj/item/projectile/bullet/reusable/arrow/ash //Fire-tempered head makes it tougher; more damage, but less likely to shatter and embed
+ name = "Ashen arrow"
+ desc = "Fire Hardened arrow."
+ damage = 25
+ embed_chance = 0.3
+ break_chance = 0
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/ash
+
+/obj/item/projectile/bullet/reusable/arrow/bone_tipped //Highest damage; fully upgraded normal arrow, simply well-crafted
+ name = "Bone tipped arrow"
+ desc = "An arrow made from bone, wood, and sinew."
+ damage = 30
+ armour_penetration = 20
+ embed_chance = 0.4
+ break_chance = 0
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/bone_tipped
+
+/obj/item/projectile/bullet/reusable/arrow/bone //Cheap, easy to make in bulk but mostly capable of being used to hunt fauna
+ name = "Bone arrow"
+ desc = "An arrow made from bone and sinew."
+ damage = 15
+ fauna_damage_bonus = 35
+ embed_chance = 0.33
+ break_chance = 10
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/bone
+
+/obj/item/projectile/bullet/reusable/arrow/chitin //Most expensive arrow, but powerful for those who put in the time. Greater AP alternative to bone-tipped. Very robust against fauna.
+ name = "Chitin tipped arrow"
+ desc = "An arrow made from chitin, bone, and sinew."
+ damage = 25
+ fauna_damage_bonus = 40
+ armour_penetration = 35
+ embed_chance = 0.5
+ break_chance = 0
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/chitin
+
+/obj/item/projectile/bullet/reusable/arrow/bamboo //Very brittle, very fragile, but very potent at splintering into targets assuming it isn't broken on impact
+ name = "Bamboo arrow"
+ desc = "An arrow made from bamboo."
+ damage = 10
+ embed_chance = 0.7
+ break_chance = 67
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/bamboo
+
+/obj/item/projectile/bullet/reusable/arrow/bronze //Inferior metal. Slightly better than ashen
+ name = "Bronze arrow"
+ desc = "Bronze tipped arrow"
+ damage = 25
+ armour_penetration = 10
+ embed_chance = 0.3
+ break_chance = 10
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/bronze
+
+/obj/item/projectile/bullet/reusable/arrow/glass //Fragile, but sharp and light. Not as effective as metal but cheaper.
+ name = "Glass arrow"
+ desc = "Glass tipped arrow"
+ damage = 15
+ embed_chance = 0.5
+ break_chance = 33
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/glass
+
+/obj/item/projectile/bullet/reusable/arrow/glass/plasma //Immensely capable of puncturing through materials; plasma is a robust material, more capable of slicing through protection
+ name = "Plasma Glass arrow"
+ desc = "Plasma Glass tipped arrow"
+ damage = 15
+ armour_penetration = 50
+ embed_chance = 0.5
+ break_chance = 0
+ ammo_type = /obj/item/ammo_casing/caseless/arrow/glass/plasma
+
+/obj/item/projectile/bullet/reusable/arrow/bola //More of a blunt impact of the bola, still an arrow. Only able to be crafted with makeshift weaponry
+ name = "Bola arrow"
+ desc = "An arrow with a bola wrapped around it"
+ var/obj/item/restraints/legcuffs/bola/bola
+
+/obj/item/projectile/bullet/reusable/arrow/bola/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ return bola.impactCarbon(target)
+ if(isanimal(target))
+ return bola.impactAnimal(target)
+/*
+/obj/item/projectile/bullet/reusable/arrow/explosive
+ name = "Explosive arrow"
+ desc = "An arrow with an explosive attached to it"
+ damage = 20
+ armour_penetration = 10
+ var/obj/item/grenade/explosive = null
+
+/obj/item/projectile/bullet/reusable/arrow/explosive/prehit(atom/target)
+ . = ..()
+ explosive.forceMove(target)
+ explosive.prime()
+ visible_message("[explosive]")
+*/
+/obj/item/projectile/bullet/reusable/arrow/flaming //Normal arrow, but it also sets people on fire. Simple
+ name = "Flaming arrow"
+ desc = "A burning arrow"
+
+/obj/item/projectile/bullet/reusable/arrow/flaming/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.apply_damage(10, BURN)
+ M.adjust_fire_stacks(1)
+ M.IgniteMob()
+
+/obj/item/projectile/energy/arrow //Hardlight projectile. Slightly more robust than a standard laser. Capable of hardening in target's flesh
+ name = "energy bolt"
+ icon_state = "arrow_energy"
+ damage = 25
+ damage_type = BURN
+ var/embed_chance = 0.5
+ var/obj/item/embed_type = /obj/item/ammo_casing/caseless/arrow/energy
+
+/obj/item/projectile/energy/arrow/on_hit(atom/target, blocked = FALSE)
+ ..()
+ if(!blocked && iscarbon(target))
+ var/mob/living/carbon/embede = target
+ var/obj/item/bodypart/part = embede.get_bodypart(def_zone)
+ if(prob(embed_chance * clamp((100 - (embede.getarmor(part, flag) - armour_penetration)), 0, 100)))
+ embede.embed_object(new embed_type(), part, FALSE)
+
+/obj/item/projectile/energy/arrow/disabler //Hardlight projectile. Forceful impact makes the impact more draining than a standard disabler. Needs to be competitive in DPS
+ name = "disabler bolt"
+ icon_state = "arrow_disable"
+ light_color = LIGHT_COLOR_BLUE
+ damage = 20
+ damage_type = STAMINA
+ embed_type = /obj/item/ammo_casing/caseless/arrow/energy/disabler
+
+/obj/item/projectile/energy/arrow/xray //Slightly weakened arrow capable of passing through material; also irradiates targets moderately
+ name = "X-ray bolt"
+ icon_state = "arrow_xray"
+ light_color = LIGHT_COLOR_GREEN
+ damage = 15
+ irradiate = 300
+ range = 20
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF
+ embed_type = /obj/item/ammo_casing/caseless/arrow/energy/xray
+
+/obj/item/projectile/energy/arrow/clockbolt
+ name = "redlight bolt"
+ embed_type = /obj/item/ammo_casing/caseless/arrow/energy/clockbolt
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 379be0d487c1..7028911e967e 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -401,3 +401,13 @@
build_path = /obj/item/ammo_casing/shotgun/dart/noreact
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/hardlightbow
+ name = "Hardlight Bow"
+ desc = "A modern bow that can fabricate hardlight arrows using an internal energy."
+ id = "hardlightbow"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1500, /datum/material/uranium = 1500, /datum/material/silver = 1500)
+ build_path = /obj/item/gun/ballistic/bow/energy
+ category = list("Weapons")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index f536cdef4f63..3f07a899fda5 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -1132,7 +1132,7 @@
display_name = "Illegal Technology"
description = "Dangerous research used to create dangerous objects."
prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons")
- design_ids = list("decloner", "borg_syndicate_module", "ai_cam_upgrade", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill")
+ design_ids = list("decloner", "borg_syndicate_module", "ai_cam_upgrade", "suppressor", "largecrossbow", "hardlightbow", "donksofttoyvendor", "donksoft_refill")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
hidden = TRUE
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 17ca7a35b530..5576ac42ed1b 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -23,6 +23,13 @@
toolspeed = 0.5
+/obj/item/retractor/bone
+ name = "bone retractor"
+ desc = "Kinda looks like a chicken bone."
+ icon_state = "retractor_bone"
+ toolspeed = 1.25
+
+
/obj/item/hemostat
name = "hemostat"
desc = "You think you have seen this before."
@@ -50,6 +57,13 @@
attack_verb = list("attacked", "pinched")
+/obj/item/hemostat/bone
+ name = "hemostat"
+ desc = "Bones that are strapped together with sinews. Used to stop bleeding."
+ icon_state = "hemostat_bone"
+ toolspeed = 1.25
+
+
/obj/item/cautery
name = "cautery"
desc = "This stops bleeding."
@@ -77,6 +91,13 @@
attack_verb = list("burnt")
+/obj/item/cautery/bone
+ name = "bone cautery"
+ desc = "A heated chuck of plasma strapped to a bone. It can close wounds."
+ icon_state = "cautery_bone"
+ toolspeed = 1.25
+
+
/obj/item/surgicaldrill
name = "surgical drill"
desc = "You can drill using this item. You dig?"
@@ -167,6 +188,13 @@
return (BRUTELOSS)
+/obj/item/scalpel/bone
+ name = "bone scalpel"
+ desc = "Bones and a Diamond tied together to make a scalpel."
+ icon_state = "scalpel_bone"
+ force = 5
+ toolspeed = 1.25
+
/obj/item/circular_saw
name = "circular saw"
desc = "For heavy duty cutting."
@@ -209,6 +237,13 @@
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharpness = SHARP_EDGED
+/obj/item/circular_saw/bone
+ name = "bone bonesaw"
+ desc = "A bone with diamond teeth strapped to cut through bones."
+ icon_state = "saw_bone"
+ force = 5
+ toolspeed = 1.25
+
/obj/item/bonesetter
name = "bonesetter"
desc = "For setting things right."
@@ -223,6 +258,12 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("corrected", "properly set")
+/obj/item/bonesetter/bone
+ name = "bone bonesetter"
+ desc = "A bonesetter made of bones... for setting bones with... bones?"
+ icon_state = "bone setter_bone"
+ toolspeed = 1.25
+
/obj/item/surgical_drapes
name = "surgical drapes"
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
@@ -238,6 +279,11 @@
if(!attempt_initiate_surgery(src, M, user))
..()
+/obj/item/surgical_drapes/goliath
+ name = "goliath drapes"
+ desc = "Probably not the most hygienic but what else are you gonna use?"
+ icon_state = "surgical_drapes_goli"
+
/obj/item/organ_storage //allows medical cyborgs to manipulate organs without hands
name = "organ storage bag"
desc = "A container for holding body parts."
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index b0e3fa9d21cf..4cdd5a646c19 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -566,6 +566,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
manufacturer = /datum/corporation/traitor/donkco
surplus = 10
+/datum/uplink_item/dangerous/hardlightbow
+ name = "Hardlight Bow"
+ desc = "A modern bow that can fabricate hardlight arrows, designed for silent takedowns of targets."
+ item = /obj/item/gun/ballistic/bow/energy/syndicate
+ cost = 12
+ surplus = 25
+ include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/infiltration)
+
// Stealthy Weapons
/datum/uplink_item/stealthy_weapons
category = "Stealthy Weapons"
diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi
index 1d3920327865..2324b657778d 100644
Binary files a/icons/mob/accessories.dmi and b/icons/mob/accessories.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 7853bfcd2b6d..344ae47cbd95 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index bddbd25ff653..aa5b6715ce1d 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index d35e8046d8d2..9e7b69905bf2 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 6aadc5f8bfe9..b9f27f2ed0e3 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 5857cab84088..72f527e226c5 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/misc/chairs_lefthand.dmi b/icons/mob/inhands/misc/chairs_lefthand.dmi
index 7377787a63e4..6744dd8fa304 100644
Binary files a/icons/mob/inhands/misc/chairs_lefthand.dmi and b/icons/mob/inhands/misc/chairs_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/chairs_righthand.dmi b/icons/mob/inhands/misc/chairs_righthand.dmi
index f04962de189b..0809a7c06288 100644
Binary files a/icons/mob/inhands/misc/chairs_righthand.dmi and b/icons/mob/inhands/misc/chairs_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_lefthand.dmi b/icons/mob/inhands/misc/sheets_lefthand.dmi
index 556b7122c465..96310e6a934e 100644
Binary files a/icons/mob/inhands/misc/sheets_lefthand.dmi and b/icons/mob/inhands/misc/sheets_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/sheets_righthand.dmi b/icons/mob/inhands/misc/sheets_righthand.dmi
index 64a0d8e2838d..d0823c6a2611 100644
Binary files a/icons/mob/inhands/misc/sheets_righthand.dmi and b/icons/mob/inhands/misc/sheets_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/axes_lefthand.dmi b/icons/mob/inhands/weapons/axes_lefthand.dmi
index 8f8831d4d4a0..92a3103c92f9 100644
Binary files a/icons/mob/inhands/weapons/axes_lefthand.dmi and b/icons/mob/inhands/weapons/axes_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/axes_righthand.dmi b/icons/mob/inhands/weapons/axes_righthand.dmi
index 81a7e448770e..d9de795fca43 100644
Binary files a/icons/mob/inhands/weapons/axes_righthand.dmi and b/icons/mob/inhands/weapons/axes_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/flamethrower_lefthand.dmi b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi
index 813211ac1354..b952fb8d1105 100644
Binary files a/icons/mob/inhands/weapons/flamethrower_lefthand.dmi and b/icons/mob/inhands/weapons/flamethrower_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/flamethrower_righthand.dmi b/icons/mob/inhands/weapons/flamethrower_righthand.dmi
index 55bcfe893801..d9cca464ac01 100644
Binary files a/icons/mob/inhands/weapons/flamethrower_righthand.dmi and b/icons/mob/inhands/weapons/flamethrower_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index 102b61a52b39..b4f034388536 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index dee6296291d2..3fabebf9c24a 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
index 599ebc5a1802..8253e529254f 100644
Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
index 1bcd4f26483c..b28ba372e5d0 100644
Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/thrown_lefthand.dmi b/icons/mob/inhands/weapons/thrown_lefthand.dmi
new file mode 100644
index 000000000000..fafcf948988a
Binary files /dev/null and b/icons/mob/inhands/weapons/thrown_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/thrown_righthand.dmi b/icons/mob/inhands/weapons/thrown_righthand.dmi
new file mode 100644
index 000000000000..3344f1ba31cc
Binary files /dev/null and b/icons/mob/inhands/weapons/thrown_righthand.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index 8af5d4dfd0f7..19b1b37998ab 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi
index 0855d26f14d2..08f02482c08f 100644
Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 73e7b5eabae9..f65429117272 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index f7d1e589a7cf..d98321f574e3 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 85d448191ef4..7324b1d28f31 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 9157c29d4e22..e5c71177d166 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index 02ef3dbdacaa..e89b95588c49 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index ccd114fc2858..5cdd0a527d70 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 5666e11ba16a..1c1d36c8b1e3 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index da2652ccbf98..d7e864f616b3 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 3c6bd95b9cbe..52746568a090 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 47f6ba480eab..cd48d0c7f30b 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index fce2b85954e3..2c8abfd76d42 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 32b1c506fd0d..1cf575f0ab5b 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index ea9a0ed2fdf8..ed3e51034d09 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/handcuffs.dmi b/icons/obj/handcuffs.dmi
index 7e5fee54772f..c388098bf3fd 100644
Binary files a/icons/obj/handcuffs.dmi and b/icons/obj/handcuffs.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 7be73586240a..eccb13b433ce 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index 71ba3c0694fd..8868517ae3c1 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/improvised.dmi b/icons/obj/improvised.dmi
index ed0005a58d58..34e0c33a56b8 100644
Binary files a/icons/obj/improvised.dmi and b/icons/obj/improvised.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 4e2cdd72ad34..ab14b8a6290b 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 085122e050f9..0aaddced146b 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/smooth_structures/template_smooth_tiles_and_structures.dmi b/icons/obj/smooth_structures/template_smooth_tiles_and_structures.dmi
new file mode 100644
index 000000000000..f257c4611b0d
Binary files /dev/null and b/icons/obj/smooth_structures/template_smooth_tiles_and_structures.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
index 1ec3101c027c..20583374ea91 100644
Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index c1a112244ba8..d09a8bc287e0 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 0642f22803a8..f7718df0c9d7 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 64c6fa08b363..de4ce851ff1c 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 822d33749d97..b69c131a49c9 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 8a3981e3d075..deffef403f82 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/weapons/spears.dmi b/icons/obj/weapons/spears.dmi
index 3a692d4ebea5..24fe42c47e62 100644
Binary files a/icons/obj/weapons/spears.dmi and b/icons/obj/weapons/spears.dmi differ
diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi
new file mode 100644
index 000000000000..e18237b3f63f
Binary files /dev/null and b/icons/turf/floors/bamboo_mat.dmi differ
diff --git a/icons/turf/walls/bamboo_wall.dmi b/icons/turf/walls/bamboo_wall.dmi
new file mode 100644
index 000000000000..3111c32b7ccc
Binary files /dev/null and b/icons/turf/walls/bamboo_wall.dmi differ
diff --git a/sound/weapons/sound_weapons_bowdraw.ogg b/sound/weapons/sound_weapons_bowdraw.ogg
new file mode 100644
index 000000000000..bba8a87e063a
Binary files /dev/null and b/sound/weapons/sound_weapons_bowdraw.ogg differ
diff --git a/sound/weapons/sound_weapons_bowfire.ogg b/sound/weapons/sound_weapons_bowfire.ogg
new file mode 100644
index 000000000000..c079d43475bc
Binary files /dev/null and b/sound/weapons/sound_weapons_bowfire.ogg differ
diff --git a/yogstation.dme b/yogstation.dme
index 4e9153134821..1b56b2bf3fa7 100644
--- a/yogstation.dme
+++ b/yogstation.dme
@@ -469,11 +469,13 @@
#include "code\datums\components\waddling.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
+#include "code\datums\components\crafting\antag.dm"
#include "code\datums\components\crafting\crafting.dm"
#include "code\datums\components\crafting\guncrafting.dm"
#include "code\datums\components\crafting\makeshift.dm"
#include "code\datums\components\crafting\recipes.dm"
#include "code\datums\components\crafting\tailoring.dm"
+#include "code\datums\components\crafting\weapons.dm"
#include "code\datums\components\decals\blood.dm"
#include "code\datums\components\fantasy\_fantasy.dm"
#include "code\datums\components\fantasy\affix.dm"
@@ -2794,6 +2796,7 @@
#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
+#include "code\modules\projectiles\ammunition\caseless\arrow.dm"
#include "code\modules\projectiles\ammunition\caseless\foam.dm"
#include "code\modules\projectiles\ammunition\caseless\misc.dm"
#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
@@ -2821,6 +2824,7 @@
#include "code\modules\projectiles\boxes_magazines\external\toy.dm"
#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm"
#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\bow.dm"
#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm"
#include "code\modules\projectiles\boxes_magazines\internal\misc.dm"
#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm"
@@ -2831,6 +2835,7 @@
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\magic.dm"
#include "code\modules\projectiles\guns\ballistic\automatic.dm"
+#include "code\modules\projectiles\guns\ballistic\bow.dm"
#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
#include "code\modules\projectiles\guns\ballistic\launchers.dm"
#include "code\modules\projectiles\guns\ballistic\minigun.dm"
@@ -2881,6 +2886,7 @@
#include "code\modules\projectiles\projectile\energy\tesla.dm"
#include "code\modules\projectiles\projectile\magic\spellcard.dm"
#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
+#include "code\modules\projectiles\projectile\reusable\arrow.dm"
#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
#include "code\modules\projectiles\projectile\special\curse.dm"
#include "code\modules\projectiles\projectile\special\floral.dm"