Skip to content

Commit

Permalink
Heavy Sniper Part 2 - The Heavying (cmss13-devs#6163)
Browse files Browse the repository at this point in the history
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->

# About the pull request

New Updates:
- AMR Aimed Shot base cast time increased by 60% from the M42A (1.25s to
2s), to emphasize working with spotter and normal shots, and solidly
setting the Aimed Shot DPS under the M42A even under optimal conditions
(decreased by ~40%). If this is too crippling, may increase Spotter Bino
bonus to the AMR or slightly roll back cast time in the future.
- Interrupt no longer applies to Queen and Crushers unless they are the
primary target of an Aimed Shot. Damage threshold requirements still
apply, and any piercing will still prevent it from interrupting big
xenos at all.
- Charger Strain no longer gets interrupted or slowed while charging.
- Aimed Shot slow no longer applies to Runners, as they didn't have the
protection of Focused Fire to reduce the duration by half initially.
- Screenshake maximum against big xenos decreased by 1 step. Now applies
at 90 and above to them, instead of 60.
- Changed non-xeno (human) stun to stamina damage instead of directly
stunning, to match slugs and high impact.



XM43E1 AMR shots now have stopping power, a scaling system that
functions similarly to shotgun slugs and heavy impact ammo, both in role
and visible effect.

**SCREENSHAKE:** Hitting a target will shake their screen so they know
they got hit by something heavy. This shaking scales with damage dealt,
with the maximum shake being equal to slugs and impact ammo. At 60 or
less damage, this does not shake the screen.

**INTERRUPTION:** Hitting a target will apply a mini-stun, scaling with
damage dealt. At 60 or less damage, this does not interrupt targets at
all.

- Big Xenos need a base damage of 90 or more damage, will only ever by
stunned for 0.1s max, and **cannot be knocked back.**
- Other xenos can be stunned for up to 0.3s if the base damage is more
than 120, losing 0.1s per 30 base damage, and will be knocked back at 90
damage or more.
- Non-xenos can be stunned for up to 3s, losing 1s per 30 base damage.

For comparison, impact rounds stun for 1s, and slugs stun for 1.4s as
well as buckshot within range. **The stun on this is much lower as it is
only meant to interrupt, and can affect big xenos if they are the only
target hit, which other heavy rounds cannot.**

**AIMED SHOT:** Can now potentially apply a slow scaling with stopping
power, similar but much weaker than M42A Flak. At 60 or less base
damage, no slows are applied.

- Lasts for at most 5s of slow, 2.5s of superslow against runners and
non-xenos, at 120 or more base damage.
- Slows are reduced by 1s and 0.5s respectively per size tier, and for
every 30 base damage lost.
- If this slows any amount, it will always give 0.2s of reduced vision
as a visible warning.

Other Changes:
- Defenders are no longer counted as an exception for Aimed Shot, only
Runners. Defenders should take 200+20% current health damage on an aimed
shot now, but are affected by Focus modifiers, so only 10% current
health on first, then 15%, then 20% current health. Being Fortified
reduces the flat damage to 125 but increases current health damage to
15/22.5/30%.
- Increased base armor penetration for XM43E1 and M42C, as in rare cases
target armor could go above 50.

<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->

# Explain why it's good for the game

The heavy sniper currently has almost no incentive to use its standard
fire due to how little ammo it has, and being less damage efficient
overall, as well as no utility on its normal shots. Consequently, it's
unable to actually support allies in most cases. These mechanics should
hopefully encourage standard fire more, especially against non T3s,
allowing heavy sniper users to juggle their objectives of focusing aimed
shots against a priority target while also using their standard shots at
critical points to save allies from getting dragged off. This leans
further into the weapon's identity as a support, as playtesting so far
has shown that it's generally much worse at securing kills due to
massively reduced DPS and aimed shot damage against T3s in the majority
of situations, with its current health scaling.

Because the stopping power mechanic has very low stun numbers, max 0.3s
against xenos, and the firerate is incredibly low at 3s between shots,
there's effectively no kill potential with this support feature.
Instead, it's a way to save allies from a far distance like slug
shotguns, but with IFF and much higher range, allowing it to be done
from safety with no risk of slugging your teammates in the back because
they resisted out of a grab.

Additionally, high-caliber rounds should feel heavy, which is why ammo
like Scout Impact and shotgun slugs give both mechanical and visual cues
when they hit a target. Briefly reduced vision, stun, knockback.

Both from the user's and target's perspectives, getting hit by a heavy
sniper round doesn't have any visual cue different from a pistol bullet,
and the only noticeable impact is health loss unless you're staring at
chat to see the 'hit by' message. There's a distinctive firing sound,
but in an active front it doesn't really let the target know they got
hit by the AMR, in the midst of all the other guns firing in their
direction.

With this update, the screenshake and small knockdown should make it
much more likely for targets to realize they've been hit by something
dangerous.

<!-- Please add a short description of why you think these changes would
benefit the game. If you can't justify it in words, it might not be
worth adding, and may discourage maintainers from reviewing or merging
your PR. This section is not strictly required for (non-controversial)
fix PRs or backend PRs. -->


# Testing Photographs and Procedure
<!-- Include any screenshots/videos/debugging steps of the modified code
functioning successfully, ideally including edge cases. -->

<!-- !! If you are modifying sprites, you **must** include one or more
in-game screenshots or videos of the new sprites. !! -->

<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
label your changes in the changelog. Please note that maintainers freely
reserve the right to remove and add tags should they deem it
appropriate. You can attempt to finagle the system all you want, but
it's best to shoot for clear communication right off the bat. -->
<!-- If you add a name after the ':cl', that name will be used in the
changelog. You must add your CKEY after the CL if your GitHub name
doesn't match. Maintainers freely reserve the right to remove and add
tags should they deem it appropriate. -->

:cl: Kaga
balance: The Heavy Sniper's XM43E1 rounds are now actually heavy.
Targets hit will get screenshake, like slugs and impact rounds, scaling
with damage dealt.
balance: XM43E1 shots can now potentially interrupt targets if it deals
enough damage. The heavier the target, the more force is needed to
interrupt them. Big xenos require a full-damage shot with no piercing,
while smaller targets can also be knocked back with enough damage.
balance: XM43E1 Aimed Shots can now potentially apply a slow to the main
target only, scaling with base damage and target size. If a slow is
applied, vision range is reduced for a moment as a warning.
balance: XM43E1 and M42C ammo AP increased to 75 (from 50)
balance: Removed the Defender exception from the AMR Aimed Shot
calculations.
/:cl:

<!-- Both :cl:'s are required for the changelog to work! -->

---------

Co-authored-by: forest2001 <[email protected]>
Co-authored-by: Drathek <[email protected]>
  • Loading branch information
3 people authored and Git-Nivrak committed Jun 9, 2024
1 parent 88df5eb commit ca36e50
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 7 deletions.
71 changes: 67 additions & 4 deletions code/datums/ammo/bullet/sniper.dm
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,59 @@
accuracy = HIT_ACCURACY_TIER_8
damage = 125
shell_speed = AMMO_SPEED_TIER_6
penetration = ARMOR_PENETRATION_TIER_10 + ARMOR_PENETRATION_TIER_5

/datum/ammo/bullet/sniper/anti_materiel/proc/stopping_power_knockback(mob/living/living_mob, obj/projectile/fired_projectile)
var/stopping_power = min(CEILING((fired_projectile.damage/30), 1), 5) // This is from bullet damage, and does not take Aimed Shot into account.

if(!living_mob || living_mob == fired_projectile.firer)
return stopping_power

if(stopping_power > 2)

// Depending on target size and damage, may apply a mini-stun to interrupt channels. Support your allies!
// For reference: Scout Impact stuns for up to 1s and slows for up to 10s, Shotgun stuns for 1.4s and slows for 4s
if(living_mob.mob_size >= MOB_SIZE_BIG)
// If above 90 damage, screenshake. This maxes out at (2,3), weaker than other impact rounds.
if(stopping_power > 3)
shake_camera(living_mob, (stopping_power - 3), (stopping_power - 2))
if(HAS_TRAIT(living_mob, TRAIT_CHARGING) && isxeno(living_mob))
to_chat(living_mob, SPAN_WARNING("A sudden massive impact strikes you, but your charge will not be stopped!"))
return stopping_power
if(stopping_power >= 4)
to_chat(living_mob, SPAN_XENOHIGHDANGER("You are knocked off-balance by the sudden massive impact!"))
if(living_mob.mob_size >= MOB_SIZE_IMMOBILE && !((fired_projectile.projectile_flags & PROJECTILE_BULLSEYE) && living_mob == fired_projectile.original)) // Queens and Crushers
return stopping_power // For Crushers and Queens, must be aimed at them.
living_mob.KnockDown(0.05) // Must deal more than 90 damage to mini-stun big mobs for 0.1s
// Can't interrupt a big mob unless it's completely alone with nothing blocking the shot.
else
to_chat(living_mob, SPAN_XENODANGER("You are shaken by the sudden heavy impact!"))
else
// If above 60 damage, screenshake. This maxes out at (3,4) like buckshot and heavy rounds. (1,2) (2,3) or (3,4)
shake_camera(living_mob, (stopping_power - 2), (stopping_power - 1))
if(living_mob.body_position != LYING_DOWN)
to_chat(living_mob, SPAN_XENOHIGHDANGER("You are thrown back by the sudden massive force!"))
slam_back(living_mob, fired_projectile)
else
to_chat(living_mob, SPAN_XENODANGER("You are shaken by the sudden heavy impact!"))

if(isxeno(living_mob))
living_mob.KnockDown((stopping_power - 2)*0.05) // Up to 0.3s on a solo target.
else
if(living_mob.stamina)
living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET)
// Not sure what this comes out to exactly, but follows the example of other heavy ammo like slugs of applying full base damage as stamina damage.
else
living_mob.KnockDown((stopping_power - 2)*0.3) // Rare exception of up to 1.8s on non-xenos without stamina.

