From b67910652f8d3ababa42b14fa2638ca3c5f65ca2 Mon Sep 17 00:00:00 2001
From: nikothedude <59709059+nikothedude@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:56:33 -0400
Subject: [PATCH] Adds a new bow that penetrates armor to cargo and security
voucher + nonlethal arrows (#5390)
## About The Pull Request
Title.
Introduces a new bow and 2 new arrows: The hardlight bow, and the
blunt/taser arrows.
You can acquire these items via a new primary security voucher. This kit
gives you one bow, one quiver with 9 blunt and 1 taser, a hatchet, and a
book that teaches you how to build these arrows. **You do not gain the
ability to craft lethal arrows roundstart. You have to order the book
from cargo.**
You can also order a kit of 2 quivers and 2 bows from cargo. The quivers
have a mix of lethal and nonlethal arrows. They cost a little less than
a crate of 3 laser guns, so this is generally a suboptimal choice.
## The bow
Like all bows, it is bulky, and fits only in suit storage. Unlike other
bows, it is not weak against armor, and can cause wounds. It is a
hardlight bow - its string is made out of energy. You can obtain this
bow via a voucher or cargo. The bow itself is also an appreciable
weapon, doing 11 blunt damage (this is prone to change on review - this
was inherited from the base bow).
## The arrows
### Blunt
The blunt arrow is the simplest arrow. 35 stamina, 5 brute, 3 hits to
down. Craftable the same way a normal arrow is. Reusable. Causes
dislocations if fired in close quarters.
### Taser
You only spawn with one taser arrow roundstart. 5 stamina guaranteed, 40
and knockdown if the target isnt electrically insulated. Not reusable.
Craftable like a normal arrow, but with a igniter, cable, and a cell.
**This recipe is prone to change on review, as I feel it might be a bit
easy to make for its power, but I dont know what to add to make it
truely expensive.**
Both of these arrows can only be crafted if you have the fletching book,
or an arrow to convert.
This PR also locks bronze arrows to ashies and hearthkin exclusively, as
they are too powerful for their ease of crafting. Upgrading your arrows
to bone should take time and effort.
## Why It's Good For The Game
Well, A, I have a character that does bowsec, and as it stands, its
kinda useless. The arrows are too weak and fail on all armor. Bronze
arrows do THREE DAMAGE on a redsuit. THREE.
B., it adds a fairly unique way to play ranged security. Bows just -
function differently. You have to load each arrow manually, pick up your
dropped arrows, and deal with a relatively choked quiver (if you want to
deal with the quiver at all). You also have to craft your own arrows,
seek out another fletching book for lethal arrows... its a more involved
playstyle if you really want to go full bowman.
C. Flavor. Some characters. like my own, prefer more... traditional
methods of dealing with people. Bows, spears, cudgels, clubs.
I should note, this kit will be somewhat underpowered in actual combat.
Running around, trying to load your bow while under fire, is very
difficult, especially because the disabler generally has a higher DPS
anyway. I do think thats fine, as it is more of a sidegrade in the same
way the pepperball is, but if maintainers request, I could possibly
increase the damage this bow deals or some variation to make it worth
using.
## Proof Of Testing
Screenshots/Videos
https://github.com/user-attachments/assets/d2697261-2b13-4f4e-9288-4a1a2fe1d134
## Changelog
:cl:
add: A new security voucher - the archery kit, that gives you a bow that
penetrates armor and causes wounds, as well as some less-lethal arrows
add: An armory cargo order with two powerful bows and quivers with
lethal and nonlethal arrows
add: Two new less-lethal arrows craftable via the fletching book and
blacksmithing
balance: Bronze arrows can now only be crafted by ashies and hearthkin
/:cl:
---
.../items/granters/crafting/fletching.dm | 2 +
.../modules/mapping/code/mob_spawns.dm | 2 +
.../primitive_catgirls/code/spawner.dm | 7 +
.../sec_haul/code/guns/armory_spawns.dm | 5 +
.../modules/tribal_extended/code/recipes.dm | 1 +
.../objects/effects/spawners/random/armory.dm | 2 +-
.../code/modules/bow_adjustments/arrow.dm | 40 +++++-
.../code/modules/cargo/packs/security.dm | 51 ++++++++
.../ammunition/ballistic/arrows.dm | 122 ++++++++++++++++++
.../modules/projectiles/guns/ballistic/bow.dm | 10 ++
.../modules/security/sec_vouchers_vendor.dm | 36 ++++++
.../icons/obj/weapons/guns/arrows.dmi | Bin 0 -> 1053 bytes
.../icons/obj/weapons/guns/bow.dmi | Bin 0 -> 4176 bytes
tgstation.dme | 2 +
14 files changed, 277 insertions(+), 3 deletions(-)
create mode 100644 modular_zubbers/code/modules/projectiles/ammunition/ballistic/arrows.dm
create mode 100644 modular_zubbers/code/modules/projectiles/guns/ballistic/bow.dm
create mode 100644 modular_zubbers/icons/obj/weapons/guns/arrows.dmi
create mode 100644 modular_zubbers/icons/obj/weapons/guns/bow.dmi
diff --git a/code/game/objects/items/granters/crafting/fletching.dm b/code/game/objects/items/granters/crafting/fletching.dm
index 482cc2cd33e..7ca308dfd46 100644
--- a/code/game/objects/items/granters/crafting/fletching.dm
+++ b/code/game/objects/items/granters/crafting/fletching.dm
@@ -4,6 +4,8 @@
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/blunted_arrow,// BUBBER EDIT ADDITION - Nonlethal arrows
+ /datum/crafting_recipe/taser_arrow,// BUBBER EDIT ADDITION - Nonlethal arrows
/datum/crafting_recipe/plastic_arrow,
/datum/crafting_recipe/shortbow,
/datum/crafting_recipe/holy_arrow,
diff --git a/modular_skyrat/modules/mapping/code/mob_spawns.dm b/modular_skyrat/modules/mapping/code/mob_spawns.dm
index b37bac43217..1cdbed29d47 100644
--- a/modular_skyrat/modules/mapping/code/mob_spawns.dm
+++ b/modular_skyrat/modules/mapping/code/mob_spawns.dm
@@ -6,6 +6,8 @@
ADD_TRAIT(spawned_human, TRAIT_NOBREATH, ROUNDSTART_TRAIT)
ADD_TRAIT(spawned_human, TRAIT_RESISTCOLD, ROUNDSTART_TRAIT)
+ spawned_human.mind?.teach_crafting_recipe(/datum/crafting_recipe/bronze_arrow)
+
/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/special(mob/living/carbon/human/spawned_human)
. = ..()
spawned_human.grant_language(/datum/language/common, source = LANGUAGE_SPAWNER)
diff --git a/modular_skyrat/modules/primitive_catgirls/code/spawner.dm b/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
index 11a3d9d96ce..bea14f9e973 100644
--- a/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
+++ b/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
@@ -77,6 +77,13 @@
to_chat(user, span_warning("It'd be weird if there were multiple of you in that cave, wouldn't it?"))
return FALSE
+/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs)
+ . = ..()
+
+ if (ishuman(spawned_mob))
+ var/mob/living/carbon/human/human_spawned = spawned_mob
+ human_spawned.mind?.teach_crafting_recipe(/datum/crafting_recipe/bronze_arrow)
+
// This stuff is put on equip because it turns out /special sometimes just don't get called because skyrat
/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/equip(mob/living/carbon/human/spawned_human)
. = ..()
diff --git a/modular_skyrat/modules/sec_haul/code/guns/armory_spawns.dm b/modular_skyrat/modules/sec_haul/code/guns/armory_spawns.dm
index 03b321a383f..fe37942eb1b 100644
--- a/modular_skyrat/modules/sec_haul/code/guns/armory_spawns.dm
+++ b/modular_skyrat/modules/sec_haul/code/guns/armory_spawns.dm
@@ -43,8 +43,13 @@
/obj/item/gun/ballistic/shotgun/riot/sol,
/obj/item/gun/ballistic/shotgun/riot/sol,
/obj/item/gun/ballistic/shotgun/riot/sol,
+ /obj/item/gun/ballistic/bow/security,
)
+/obj/effect/spawner/armory_spawn/shotguns/Initialize(mapload)
+ . = ..()
+ new /obj/item/storage/bag/quiver/lesser/security/armory(loc)
+
/obj/structure/closet/ammunitionlocker/useful/PopulateContents()
new /obj/item/storage/box/rubbershot(src)
new /obj/item/storage/box/rubbershot(src)
diff --git a/modular_skyrat/modules/tribal_extended/code/recipes.dm b/modular_skyrat/modules/tribal_extended/code/recipes.dm
index 0266edca53b..d4dc8aedf58 100644
--- a/modular_skyrat/modules/tribal_extended/code/recipes.dm
+++ b/modular_skyrat/modules/tribal_extended/code/recipes.dm
@@ -47,6 +47,7 @@
)
category = CAT_WEAPON_AMMO
non_craftable = TRUE
+ crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED
steps = list("Reinforce the arrowhead with bronze.")
/datum/crafting_recipe/goliathshield
diff --git a/modular_zubbers/code/game/objects/effects/spawners/random/armory.dm b/modular_zubbers/code/game/objects/effects/spawners/random/armory.dm
index 0ae654d520f..252879574b1 100644
--- a/modular_zubbers/code/game/objects/effects/spawners/random/armory.dm
+++ b/modular_zubbers/code/game/objects/effects/spawners/random/armory.dm
@@ -60,7 +60,7 @@
spawn_all_loot = TRUE
/obj/effect/spawner/random/armory/shotgun
loot = list(
- /obj/item/gun/ballistic/shotgun/riot
+ /obj/item/gun/ballistic/shotgun/riot,
)
spawn_loot_count = 3
diff --git a/modular_zubbers/code/modules/bow_adjustments/arrow.dm b/modular_zubbers/code/modules/bow_adjustments/arrow.dm
index 384a267bf69..74e719a9f5f 100644
--- a/modular_zubbers/code/modules/bow_adjustments/arrow.dm
+++ b/modular_zubbers/code/modules/bow_adjustments/arrow.dm
@@ -12,7 +12,12 @@
wound_bonus = CANT_WOUND
range = 16
embed_type = /datum/embedding/arrow
- var/tribal_damage_bonus = 20 //If you're an icemoon dweller, or an ashwalker.
+ /// If you're an icemoon dweller, or an ashwalker, you gain this on top of being more effective against armor.
+ var/tribal_damage_bonus = 20
+ /// Does this arrow benefit from being a tribal?
+ var/gets_tribal_bonus = TRUE
+ /// If TRUE, this arrow will not obtain any benefits from being used by tribals or from a powerful bow.
+ var/already_effective = FALSE
faction_bonus_force = 10 //Bonus force dealt against certain factions
nemesis_paths = list(
/mob/living/simple_animal/hostile/asteroid,
@@ -20,17 +25,45 @@
/mob/living/basic/wumborian_fugu,
)
+/obj/item/gun/ballistic/bow
+ /// If this bow counts as being effectively used, which makes arrows not weak to armor and enables wounding.
+ var/effective = FALSE
+
+/obj/item/gun/ballistic/bow/divine
+ effective = TRUE
+
/obj/projectile/bullet/arrow/prehit_pierce(mob/living/target)
+ if (already_effective)
+ return ..()
+
var/mob/living/carbon/human/user = firer
if(isnull(target))
return ..()
- if(istype(user?.mind?.assigned_role, /datum/job/ash_walker) || istype(user?.mind?.assigned_role, /datum/job/primitive_catgirl))
+ var/effective_usage = FALSE
+
+ if(!isnull(fired_from) && istype(fired_from, /obj/item/gun/ballistic/bow))
+ var/obj/item/gun/ballistic/bow/bow = fired_from
+ if (bow.effective)
+ effective_usage = TRUE
+ if(gets_tribal_bonus && istype(user?.mind?.assigned_role, /datum/job/ash_walker) || istype(user?.mind?.assigned_role, /datum/job/primitive_catgirl))
damage += tribal_damage_bonus
+ effective_usage = TRUE
+
+ if(effective_usage)
weak_against_armour = FALSE
+ if (wound_bonus <= CANT_WOUND)
+ wound_bonus = -10
return ..()
+/obj/projectile/bullet/arrow/poison
+ damage = 20
+
+/obj/projectile/bullet/arrow/sticky
+ damage = 3 // decrease from 30 - makes it less lethal on initial impact and awful to tear out
+ stamina = 30
+
/obj/projectile/bullet/arrow/holy
damage = 25 // Increase from 20
embed_type = /datum/embedding/arrow
@@ -54,3 +87,6 @@
wound_bonus = CANT_WOUND
faction_bonus_force = 90
embed_type = /datum/embedding/arrow
+
+/obj/projectile/bullet/arrow/plastic
+ already_effective = TRUE
diff --git a/modular_zubbers/code/modules/cargo/packs/security.dm b/modular_zubbers/code/modules/cargo/packs/security.dm
index d268a10b6fb..9219945e1b4 100644
--- a/modular_zubbers/code/modules/cargo/packs/security.dm
+++ b/modular_zubbers/code/modules/cargo/packs/security.dm
@@ -125,3 +125,54 @@
/obj/item/ammo_box/magazine/recharge/ntusp,
/obj/item/ammo_box/magazine/recharge/ntusp)
crate_name = "nt-usp crate"
+
+/datum/supply_pack/security/armory/archery_kit
+ name = "Archery Crate"
+ desc = "Two hardlight bows capable of defeating armor, alongside a mix of lethal and non/less-than-lethal arrows."
+ cost = CARGO_CRATE_VALUE * 6
+ contains = list(
+ /obj/item/gun/ballistic/bow/security,
+ /obj/item/gun/ballistic/bow/security,
+ /obj/item/storage/bag/quiver/lesser/security/armory,
+ /obj/item/storage/bag/quiver/lesser/security/armory,
+ )
+
+/obj/item/storage/bag/quiver/lesser/security/armory
+
+/obj/item/storage/bag/quiver/lesser/security/armory/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/ammo_casing/arrow/blunt = 3,
+ /obj/item/ammo_casing/arrow = 6,
+ /obj/item/ammo_casing/arrow/taser = 1
+ )
+
+ generate_items_inside(items_inside, src)
+
+/datum/supply_pack/security/armory/lethal_arrows
+ name = "Arrow Crate"
+ desc = "Two quivers containing nine normal arrows and one randomly selected specialty arrow."
+ cost = CARGO_CRATE_VALUE * 3
+ contains = list(
+ /obj/item/storage/bag/quiver/lesser/security/lethal,
+ /obj/item/storage/bag/quiver/lesser/security/lethal
+ )
+
+/obj/item/storage/bag/quiver/lesser/security/lethal
+
+/obj/item/storage/bag/quiver/lesser/security/lethal/PopulateContents()
+ var/static/list/static_items = list(
+ /obj/item/ammo_casing/arrow = 9
+ )
+ /// Typepath -> Weight
+ var/static/list/bonus_items = list(
+ /obj/item/ammo_casing/arrow/sticky = 10,
+ /obj/item/ammo_casing/arrow/poison = 10,
+ /obj/item/ammo_casing/arrow/plastic = 6,
+ /obj/item/ammo_casing/arrow/bronze = 1,
+ /obj/item/ammo_casing/arrow/taser = 1,
+ )
+
+ var/list/obj/item/ammo_casing/arrow/to_spawn = static_items.Copy()
+ to_spawn[pick_weight(bonus_items)] = 1
+
+ generate_items_inside(to_spawn, src)
diff --git a/modular_zubbers/code/modules/projectiles/ammunition/ballistic/arrows.dm b/modular_zubbers/code/modules/projectiles/ammunition/ballistic/arrows.dm
new file mode 100644
index 00000000000..a2b814a5c9d
--- /dev/null
+++ b/modular_zubbers/code/modules/projectiles/ammunition/ballistic/arrows.dm
@@ -0,0 +1,122 @@
+/datum/crafting_recipe/blunted_arrow
+ name = "Arrow (Less-lethal)"
+ result = /obj/item/ammo_casing/arrow/blunt
+ 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,
+ )
+ category = CAT_WEAPON_AMMO
+ crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED
+
+/datum/crafting_recipe/blunted_arrow_conversion
+ name = "Blunt Arrow Conversion"
+ result = /obj/item/ammo_casing/arrow/blunt
+ reqs = list(
+ /obj/item/ammo_casing/arrow = 1,
+ )
+ tool_behaviors = list(TOOL_SAW)
+ category = CAT_WEAPON_AMMO
+ non_craftable = TRUE
+ steps = list("Smooth the arrowhead with the saw.")
+
+/datum/crafting_recipe/taser_arrow
+ name = "Arrow (Electric, Non-lethal)"
+ result = /obj/item/ammo_casing/arrow/taser
+ reqs = list(
+ /obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/stack/sheet/cloth = 1,
+ /obj/item/stack/sheet/iron = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stock_parts/power_store/cell = 1,
+ )
+ tool_paths = list(
+ /obj/item/hatchet,
+ )
+ category = CAT_WEAPON_AMMO
+ crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED
+
+/datum/crafting_recipe/taser_arrow_conversion
+ name = "Taser Arrow Conversion"
+ result = /obj/item/ammo_casing/arrow/taser
+ reqs = list(
+ /obj/item/ammo_casing/arrow = 1,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/assembly/igniter = 1,
+ /obj/item/stock_parts/power_store/cell = 1,
+ )
+ blacklist = list(
+ /obj/item/ammo_casing/arrow/taser
+ )
+ time = 1 SECONDS
+ tool_behaviors = list(TOOL_SAW)
+ category = CAT_WEAPON_AMMO
+
+/obj/item/ammo_casing/arrow/blunt
+ name = "blunt arrow"
+ desc = "An arrow with its head reduced to a blunt tip. Suitable for breaking bones and subduing targets without excessive physical damage. Staggers targets on impact."
+ icon = 'modular_zubbers/icons/obj/weapons/guns/arrows.dmi'
+ icon_state = "blunt_arrow"
+ projectile_type = /obj/projectile/bullet/arrow/blunt
+
+/obj/projectile/bullet/arrow/blunt
+ name = "blunt arrow"
+ desc = "A blunted arrow."
+ damage = 5 // ow
+ stamina = 40 // its okay
+ wound_bonus = 35 // will sometimes cause dislocations at close range
+ gets_tribal_bonus = FALSE // technically a modern arrow + meant to be less lethal
+ embed_type = null
+ sharpness = NONE
+
+/obj/projectile/bullet/arrow/blunt/on_hit(atom/target, blocked, pierce_hit)
+ . = ..()
+
+ if (pierce_hit)
+ return
+ if (. == BULLET_ACT_BLOCK || blocked >= 100 || !isliving(target))
+ return
+
+ var/mob/living/living_target = target
+ var/percent_blocked = blocked / 100
+
+ living_target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * (1 - percent_blocked), 10 SECONDS) // it hits really hard
+
+/obj/item/ammo_casing/arrow/taser
+ name = "taser arrow"
+ desc = "An arrow, the head removed, replaced with an igniter, and hooked up to a power cell. Negligible damage, but capable of delivering a terrible electric shock.\n\
+ Likely to break apart on impact. Ineffective against those insulated against electricity."
+ icon = 'modular_zubbers/icons/obj/weapons/guns/arrows.dmi'
+ icon_state = "taser_arrow"
+ reusable = FALSE
+ projectile_type = /obj/projectile/bullet/arrow/taser
+ harmful = FALSE
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.2, /datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.1)
+
+/obj/projectile/bullet/arrow/taser
+ name = "taser arrow"
+ desc = "A jury-rigged taser arrow, capable of delivering a terrible electric shock, and not much else."
+ icon = 'modular_zubbers/icons/obj/weapons/guns/arrows.dmi'
+ icon_state = "taser_arrow_projectile"
+ damage = 0 // lol
+ stamina = 5
+ /// Staimna damage to be dealt by the shock. Separate from stamina - insulated individuals might be immune to the shock.
+ var/shock_damage = 50 //stamcrit in two but any armor at all reduces it to three
+ gets_tribal_bonus = FALSE // technically a modern arrow + meant to be less lethal
+ embed_type = null
+ sharpness = NONE
+
+/obj/projectile/bullet/arrow/taser/on_hit(atom/target, blocked, pierce_hit)
+ . = ..()
+
+ if (pierce_hit)
+ return
+ do_sparks(3, TRUE, src)
+ if (. == BULLET_ACT_BLOCK || blocked >= 100 || !isliving(target))
+ return
+ var/mob/living/living_target = target
+ living_target.electrocute_act(shock_damage, src, 1, SHOCK_ILLUSION|SHOCK_SUPPRESS_MESSAGE|SHOCK_NOGLOVES|SHOCK_KNOCKDOWN) // illusion so it doesnt do damage
diff --git a/modular_zubbers/code/modules/projectiles/guns/ballistic/bow.dm b/modular_zubbers/code/modules/projectiles/guns/ballistic/bow.dm
new file mode 100644
index 00000000000..4eac33c55b3
--- /dev/null
+++ b/modular_zubbers/code/modules/projectiles/guns/ballistic/bow.dm
@@ -0,0 +1,10 @@
+
+/obj/item/gun/ballistic/bow/security
+ name = "hardlight bow"
+ desc = "A classic shortbow design, upgraded with carbon fiber structure and a hardlight bowstring. Elegant to use, though undeniably still a bit antiquated. \
+ Offers heightened armor penetration and wounding potential than the older variants."
+ effective = TRUE
+ icon = 'modular_zubbers/icons/obj/weapons/guns/bow.dmi'
+ icon_state = "hardlightbow"
+ inhand_icon_state = "bow_hardlight"
+ base_icon_state = "hardlightbow"
diff --git a/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm b/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm
index 1e22190b392..1f5ef457988 100644
--- a/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm
+++ b/modular_zubbers/code/modules/security/sec_vouchers_vendor.dm
@@ -66,6 +66,42 @@
/obj/item/shield/riot/flash,
)
+/datum/voucher_set/security/primary/archery
+ name = "Archery Kit"
+ description = "A powerful bow, a training manual, and a quiver with non/less-than-lethal arrows. You will still need to order the fletching kit from cargo if you want to make lethal arrows."
+ icon = 'icons/obj/weapons/bows/bows.dmi'
+ icon_state = "hardlightbow"
+ set_items = list(
+ /obj/item/gun/ballistic/bow/security,
+ /obj/item/storage/bag/quiver/lesser/security,
+ /obj/item/book/granter/crafting_recipe/fletching/nonlethal,
+ /obj/item/hatchet,
+ )
+
+/obj/item/storage/bag/quiver/lesser/security
+ name = "security quiver"
+ desc = "A lightweight, low-capacity quiver capable of being folded into pockets, but nothing else."
+ slot_flags = ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET|ITEM_SLOT_BELT
+
+/obj/item/storage/bag/quiver/lesser/security/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/ammo_casing/arrow/blunt = 7,
+ /obj/item/ammo_casing/arrow/taser = 3
+ )
+
+ generate_items_inside(items_inside, src)
+
+/obj/item/book/granter/crafting_recipe/fletching/nonlethal
+ name = "Aim for the knees, not the eyes!"
+ desc = "A manual on how to construct sub-lethal bows & arrows, how best to use them... and how to construct violins?"
+ crafting_recipe_types = list(
+ /datum/crafting_recipe/shortbow,
+ /datum/crafting_recipe/blunted_arrow,
+ /datum/crafting_recipe/taser_arrow,
+ /datum/crafting_recipe/violin,
+ )
+ uses = 1
+
/datum/voucher_set/security/primary/nt_usp
name = "NT-USP Pistol"
description = "A small pistol that uses hardlight technology to synthesize bullets. Due to its low power, it doesn't have much use besides tiring out criminals."
diff --git a/modular_zubbers/icons/obj/weapons/guns/arrows.dmi b/modular_zubbers/icons/obj/weapons/guns/arrows.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..995a4d563b92aed94e2f5ef6c9bc16fd989ba98c
GIT binary patch
literal 1053
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
literal 0
HcmV?d00001
diff --git a/tgstation.dme b/tgstation.dme
index c9ebda5e700..54a1f9a0fe5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -9794,12 +9794,14 @@
#include "modular_zubbers\code\modules\primitive_catgirls\code\spawner.dm"
#include "modular_zubbers\code\modules\privacy_policy\privacy_policy.dm"
#include "modular_zubbers\code\modules\projectiles\beams.dm"
+#include "modular_zubbers\code\modules\projectiles\ammunition\ballistic\arrows.dm"
#include "modular_zubbers\code\modules\projectiles\ammunition\ballistic\pistol.dm"
#include "modular_zubbers\code\modules\projectiles\ammunition\ballistic\rifle.dm"
#include "modular_zubbers\code\modules\projectiles\ammunition\ballistic\smg.dm"
#include "modular_zubbers\code\modules\projectiles\boxes_magazines\external\pistol.dm"
#include "modular_zubbers\code\modules\projectiles\boxes_magazines\external\smg.dm"
#include "modular_zubbers\code\modules\projectiles\guns\ballistic\automatic.dm"
+#include "modular_zubbers\code\modules\projectiles\guns\ballistic\bow.dm"
#include "modular_zubbers\code\modules\projectiles\guns\ballistic\pistol.dm"
#include "modular_zubbers\code\modules\projectiles\guns\ballistic\rifle.dm"
#include "modular_zubbers\code\modules\projectiles\guns\energy\pulse.dm"