Files
Bubberstation/code/modules/projectiles/ammunition/special/syringe.dm
SmArtKar 7f15e11993 Adds a new syringe gun mode and improves foam darts. (#89510)
## About The Pull Request

This PR implements multiple new features:

Foam darts now can stick to people as long as their cap isn't removed.
Riot foam darts have a chance to jostle when you move with one stuck
inside of you, dealing a bit of stamina damage from the weight stuck to
your limbs.

Syringe guns received a second "low power" mode, toggleable with in-hand
right click. In this mode, syringes fired will embed into their target
and slowly leak their reagents instead of instantly delivering them.
Thankfully, they can be plucked out pretty quickly.

You can also insert syringes into uncapped (screwdriver-ed) foam darts
(similarly to pens) to achieve the same result, allowing you to get a
bootleg low-efficiency syringe gun.

Additionally, I fixed/cleaned up some embedding issues/code which I
found while coding this.

## Why It's Good For The Game

This allows players to explore new funny interactions between items and
chems, as we don't have a reliable slow release mechanism aside from IV
drips currently. And foam darts embedding it just (mostly) harmless
fluff, if someone figures out a way to cause havoc with it then I'll be
very proud of them (someone totally will).

## Changelog
🆑
add: Foam darts now stick to people when they have their cap on, riot
foam darts also can passively deal a bit of stamina damage when you move
with one.
add: Syringes can be inserted into foam darts, making them embed and
slowly leak their reagents into their victim.
add: Syringe guns can be toggled (with right click) between high power
and low power modes, former being their normal functionality and latter
making syringes embed and slowly leak their contents.
fix: Fixed projectiles sometimes not embedding when they should've
code: Cleaned embedding code up
/🆑
2025-03-01 22:52:19 +11:00

88 lines
3.1 KiB
Plaintext

/obj/item/ammo_casing/syringegun
name = "syringe gun spring"
desc = "A high-power spring that throws syringes."
slot_flags = null
projectile_type = /obj/projectile/bullet/dart/syringe
firing_effect_type = null
/obj/item/ammo_casing/syringegun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
if(!loaded_projectile)
return
if(istype(loc, /obj/item/gun/syringe))
var/obj/item/gun/syringe/syringegun = loc
if(!syringegun.syringes.len)
return
var/obj/item/reagent_containers/syringe/syringe = syringegun.syringes[1]
var/obj/projectile/bullet/dart/dart = loaded_projectile
dart.name = syringe.name
dart.inject_flags = syringe.inject_flags
dart.armour_penetration = syringe.armour_penetration
syringegun.syringes.Remove(syringe)
if (syringegun.low_power)
insert_syringe(syringe)
return ..()
syringe.reagents.trans_to(dart, syringe.reagents.total_volume, transferred_by = user)
qdel(syringe)
return ..()
if(!istype(loc, /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun))
return ..()
var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/syringe_gun = loc
var/obj/item/reagent_containers/syringe/loaded_syringe = syringe_gun.syringes[1]
var/obj/projectile/bullet/dart/shot_dart = loaded_projectile
syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transferred_by = user)
shot_dart.name = loaded_syringe.name
shot_dart.inject_flags = loaded_syringe.inject_flags
LAZYREMOVE(syringe_gun.syringes, loaded_syringe)
qdel(loaded_syringe)
return ..()
/obj/item/ammo_casing/syringegun/proc/insert_syringe(obj/item/reagent_containers/syringe/syringe)
var/obj/projectile/bullet/dart/syringe/dart = loaded_projectile
dart.set_embed(syringe.get_embed()?.create_copy())
dart.get_embed().embed_chance = 100 // Don't want to fail the shot here
syringe.forceMove(dart)
dart.inner_syringe = syringe
/obj/item/ammo_casing/chemgun
name = "dart synthesiser"
desc = "A high-power spring, linked to an energy-based piercing dart synthesiser."
projectile_type = /obj/projectile/bullet/dart/piercing
firing_effect_type = null
/obj/item/ammo_casing/chemgun/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
if(!loaded_projectile)
return
if(istype(loc, /obj/item/gun/chem))
var/obj/item/gun/chem/CG = loc
if(CG.syringes_left <= 0)
return
CG.reagents.trans_to(loaded_projectile, 15, transferred_by = user)
loaded_projectile.name = "piercing chemical dart"
CG.syringes_left--
return ..()
/obj/item/ammo_casing/dnainjector
name = "rigged syringe gun spring"
desc = "A high-power spring that throws DNA injectors."
projectile_type = /obj/projectile/bullet/dnainjector
firing_effect_type = null
/obj/item/ammo_casing/dnainjector/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
if(!loaded_projectile)
return
if(istype(loc, /obj/item/gun/syringe/dna))
var/obj/item/gun/syringe/dna/SG = loc
if(!SG.syringes.len)
return
var/obj/item/dnainjector/S = popleft(SG.syringes)
var/obj/projectile/bullet/dnainjector/D = loaded_projectile
S.forceMove(D)
D.injector = S
return ..()