From e4adc1a939465abb9fef0d2e5332fd9b2a33fea3 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Mon, 8 Jul 2024 01:57:32 +1000 Subject: [PATCH] Bow Update: Fletching instruction manual, bows using projectile damage multipliers, unhardcoded bow sprites, hot pink death (#84435) ## About The Pull Request Adds a new crate to the Service section of cargo. The Fletching and Bow-Making Starter Kit. Comes with some materials and a fletching instruction manual. The manual teaches you how to make shortbows (18 force from normal arrows utilizing projectile multipliers), arrows, holy arrows (but you need a divine bow to make them), quivers (but they only hold 10 arrows), plastic arrows and violins. For reasons. ![image](https://github.com/tgstation/tgstation/assets/40847847/576732f2-03b4-47b7-9bad-d85ff06480f0) ### Fixes Bows now no longer utilize hardcoded sprites for their loaded sprite. Now they use overlays. Bows properly become undrawn once fired. No longer can your bow magically launch arrows by sheer force of will. ## Why It's Good For The Game Initially I just wanted to provide a way for bow wielding chaplains to produce additional arrows for their bow. Running out of those always felt pretty lame. But then I got to thinking; actually, I kind of want to LARP sometimes as an archer. I think that'd be kind of goofy and fun. So I bundled that together into a solution for both. The shortbow is really, really not meant to be a meaningful weapon. It's just kind of silly, and meant to let people pretend to be Robin Hood and occasionally hurt someone in a workplace accident. I'm particularly thinking of clowns being the perfect users for this with their clumsy trait. I will make this weaker if I have too. (I am not, at this moment, redoing flaming arrows okay? I saw the code comment. I know. Not right now. @tralezab, if you have any flaming arrow sprites lying around, please let me know.) ## Changelog :cl: add: Fletching starter kit! Make your own bow, shoot your friends in an unfortunate workplace accident. Replace all those holy arrows you lost. fix: Bows now properly undraw once they have fired an arrow. code: Bows now utilize overlays in order to display loaded arrows. Unique overlays per arrow. /:cl: --- .../components/crafting/entertainment.dm | 15 ++++++ code/datums/components/crafting/equipment.dm | 11 +++++ .../components/crafting/ranged_weapon.dm | 15 ++++++ .../datums/components/crafting/weapon_ammo.dm | 43 ++++++++++++++++++ .../items/granters/crafting/fletching.dm | 22 +++++++++ .../medieval_sim/medisim_classes.dm | 2 +- code/modules/cargo/packs/imports.dm | 11 +++-- code/modules/cargo/packs/service.dm | 14 ++++++ .../projectiles/guns/ballistic/bows/_bow.dm | 12 ++++- .../guns/ballistic/bows/bow_arrows.dm | 34 +++++++++----- .../guns/ballistic/bows/bow_quivers.dm | 11 ++++- .../guns/ballistic/bows/bow_types.dm | 7 +++ icons/obj/weapons/bows/arrows.dmi | Bin 1304 -> 1571 bytes icons/obj/weapons/bows/bows.dmi | Bin 3295 -> 3914 bytes tgstation.dme | 1 + 15 files changed, 179 insertions(+), 19 deletions(-) create mode 100644 code/game/objects/items/granters/crafting/fletching.dm 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 4453d4ca5f24755be5fc0d0cd813cf84b97da6be..956a82dd9bf1f4288086729ecc2cada4d777fc4f 100644 GIT binary patch delta 1567 zcmV+)2H^Ra3Zo2=7k^*~1^@s6;+S_h0001>dQ@0+L}hbha%pgMX>V=-0C=30kGl%P zFbqX!`zu7Um%dgn#i4jeej%7djaA$_$fBWt-yuWE(k7cOoO=%{;Zj{)1GaYhg`6op z!N7U9*J`3(0vI?QwF*c>kU3=Wf?%NV%xNmL>WMQLIB0ca|9`;wUQ+GI>5iRH#J`1* z;=5h9{YAG3#^|$9x6-koH~rzck2D1NEh?dEEZExV55D_%hH>;U2mk;DK1oDDRCt{2 zoli)cXB@}BDPAT>1{nxlw+?&guryOD^U{gn4$djA(8~_HX&i3M!=QtWj#0FX3=a-> zPzSq|3A>CnG=C_gjJB7M>C!n=dNUHlRXq5H&C8PS4))2CsGUvT=a1(1fe;On=gH^$ zd!P4tpZ9$uAP9mW)B^drPBJ}4;|*T|s2;`}cZB?0Cq3qvpX)T|KuJ%fQcR^%H5q`% z9GM=Y#~jzj8~1(wIvtHF(ch+00DyQrjzl7%qbaBHn1ADUZ$6Jl4|h+UZ}~DmayJ_& z{~O-}xCF3RJOCsT32ek-SOoTU;H1Lz7{7iZA3(mprye7Bv-|$;l-~_60)c_nR@`~N z)$g}HklEQ;Cx> zZB?v|H-B<{c@^hdo+93H^BuV0){cE`ypj32PEK?+ znD1AyeD#{{nU6~WDEY&oIydB-z?A^j#v94>SZ&D%+z3F)cV^fziR}QILSeRE?5
KOB~S_3GV1?>PY-&QA6c7aG5*a6mcHSQY8m34g7HjnKCT;1}wW-RX1)qe>K z*8+(5W*G0yXqOM{ZD~5+|9>%h*WVF{_ht%}ue+_SnZ04o>Q>-V^_!Fr>;*6wjM@!A zU8ZLn)AAKo&w%v+Y{>@z>(g7?0oatU+PBee0hj>&vSpzx#z+P>c6w_|_LMBGUC0W_GSQb7xL@F;rR{RefDea%CMq#s5Zf z#lP!!2ZK>^f&B5o_W%GFCwKeOxH6e335*f*=TjAP8D8vcMG~r_|5WfxwW7 zHjfKhzB^i>#J>wf0ALoF*4f^1L`wkW;st|5$f;jQmOqMzA>luK|NjBgfxwUqH5NH& z3y|tR9ACG92su?e?#q^7kbm;ZS5+_7Z-B$(3kDGR77_Ut5&0Go`4$oR77_Ut5&0Go z`4$oRdO7fnSh3{twH-O5%lfo=AVA=yj2=hmrt9zIh4(947w(fX@Q~=k889 zDeOBRP%dB4OCf;iKwv0SbOJ@m&&Wv?vqZ?L8zgVYl+zv&a!TY2f*7Eme*wr~lM*{` R5WWBa002ovPDHLkV1fc5`ceP@ delta 1298 zcmV+t1?~Ey444X#7k@wq1^@s6V=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm%}mcIfpCgT5=&AQY!#Fe zi;D8gmAE)lGK-28Y!wW-IMa#}b5kK~R8{c>Mfq8&$t9UNsec4DWaQ^m#uH~YLMcfW zBo?LQWTt17;I~Ct!PU=2!Nu2;3jk$CR>mQONgn_J1U^YbK~#90?VCSn8&@31zZbOB zU>vwX5YoE1LyALGiQ z{X=dvYKi`?QUL&LY;2%ZD!I{=&=_p;#)ac}_~7u^sehTTTdQ|X#r_`012_w?T|5Ak zN+s-T8n%Fr4vZ?)GyLX>d;qQF!WdTXnjP;u=5)hbfU*>g;?74=r$4$Yg+f8dvc|pd z@$kVR0JJ{;QpM|^{n7Qu=Sm5>GzV-ofO`HiCL)Wj{`wCN4&3ZN7uLoz2 zZ!x7tIC0_x8vFZL{jKvP>qY2004e`Ser@*`)PI|Q_Wk|)3Lxn6qh}HXFtB`}k27H@ zKf&;;CmoRwykr1Ueu6XSXYteKZAat-FA+e{qly;uVUr|Ght(U!V&`ti$0IlO{hRHW3-sjrFg$w3uCx`tq%3huKR^y^kzxWma;QF;XHXpx-dq4k;FMmE<^S&cD0e%bU-nZ;OD{6>WN;}jHlhes` zV9KvVB9TZW5{V>G1me1Wip*Kh^NO7oe8Q!>X9Nlic@r%5oEQ?rbdNEi4|9{YkATQeB>lmKi_4hy6%a8S1)bis9qLiO*@~z{3_svzTZF+vvOMW0oEG+pN zz_81A{4Pl^u@AVzIM@zt0HYw^5&RefhP~`Kiq`>1`8K=^K+5leS38EK{2q95CM@Om zKr>9Xig9X&=~@V*F2C>f0Bgf)ZGUGEICu2gsXdhKl1F{2InaVkdAEk&H~zt2?>M)A zH$~=7K9T-z+woD9KQPw6z^U!qDKdAJfif*FdLaJN01E&B07*qo IM6N<$f}B2a<^TWy diff --git a/icons/obj/weapons/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi index 81b2fc4822058abe99e167aba7617fd26aa425ec..4de9d4fca35ab4fd3cc1d5a67be5964b0001c6dd 100644 GIT binary patch literal 3914 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 literal 3295 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 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"