return stopping_power

/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/target_mob,obj/projectile/aimed_projectile)

var/mob/living/living_target = target_mob

var/stopping_power = stopping_power_knockback(living_target, aimed_projectile)

if((aimed_projectile.projectile_flags & PROJECTILE_BULLSEYE) && target_mob == aimed_projectile.original)

var/amr_counter = 0
Expand Down Expand Up @@ -150,36 +198,50 @@
var/size_damage_mod = 0.8 // 1.8x vs Non-Xenos (225)
var/size_current_health_damage = 0 // % Current Health calculation, only used for Xeno calculations at the moment.
var/focused_fire_active = 0 // Whether to try and use focused fire calculations or not, for that kind of target.
var/slow_duration = stopping_power // Based on damage dealt.

if(slow_duration <= 2) // Must be over 60 base damage.
slow_duration = 0

if(isxeno(target_mob))
var/mob/living/carbon/xenomorph/target = target_mob
size_damage_mod -= 0.2 // Down to 1.6x damage, 200.
size_current_health_damage = 0.1 // 1.6x Damage + 10% current health (200 + 10%, 223 vs Runners)

if(target.mob_size >= MOB_SIZE_XENO && (target.caste_type != XENO_CASTE_DEFENDER))
if(target.mob_size >= MOB_SIZE_XENO)
size_current_health_damage += 0.1 // 1.6x Damage + 20% current health
focused_fire_active = 1 // Focus Fire Required. Only deals 50% bonus damage on a first Aimed Shot, then 75%, then 100%. Resets with a successful aimed shot on another target.
slow_duration = max(slow_duration-1, 0)

