diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index 7bc2222b142..f1aa865e0cb 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -249,3 +249,18 @@ /obj/item/stack/cable_coil = 2, ) category = CAT_EQUIPMENT + +/datum/crafting_recipe/violin + name = "Violin" + result = /obj/item/instrument/violin + reqs = list( + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_ENTERTAINMENT + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index bd2b8b1d8b6..eeea4205a4d 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -260,3 +260,14 @@ ) category = CAT_EQUIPMENT tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) + +/datum/crafting_recipe/arrow_quiver + name = "Archery Quiver" + result = /obj/item/storage/bag/quiver/lesser + time = 10 + reqs = list( + /obj/item/stack/sheet/leather = 4, + /obj/item/stack/sheet/cardboard = 4 + ) + category = CAT_EQUIPMENT + tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 4b6ab64a22c..0e3c7b11916 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -375,6 +375,21 @@ category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED +/datum/crafting_recipe/shortbow + name = "Shortbow" + result = /obj/item/gun/ballistic/bow/shortbow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + /datum/crafting_recipe/photoncannon name = "Photon Cannon" result = /obj/item/gun/energy/photon diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index f68ff58072c..2ba01802e7c 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -111,3 +111,46 @@ ) category = CAT_WEAPON_AMMO crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/arrow + name = "Arrow" + result = /obj/item/ammo_casing/arrow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/plastic_arrow + name = "Plastic Arrow" + result = /obj/item/ammo_casing/arrow/plastic + reqs = list( + /obj/item/stack/sheet/plastic = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + + +/datum/crafting_recipe/holy_arrow + name = "Holy Arrow" + result = /obj/item/ammo_casing/arrow/holy + reqs = list( + /obj/item/ammo_casing/arrow = 1, + /datum/reagent/water/holywater = 10, + ) + tool_paths = list( + /obj/item/gun/ballistic/bow/divine, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/game/objects/items/granters/crafting/fletching.dm b/code/game/objects/items/granters/crafting/fletching.dm new file mode 100644 index 00000000000..e41c2f9acd1 --- /dev/null +++ b/code/game/objects/items/granters/crafting/fletching.dm @@ -0,0 +1,22 @@ + +/obj/item/book/granter/crafting_recipe/fletching + name = "Whittle Me This: Fletching for the Modern Spacer" + desc = "A how-to guide to crafting and maintaining wooden bows, fletching arrows, and... making violins?" + crafting_recipe_types = list( + /datum/crafting_recipe/arrow, + /datum/crafting_recipe/plastic_arrow, + /datum/crafting_recipe/shortbow, + /datum/crafting_recipe/holy_arrow, + /datum/crafting_recipe/arrow_quiver, + /datum/crafting_recipe/violin, + ) + icon_state = "book4" + uses = INFINITY + remarks = list( + "Okay, so the quality of the wood has some impact.", + "I feel like the violin chapter is in here as a joke, surely...", + "The author seems oddly proud about how many years they've been hunting in 'these parts'...", + "i really wish they'd stop with all the marriage euphemisms...", + "I need membership? Membership with what?", + "Okay, I think I get the point already...", + ) diff --git a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm index 3c4a55748c4..09ed5b40b1f 100644 --- a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm +++ b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm @@ -26,7 +26,7 @@ name = "Redfield Castle Archer" icon_state = "medisim_archer" - belt = /obj/item/storage/bag/quiver + belt = /obj/item/storage/bag/quiver/full suit = /obj/item/clothing/suit/armor/vest/cuirass l_hand = /obj/item/gun/ballistic/bow diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 3f7645559ff..f270b1da11f 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -309,11 +309,12 @@ risky espionage hallway operations. Enjoy our product!" contraband = TRUE cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/clothing/under/syndicate/floortilecamo = 3, - /obj/item/clothing/mask/floortilebalaclava = 3, - /obj/item/clothing/gloves/combat/floortile = 3, - /obj/item/clothing/shoes/jackboots/floortile = 3, - /obj/item/storage/backpack/floortile = 3 + contains = list( + /obj/item/clothing/under/syndicate/floortilecamo = 3, + /obj/item/clothing/mask/floortilebalaclava = 3, + /obj/item/clothing/gloves/combat/floortile = 3, + /obj/item/clothing/shoes/jackboots/floortile = 3, + /obj/item/storage/backpack/floortile = 3 ) crate_name = "floortile camouflauge crate" crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index fddd093b4fb..228d0d3e2fa 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -303,3 +303,17 @@ contains = list(/obj/item/wallframe/barsign/all_access) crate_name = "bar sign crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE + +/datum/supply_pack/service/bowmaking + name = "Fletching and Bow-Making Starter Kit" + desc = "A fairly outdated copy of 'Whittle Me This: Fletching for the Modern Spacer', along with some useful materials. \ + For those looking to get into bow-making, or give their LARPing a little more edge, you can't go wrong. Also has \ + instructions for making violins." + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/item/book/granter/crafting_recipe/fletching = 1, + /obj/item/stack/sheet/mineral/wood = 10, + /obj/item/stack/sheet/cloth = 10, + ) + crate_name = "bowmaking starter kit crate" + crate_type = /obj/structure/closet/crate/wooden diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 15c89ddb855..c0ce0b1ef2c 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -27,7 +27,12 @@ /obj/item/gun/ballistic/bow/update_icon_state() . = ..() - icon_state = chambered ? "[base_icon_state]_[drawn ? "drawn" : "nocked"]" : "[base_icon_state]" + icon_state = "[base_icon_state][drawn ? "_drawn" : ""]" + +/obj/item/gun/ballistic/bow/update_overlays() + . = ..() + if(chambered) + . += "[chambered.base_icon_state][drawn ? "_drawn" : ""]" /obj/item/gun/ballistic/bow/click_alt(mob/user) if(isnull(chambered)) @@ -72,6 +77,11 @@ return FALSE return ..() //fires, removing the arrow +/obj/item/gun/ballistic/bow/postfire_empty_checks(last_shot_succeeded) + if(!chambered && !get_ammo()) + drawn = FALSE + update_appearance() + /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() if(slot != ITEM_SLOT_HANDS && chambered) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 22e441cd56b..71d9472d58a 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -58,22 +58,34 @@ name = "holy arrow" desc = "Here it comes, cultist scum!" icon_state = "holy_arrow_projectile" - damage = 20 //still a lot but this is roundstart gear so far less - embedding = list( - embed_chance = 50, - fall_chance = 2, - jostle_chance = 0, - ignore_throwspeed_threshold = TRUE, - pain_stam_pct = 0.5, - pain_mult = 3, - rip_time = 1 SECONDS - ) /obj/projectile/bullet/arrow/holy/Initialize(mapload) . = ..() //50 damage to revenants AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 30) +/// plastic arrows +// completely dogshit quality and they break when they hit something. +/obj/item/ammo_casing/arrow/plastic + name = "plastic arrow" + desc = "The earliest mining teams within the Spinward Sector were the somewhat stout ancestors of the modern settlers. These teams \ + found themselves often unable to access the quality materials they were digging up for equipment maintenance, all being sent off-site. \ + Left with few options, and in need of a way to protect themselves in the hostile work enviroments of the Spinward, they turned \ + to the one material they had in abundance." + icon_state = "plastic_arrow" + base_icon_state = "plastic_arrow" + projectile_type = /obj/projectile/bullet/arrow/plastic + reusable = FALSE //cheap shit + +/// plastic arrow projectile +/obj/projectile/bullet/arrow/plastic + name = "plastic arrow" + desc = "If this is about to kill you, you should feel genuine shame." + damage = 5 + stamina = 50 + weak_against_armour = TRUE + icon_state = "plastic_arrow_projectile" + /// special pyre sect arrow /// in the future, this needs a special sprite, but bows don't support non-hardcoded arrow sprites /obj/item/ammo_casing/arrow/holy/blazing @@ -99,5 +111,5 @@ human_target.adjust_fire_stacks(2) human_target.ignite_mob() return - to_chat(human_target, span_danger("[src] reacts with the flames on y-")) + to_chat(human_target, span_danger("[src] reacts with the flames enveloping you! Oh shit!")) explosion(src, light_impact_range = 1, flame_range = 2) //ow diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm index 07d7cc93ce1..2492f0d4276 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm @@ -8,6 +8,7 @@ worn_icon_state = "harpoon_quiver" /// type of arrow the quivel should hold var/arrow_path = /obj/item/ammo_casing/arrow + var/max_slots = 40 /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() @@ -17,7 +18,10 @@ atom_storage.max_total_storage = 100 atom_storage.set_holdable(/obj/item/ammo_casing/arrow) -/obj/item/storage/bag/quiver/PopulateContents() +/obj/item/storage/bag/quiver/lesser + max_slots = 10 + +/obj/item/storage/bag/quiver/full/PopulateContents() . = ..() for(var/i in 1 to 10) new arrow_path(src) @@ -29,3 +33,8 @@ inhand_icon_state = "holyquiver" worn_icon_state = "holyquiver" arrow_path = /obj/item/ammo_casing/arrow/holy + +/obj/item/storage/bag/quiver/holy/PopulateContents() + . = ..() + for(var/i in 1 to 10) + new arrow_path(src) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index b9ac1af0cca..83b3bc43dd1 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -4,6 +4,12 @@ name = "longbow" desc = "While pretty finely crafted, surely you can find something better to use in the current year." +/// Shortbow, made via the crafting recipe +/obj/item/gun/ballistic/bow/shortbow + name = "shortbow" + desc = "A simple homemade shortbow. Great for LARPing. Or poking out someones eye." + projectile_damage_multiplier = 0.36 + ///chaplain's divine archer bow /obj/item/gun/ballistic/bow/divine name = "divine bow" @@ -15,6 +21,7 @@ slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME accepted_magazine_type = /obj/item/ammo_box/magazine/internal/bow/holy + projectile_damage_multiplier = 0.4 /obj/item/ammo_box/magazine/internal/bow/holy name = "divine bowstring" diff --git a/icons/obj/weapons/bows/arrows.dmi b/icons/obj/weapons/bows/arrows.dmi index 4453d4ca5f2..956a82dd9bf 100644 Binary files a/icons/obj/weapons/bows/arrows.dmi and b/icons/obj/weapons/bows/arrows.dmi differ diff --git a/icons/obj/weapons/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi index 81b2fc48220..4de9d4fca35 100644 Binary files a/icons/obj/weapons/bows/bows.dmi and b/icons/obj/weapons/bows/bows.dmi differ diff --git a/tgstation.dme b/tgstation.dme index b2529f4c1ed..0badc768610 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2467,6 +2467,7 @@ #include "code\game\objects\items\granters\crafting\combat_baking.dm" #include "code\game\objects\items\granters\crafting\death_sandwich.dm" #include "code\game\objects\items\granters\crafting\desserts.dm" +#include "code\game\objects\items\granters\crafting\fletching.dm" #include "code\game\objects\items\granters\crafting\pipegun.dm" #include "code\game\objects\items\granters\crafting\rebarxbowsyndie.dm" #include "code\game\objects\items\granters\crafting\regal_condor.dm"