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
🆑
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.
/🆑
This commit is contained in:
necromanceranne
2024-07-07 17:57:32 +02:00
committed by GitHub
parent 743b95b50a
commit e4adc1a939
15 changed files with 179 additions and 19 deletions
@@ -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)
@@ -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
@@ -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)
@@ -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"