if(target.mob_size >= MOB_SIZE_BIG && (target.caste_type != XENO_CASTE_DEFENDER))
if(target.mob_size >= MOB_SIZE_BIG)
size_damage_mod -= 0.6 // Down to 1x Damage.
size_current_health_damage += 0.1 // 1x Damage + 30% current health.
focused_fire_active = 1
slow_duration = max(slow_duration-1, 0)
// Most T3s have around 650 to 700 HP, meaning the health modifier grants a MAXIMUM of around 195-210 damage for a total max of 320-335. This is fully focused (3 shots) and at max HP.
// Queen takes around 275 at max health and unfocused, 425 fully focused. Defender only takes 200 damage, even while fortified, but still causes falloff like a Big Xeno.
// Queen takes around 275 at max health and unfocused, 425 fully focused.
// At low health, does little more than a normal shot. Does WORSE than a normal shot if unfocused and hitting through blockers, all of which stack to reduce it.

var/final_xeno_damage = ((damage * size_damage_mod) + ((target.health + damage) * size_current_health_damage))

if(focused_fire_active && amr_counter) // If this is a target that needs to be focus-fired and the gun supports it, reduce bonus damage to 50%, then 75%, then 100%
// If amr_counter is 0, then the gun likely doesn't have the tracker functions, so skip this and deal normal damage.
final_xeno_damage *= (0.25 + (0.25 * amr_counter))
slow_duration *= (0.25 + (0.25 * amr_counter)) // 0-3s slow on Big mobs, based on Focus and falloff.

living_target.apply_armoured_damage((final_xeno_damage), ARMOR_BULLET, BRUTE, null, penetration)

else
living_target.apply_armoured_damage((damage*size_damage_mod), ARMOR_BULLET, BRUTE, null, penetration)

// Base 1.8x damage to non-xeno targets (225), 1.6x + 10% current against Runners and Defenders (223), 1.6x + 20% current health against most non-Runner xenos, and +30% current health against Big xenos. -Kaga
if(slow_duration && (living_target.mob_size != MOB_SIZE_XENO_SMALL) && !(HAS_TRAIT(living_target, TRAIT_CHARGING))) // Runners and Charging Crushers are not slowed.
living_target.Slow((slow_duration / 2))
if(slow_duration >= 2)
living_target.Superslow((slow_duration / 4))
if(stopping_power > 3)
living_target.Daze(0.1) // Visual cue that you got hit by something HARD.

