Files
Bubberstation/code/modules/projectiles/projectile/bullets/rifle.dm
SmArtKar c108ef79ac Healium bolts now embed and heal/knock out passively over time instead of being instant and unblockable (#91481)
## About The Pull Request

Healium bolts now heal you for 5 of each damage per second for 6 seconds
before falling out, while applying 2 seconds of drowsiness. If you have
at least 5 seconds of drowsiness (after 4 seconds of processing, because
we add 2 and it gets deducted by 1 afterwards) you get knocked out for 3
seconds (similarly to how it worked before, but with 1 additional second
left of processing if you were only shot by one bolt, you end up knocked
out for 4 seconds). It takes 1.5 seconds to rip one out, so you should
be able to react to being shot by one unless the attacker follows it up
with a melee distruption. Bolts that fall out restore their charges, but
only one bolt at a time can be putting the target to sleep.

https://github.com/user-attachments/assets/7936895e-f4dc-4bd6-847f-495c7f1202db

Video is a bit outdated, delay before knockout been bumped by a second.

###### This is a commission for Ezel/Improvedname

## Why It's Good For The Game

Healium bolts are an instant knockout that could be mass-produced to
either instantly win fights, or thrown at medbay to quickly hit corpses
by poking them over and over again as bolts didn't even embed, so
players can instantly reload and shoot them again. It was either making
them harder to produce, or reducing the effects, and former wouldn't
solve the knockout issue.
They also didn't care about block values, so even if you blocked or
reflected one you'd still get knocked out. lol

## Changelog

🆑
balance: Healium bolts now heal and knock out overtime while being
embedded instead of being instant.
balance: Healium bolts dissolve after being embedded for 6 seconds and
don't work on corpses
fix: Healium bolts no longer ignore being blocked/parried/reflected
/🆑
2025-06-29 13:47:00 +10:00

231 lines
6.4 KiB
Plaintext

// .223 (M-90gl Carbine)
/obj/projectile/bullet/a223
name = ".223 bullet"
damage = 35
armour_penetration = 30
wound_bonus = -40
/obj/projectile/bullet/a223/weak //centcom
damage = 20
/obj/projectile/bullet/a223/phasic
name = ".223 phasic bullet"
icon_state = "gaussphase"
damage = 30
armour_penetration = 100
projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS
// .310 Strilka (Sakhno Rifle)
/obj/projectile/bullet/strilka310
name = ".310 Strilka bullet"
damage = 60
armour_penetration = 10
wound_bonus = -45
wound_falloff_tile = 0
/obj/projectile/bullet/strilka310/surplus
name = ".310 Strilka surplus bullet"
weak_against_armour = TRUE //this is specifically more important for fighting carbons than fighting noncarbons. Against a simple mob, this is still a full force bullet
armour_penetration = 0
/obj/projectile/bullet/strilka310/enchanted
name = "enchanted .310 bullet"
damage = 20
stamina = 80
/obj/projectile/bullet/strilka310/phasic
name = "phasic .310 bullet"
projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS
// Harpoons (Harpoon Gun)
/obj/projectile/bullet/harpoon
name = "harpoon"
icon_state = "gauss"
damage = 60
armour_penetration = 50
wound_bonus = -20
exposed_wound_bonus = 80
embed_type = /datum/embedding/harpoon
wound_falloff_tile = -5
shrapnel_type = null
/datum/embedding/harpoon
embed_chance = 100
fall_chance = 3
jostle_chance = 4
ignore_throwspeed_threshold = TRUE
pain_stam_pct = 0.4
pain_mult = 5
jostle_pain_mult = 6
rip_time = 1 SECONDS
// Rebar (Rebar Crossbow)
/obj/projectile/bullet/rebar
name = "rebar"
icon_state = "rebar"
damage = 30
speed = 2.5
dismemberment = 1 //because a 1 in 100 chance to just blow someones arm off is enough to be cool but also not enough to be reliable
armour_penetration = 10
wound_bonus = -20
exposed_wound_bonus = 20
embed_type = /datum/embedding/rebar
embed_falloff_tile = -5
wound_falloff_tile = -2
shrapnel_type = /obj/item/ammo_casing/rebar
/datum/embedding/rebar
embed_chance = 60
fall_chance = 2
jostle_chance = 2
ignore_throwspeed_threshold = TRUE
pain_stam_pct = 0.4
pain_mult = 4
jostle_pain_mult = 2
rip_time = 1 SECONDS
/obj/projectile/bullet/rebar/proc/handle_drop(datum/source, obj/item/ammo_casing/rebar/newcasing)
/obj/projectile/bullet/rebar/syndie
name = "rebar"
icon_state = "rebar"
damage = 45
dismemberment = 2 //It's a budget sniper rifle.
armour_penetration = 20 //A bit better versus armor. Gets past anti laser armor or a vest, but doesnt wound proc on sec armor.
wound_bonus = 10
exposed_wound_bonus = 20
embed_falloff_tile = -3
embed_type = /datum/embedding/rebar_syndie
shrapnel_type = /obj/item/ammo_casing/rebar/syndie
/datum/embedding/rebar_syndie
embed_chance = 80
fall_chance = 1
jostle_chance = 3
ignore_throwspeed_threshold
pain_stam_pct = 0.4
pain_mult = 3
jostle_pain_mult = 2
rip_time = 1.4 SECONDS
/obj/projectile/bullet/rebar/zaukerite
name = "zaukerite shard"
icon_state = "rebar_zaukerite"
damage = 60
speed = 1.6
dismemberment = 10
damage_type = TOX
eyeblur = 5
armour_penetration = 20 // not nearly as good, as its not as sharp.
wound_bonus = 10
exposed_wound_bonus = 40
embed_type = /datum/embedding/rebar_zaukerite
embed_falloff_tile = 0 // very spiky.
shrapnel_type = /obj/item/ammo_casing/rebar/zaukerite
/datum/embedding/rebar_zaukerite
embed_chance = 100
fall_chance = 0
jostle_chance = 5
ignore_throwspeed_threshold = TRUE
pain_stam_pct = 0.8
pain_mult = 6
jostle_pain_mult = 2
rip_time = 3 SECONDS
/obj/projectile/bullet/rebar/hydrogen
name = "metallic hydrogen bolt"
icon_state = "rebar_hydrogen"
damage = 35
speed = 1.6
projectile_piercing = PASSMOB|PASSVEHICLE
projectile_phasing = ~(PASSMOB|PASSVEHICLE)
max_pierces = 3
phasing_ignore_direct_target = TRUE
dismemberment = 0 //goes through clean.
damage_type = BRUTE
armour_penetration = 30 //very pointy.
wound_bonus = -100
exposed_wound_bonus = 0
shrapnel_type = /obj/item/ammo_casing/rebar/hydrogen
embed_type = /datum/embedding/rebar_hydrogen
embed_falloff_tile = -3
accurate_range = 205 //15 tiles before falloff starts to kick in
/obj/projectile/bullet/rebar/hydrogen/impact(atom/A)
. = ..()
def_zone = ran_zone(def_zone, clamp(205-(7*get_dist(get_turf(A), starting)), 5, 100))
/datum/embedding/rebar_hydrogen
embed_chance = 0
/obj/projectile/bullet/rebar/hydrogen/on_hit(atom/target, blocked, pierce_hit)
if(isAI(target))
return BULLET_ACT_FORCE_PIERCE
return ..()
/obj/projectile/bullet/rebar/healium
name = "healium bolt"
icon_state = "rebar_healium"
damage = 0
dismemberment = 0
damage_type = BRUTE
armour_penetration = 100
wound_bonus = -100
exposed_wound_bonus = -100
embed_falloff_tile = -3
shrapnel_type = /obj/item/ammo_casing/rebar/healium
embed_type = /datum/embedding/rebar_healium
/// Amount of heals left in our bolt, so we can track it between embeds/misses
var/heals_left = 6 SECONDS
/obj/projectile/bullet/rebar/healium/Initialize(mapload)
. = ..()
RegisterSignals(src, list(COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED), PROC_REF(on_spawn_embedded))
/obj/projectile/bullet/rebar/healium/proc/on_spawn_embedded(datum/source, obj/item/ammo_casing/rebar/healium/rebar)
SIGNAL_HANDLER
rebar.heals_left = heals_left
/obj/projectile/bullet/rebar/supermatter
name = "supermatter bolt"
icon_state = "rebar_supermatter"
damage = 0
dismemberment = 0
damage_type = TOX
embed_type = null
armour_penetration = 100
shrapnel_type = /obj/item/ammo_casing/rebar/supermatter
/obj/projectile/bullet/rebar/supermatter/on_hit(atom/target, blocked = 0, pierce_hit)
. = ..()
if(isliving(target))
var/mob/living/victim = target
victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS)
dust_feedback(target)
victim.dust()
else if(!isturf(target)&& !isliving(target))
dust_feedback(target)
qdel(target)
return BULLET_ACT_HIT
/obj/projectile/bullet/rebar/supermatter/proc/dust_feedback(atom/target)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE)
visible_message(span_danger("[target] is hit by [src], turning [target.p_them()] to dust in a brilliant flash of light!"))
/obj/projectile/bullet/paperball
desc = "Doink!"
damage = 1 // It's a damn toy.
range = 10
shrapnel_type = null
embed_type = null
name = "paper ball"
desc = "doink!"
damage_type = BRUTE
icon_state = "paperball"