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
<details>
<summary>Screenshots/Videos</summary>

<img width="1879" height="526" alt="image"
src="https://github.com/user-attachments/assets/91ab9832-cc2d-4355-ad85-654611c8c66d"
/>


https://github.com/user-attachments/assets/d2697261-2b13-4f4e-9288-4a1a2fe1d134

</details>

## Changelog
🆑
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
/🆑
This commit is contained in:
nikothedude
2026-04-13 21:56:33 +02:00
committed by GitHub
parent c07c2d2406
commit b67910652f
14 changed files with 277 additions and 3 deletions
@@ -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,
@@ -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)
@@ -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)
. = ..()
@@ -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)
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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"
@@ -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."
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+2
View File
@@ -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"