// Base 1.8x damage to non-xeno targets (225), 1.6x + 10% current against Runners (223), 1.6x + 20% current health against most non-Runner xenos, and 1x + 30% current health against Big xenos. -Kaga
// This applies after pen reductions. After hitting 1 other thing, it deals 80% damage, or 40% after hitting a dense wall or big xeno.

if((focused_fire_active || isxeno(target_mob)) && !(target_mob.is_dead()))
Expand Down Expand Up @@ -253,6 +315,7 @@
accuracy = HIT_ACCURACY_TIER_8
damage = 150
shell_speed = AMMO_SPEED_TIER_6 + AMMO_SPEED_TIER_2
penetration = ARMOR_PENETRATION_TIER_10 + ARMOR_PENETRATION_TIER_5

/datum/ammo/bullet/sniper/elite/set_bullet_traits()
. = ..()
Expand Down
2 changes: 1 addition & 1 deletion code/modules/cm_marines/equipment/kit_boxes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@

/obj/item/storage/box/spec/sniper/anti_materiel/fill_preset_inventory()
name = "\improper AMR equipment case"
desc = "A large case containing an experimental XM43E1, a set of M45 ghillie armor and helmet, a M42 scout sight, ammunition, spotter equipment, and additional pieces of equipment.\nDrag this sprite onto yourself to open it up! NOTE: You cannot put items back inside this case."
desc = "A large case containing an experimental XM43E1, a set of M45 ghillie armor and helmet, an M42 scout sight, ammunition, a set of spotter gear, and additional pieces of equipment.\nDrag this sprite onto yourself to open it up! NOTE: You cannot put items back inside this case."
new /obj/item/clothing/suit/storage/marine/ghillie(src)
new /obj/item/clothing/head/helmet/marine/ghillie(src)
new /obj/item/clothing/glasses/night/m42_night_goggles(src)
Expand Down
5 changes: 3 additions & 2 deletions code/modules/projectiles/guns/specialist/sniper.dm
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
. = ..()
if(!has_aimed_shot)
return
. += SPAN_NOTICE("This weapon has an unique ability, Aimed Shot, allowing it to deal great damage after a windup.<br><b> Additionally, the aimed shot can be sped up with a tracking laser, which is enabled by default but may be disabled.</b>")
. += SPAN_NOTICE("This weapon has a special ability, Aimed Shot, allowing it to deal increased damage and inflict additional crippling effects after a windup, depending on the ammunition used.<br><b> Additionally, the aimed shot can be sped up with a spotter or by using the tracking laser, which is enabled by default but may be disabled.</b>")

/obj/item/weapon/gun/rifle/sniper/Initialize(mapload, spawn_empty)
if(has_aimed_shot)
Expand Down Expand Up @@ -362,12 +362,13 @@

/obj/item/weapon/gun/rifle/sniper/XM43E1
name = "\improper XM43E1 experimental anti-materiel rifle"
desc = "An experimental anti-materiel rifle produced by Armat Systems, recently reacquired from the deep storage of an abandoned prototyping facility. This one in particular is currently undergoing field testing. Chambered in 10x99mm Caseless.\nThis weapon can punch through thin metal plating and walls, though it'll lose most of its lethality in the process. It can even work for demolitions, with experienced users known to disassemble segments of solid, reinforced walls in the field with just a single standard magazine of 10x99mm. In lieu of explosives or an engineer, they instead use each of the 8 shots to break down vital structural supports, taking the wall apart in the process."
desc = "An experimental anti-materiel rifle produced by Armat Systems, recently reacquired from the deep storage of an abandoned prototyping facility. This one in particular is currently undergoing field testing. Chambered in 10x99mm Caseless.\n\nThis weapon can punch through thin metal plating and walls, though it'll lose most of its lethality in the process. It can even work for demolitions, with experienced users known to disassemble segments of solid, reinforced walls in the field with just a single standard magazine of 10x99mm. In lieu of explosives or an engineer, they instead use each of the 8 shots to break down vital structural supports, taking the wall apart in the process."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi'
icon_state = "xm43e1"
item_state = "xm43e1"
unacidable = TRUE
indestructible = 1
aiming_time = 2 SECONDS
aimed_shot_cooldown_delay = 4.5 SECONDS
var/focused_fire_counter = 0
var/datum/weakref/focused_fire_target = null
Expand Down

0 comments on commit ca36e50

Please sign in to comment.