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"