Skip to content

Commit

Permalink
Minor Nukie Thing: Bolt-action Sniper Rifle, balance coding, and some…
Browse files Browse the repository at this point in the history
… ammo changes (tgstation#73781)

## About The Pull Request

### The Rifle:
-The Sniper Rifle is now a bolt action. This replaces the 4 second fire
delay on the sniper rifle. This overall will improve the fire rate if
you're good at racking the bolt, but it will also feel less like you're
in a weird limbo of inaction while using the sniper rifle, since the
fire delay can be quite confusing to players not used to it. This can be
tweaked, like reducing the speed of the racking action, if it seems like
it is too much.
-The scope component now goes up to 50 tiles (or so), which allows you
to gain a significant sightline over an area. The reasoning for this is
simple. The component actually nerfed the overall range of the sniper
rifle's scope, so this should hopefully restore that somewhat. And
having such a huge sightline makes it much easier to utilize the
impressive range of the rifle. Currently, it's really only ideal for
extremely close range fighting.
-The normal sniper rifle, the one that syndicate base scientists get,
can be suppressed. I don't know why it was different.

### The Ammo:

Normal .50 BMG: Does much more object damage, and on top of that deals
additional damage to mechs, but not by much more. Now, when it
dismembers a limb, it also deals its damage to the chest. This ensures
that you didn't straight up lose out on dealing a killing blow because
you took their limb off, and makes the dismemberment property of .50 BMG
a significant upside rather than a immense detriment.

Marksman: Gains a lot of the above benefits, but has much lower range.
Why this nerf? It's actually because of some funny nonsense with how
ricochet works. Which can cause....accidents to happen. To you. Consider
that firing down a straight line and missing could be quite embarrassing
when the bullet has 400 tiles of range.

Soporific: Now called Disruptor ammo. Works as it did before, putting
humans to sleep for 40 seconds (seriously, 40 seconds). Also deals some
stamina damage, if...that's relevant. But now also causes an EMP effect
and a boatload of added damage to both mechs and borgs, allowing it to
be an excellent anti-mech and anti-borg ammo type, as well as scrambling
any pesky suit sensors, energy weapons and so on in an area around the
impact. Useful for support fire.

Incendiary (NEW!): Causes a massive firebomb to go off where it impacts
(no explosion, so this isn't a stun). Also sets the target on fire,
which is always fun. Good for shooting into groups of people with
impunity. Also deals burn damage instead, since I think nukies could use
more methods for direct fire damage.

Surplus (NEW!): It's .50 BMG but it lacks most if not all the upsides.
No armour penetration, no dismemberment, no paralysis. It still deals a
lot of damage to objects, so not a bad option for simply removing
structures from afar. So what's the point in this ammo? You can buy 7
magazines for the price of one. I want to introduce 'Surplus' as an idea
for nukies to invest in if they want to be able to keep shooting but
they're really on a budget, like most non-warop nukies tend to be. This
is definitely subject to change (like a damage decrease on top of
everything else).

Pricing and Capacity: Normal ammo and surplus costs 3 TC. Every special
ammo costs 4 TC. Every special ammo also has the same ammo capacity as
the normal magazine. It's kind of weird how most of the subtypes had 5
shots rather than 6, but then soporific had...3? I don't get it. This
would probably cause a good deal of confusion, especially if you are
swapping ammo types and weren't aware of this particular oddity.

Anyway, 6 shots.

### Minor Addition
Gets rid of the cheap suppressor. It lies to players, tricking them into
thinking this is a low quality suppressor. Newsflash, it isn't. There is
no distinct difference between that suppressor and the normal
suppressor.

## Why It's Good For The Game

The sniper rifle, unfortunately, sucks a lot except for very specific
use cases. It got a big nerf with the scope component in terms of range,
even if the functionality is way cooler. And, at a baseline, there was
some counterintuitive functions attached to it. Dismemberment was cool,
but it also caused a loss in overall damage due to how limbs contribute
to core health. On top of this, the cool ammo types were...not much
better? Penetrator was almost always the best option, even if it lost a
lot of damage as a consequence.

So, what was it good for? X-ray + Penetrator. Pretty much, that's it. It
has some other uses but if I had to be entirely honest, there wasn't
much that other weapon couldn't do as well.

Hopefully this helps things going forward, and I want to mess with this
as well down the line in case its a bit too much of a boost in power.

Absolutely please rip this PR apart.

## Changelog
:cl:
balance: Makes the syndicate sniper rifle a bolt-action rifle.
balance: Sniper rifles have a scope range of roughly 50 tiles.
balance: Sniper rifle ammo, if it dismembers your limbs, does damage to
the chest.
balance: All the various syndicate sniper rifle magazines have
consistent casing quantities (6 shots). They also have more consistent
pricing. 3 for normal and a box of surplus, and 4 for every other type.
balance: Reduces the range of Marksman ammo to 50 tiles. Not because it
is strong, but because you might accidentally shoot yourself if you're
not watching where you're shooting. Ricochets are no joke.
add: Replaces Soporific with Disruptor ammo. Works like soporific, but
also EMPS things it hits.
add: Adds Incendiary .50 BMG. Causes a combustion to erupt from the
struck target, as well as setting targets on fire. Great for parties.
add: Adds Surplus .50 BMG. It sucks, but you get a lot of them! Quantity
over quality, baby.
remove: The suppressors in the bundle are of standard quality. The
apparent 'cheap suppressor' that came bundled with the C-20r and sniper
rifle were found to actually be 'fine'. Trust us.
/:cl:
  • Loading branch information
necromanceranne authored Mar 28, 2023
1 parent ccd28fd commit c27f9a6
Show file tree
Hide file tree
Showing 20 changed files with 219 additions and 124 deletions.
2 changes: 1 addition & 1 deletion _maps/templates/battlecruiser_starfury.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -2619,7 +2619,7 @@
/obj/machinery/light/directional/east,
/obj/item/storage/belt/military,
/obj/item/ammo_box/magazine/sniper_rounds,
/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate,
/obj/item/gun/ballistic/rifle/sniper_rifle/syndicate,
/turf/open/floor/pod/light,
/area/shuttle/sbc_starfury)
"iq" = (
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/storage/backpack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/gun/ballistic/automatic/c20r(src)
new /obj/item/suppressor/specialoffer(src)
new /obj/item/suppressor(src)

/obj/item/storage/backpack/duffelbag/syndie/bulldogbundle
desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses."
Expand Down
8 changes: 4 additions & 4 deletions code/game/objects/items/storage/briefcase.dm
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@

/obj/item/storage/briefcase/sniperbundle/PopulateContents()
..() // in case you need any paperwork done after your rampage
new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src)
new /obj/item/gun/ballistic/rifle/sniper_rifle/syndicate(src)
new /obj/item/clothing/neck/tie/red/hitman(src)
new /obj/item/clothing/under/syndicate/sniper(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/suppressor/specialoffer(src)
new /obj/item/ammo_box/magazine/sniper_rounds/disruptor(src)
new /obj/item/ammo_box/magazine/sniper_rounds/disruptor(src)
new /obj/item/suppressor(src)
12 changes: 11 additions & 1 deletion code/game/objects/items/storage/uplink_kits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@
new /obj/item/storage/box/syndie_kit/emp(src) // 2 tc

if(KIT_SNIPER) //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks
new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc
new /obj/item/gun/ballistic/rifle/sniper_rifle(src) // 12 tc
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5 tc
new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc
new /obj/item/clothing/gloves/latex/nitrile(src) // ~ 1 tc for outfit
Expand Down Expand Up @@ -570,6 +570,16 @@
new /obj/item/toy/plush/carpplushie(src)
new /obj/item/bedsheet/syndie(src)

/// Surplus Ammo Box

/obj/item/storage/box/syndie_kit/surplus
name = "surplus .50 BMG magazine box"
desc = "A shoddy box full of surplus .50 BMG magazines. Not as strong, but good enough to keep lead in the air."

/obj/item/storage/box/syndie_kit/surplus/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_box/magazine/sniper_rounds/surplus(src)

///Subtype for the sabotage bundle. Contains three C4, two X4 and 6 signalers
/obj/item/storage/backpack/duffelbag/syndie/sabotage

Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/structures/mystery_box.dm
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(mystery_box_guns, list(
/obj/item/gun/ballistic/automatic/m90,
/obj/item/gun/ballistic/automatic/tommygun,
/obj/item/gun/ballistic/automatic/wt550,
/obj/item/gun/ballistic/automatic/sniper_rifle,
/obj/item/gun/ballistic/rifle/sniper_rifle,
/obj/item/gun/ballistic/rifle/boltaction/brand_new,
))

Expand Down
2 changes: 2 additions & 0 deletions code/modules/mob/living/carbon/carbon_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@
var/obj/item/bodypart/affecting = get_bodypart(def_zone)
if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
affecting.dismember(P.damtype)
if(P.catastropic_dismemberment)
apply_damage(P.damage, P.damtype, BODY_ZONE_CHEST, wound_bonus = P.wound_bonus) //stops a projectile blowing off a limb effectively doing no damage. Mostly relevant for sniper rifles.

/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check)
. = FALSE
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob_spawn/ghost_roles/mining_roles.dm
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@
ears = /obj/item/radio/headset/syndicate/alt
shoes = /obj/item/clothing/shoes/combat
r_pocket = /obj/item/gun/ballistic/automatic/pistol
r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
r_hand = /obj/item/gun/ballistic/rifle/sniper_rifle

implants = list(/obj/item/implant/weapons_auth)

Expand Down
31 changes: 20 additions & 11 deletions code/modules/projectiles/ammunition/ballistic/sniper.dm
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
// .50 (Sniper)

/obj/item/ammo_casing/p50
name = ".50 bullet casing"
desc = "A .50 bullet casing."
name = ".50 BMG bullet casing"
desc = "A .50 BMG bullet casing."
caliber = CALIBER_50
projectile_type = /obj/projectile/bullet/p50
icon_state = ".50"

/obj/item/ammo_casing/p50/soporific
name = ".50 soporific bullet casing"
desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
projectile_type = /obj/projectile/bullet/p50/soporific
icon_state = "sleeper"
harmful = FALSE
/obj/item/ammo_casing/p50/surplus
name = ".50 BMG surplus bullet casing"
desc = "A .50 BMG surplus bullet casing."
projectile_type = /obj/projectile/bullet/p50/surplus

/obj/item/ammo_casing/p50/disruptor
name = ".50 BMG disruptor bullet casing"
desc = "A .50 BMG disruptor bullet casing."
projectile_type = /obj/projectile/bullet/p50/disruptor
icon_state = ".50disruptor"

/obj/item/ammo_casing/p50/incendiary
name = ".50 BMG incendiary bullet casing"
desc = "A .50 BMG incendiary bullet casing."
projectile_type = /obj/projectile/bullet/p50/incendiary

/obj/item/ammo_casing/p50/penetrator
name = ".50 penetrator round bullet casing"
desc = "A .50 caliber penetrator round casing."
name = ".50 BMG penetrator round bullet casing"
desc = "A .50 BMG penetrator round casing."
projectile_type = /obj/projectile/bullet/p50/penetrator

/obj/item/ammo_casing/p50/marksman
name = ".50 marksman round bullet casing"
name = ".50 BMG marksman round bullet casing"
desc = "A .50 caliber marksman round casing."
projectile_type = /obj/projectile/bullet/p50/marksman
10 changes: 5 additions & 5 deletions code/modules/projectiles/boxes_magazines/external/pistol.dm
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/obj/item/ammo_box/magazine/m10mm
name = "pistol magazine (10mm)"
desc = "A gun magazine."
icon_state = "9x19p-full"
icon_state = "9x19p"
base_icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c10mm
caliber = CALIBER_10MM
Expand All @@ -13,21 +13,21 @@
name = "pistol magazine (10mm incendiary)"
icon_state = "9x19pI"
base_icon_state = "9x19pI"
desc = "A gun magazine. Loaded with rounds which ignite the target."
desc = "A 10mm pistol magazine. Loaded with rounds which ignite the target."
ammo_type = /obj/item/ammo_casing/c10mm/fire

/obj/item/ammo_box/magazine/m10mm/hp
name = "pistol magazine (10mm HP)"
icon_state = "9x19pH"
base_icon_state = "9x19pH"
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
desc= "A 10mm pistol magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
ammo_type = /obj/item/ammo_casing/c10mm/hp

/obj/item/ammo_box/magazine/m10mm/ap
name = "pistol magazine (10mm AP)"
icon_state = "9x19pA"
base_icon_state = "9x19pA"
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
desc= "A 10mm pistol magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
ammo_type = /obj/item/ammo_casing/c10mm/ap

/obj/item/ammo_box/magazine/m45
Expand All @@ -42,7 +42,7 @@

/obj/item/ammo_box/magazine/m9mm
name = "pistol magazine (9mm)"
icon_state = "9x19p-full"
icon_state = "9x19p"
base_icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = CALIBER_9MM
Expand Down
32 changes: 21 additions & 11 deletions code/modules/projectiles/boxes_magazines/external/sniper.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/obj/item/ammo_box/magazine/sniper_rounds
name = "sniper rounds (.50)"
name = "anti-materiel sniper rounds (.50 BMG)"
icon_state = ".50mag"
base_icon_state = ".50mag"
ammo_type = /obj/item/ammo_casing/p50
Expand All @@ -10,23 +10,33 @@
. = ..()
icon_state = "[base_icon_state][ammo_count() ? "-ammo" : ""]"

/obj/item/ammo_box/magazine/sniper_rounds/soporific
name = "sniper rounds (Zzzzz)"
desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
base_icon_state = "soporific"
ammo_type = /obj/item/ammo_casing/p50/soporific
max_ammo = 3
/obj/item/ammo_box/magazine/sniper_rounds/surplus
name = "anti-materiel sniper rounds (.50 BMG Surplus)"
icon_state = "surplus"
base_icon_state = "surplus"
ammo_type = /obj/item/ammo_casing/p50/surplus

/obj/item/ammo_box/magazine/sniper_rounds/disruptor
name = "anti-materiel sniper rounds (.50 BMG Bzzt)"
desc = "Disruptor sniper rounds. A special blend of soporific chemicals \
and a electromagnetic payload to cause anything to come to a grinding halt."
base_icon_state = "disruptor"
ammo_type = /obj/item/ammo_casing/p50/disruptor

/obj/item/ammo_box/magazine/sniper_rounds/incendiary
name = "anti-materiel sniper rounds (.50 BMG incendiary)"
desc = "Incediary sniper rounds. Causes a massive combustion at the site of impact."
base_icon_state = "incendiary"
ammo_type = /obj/item/ammo_casing/p50/incendiary

/obj/item/ammo_box/magazine/sniper_rounds/penetrator
name = "sniper rounds (penetrator)"
name = "anti-materiel sniper rounds (.50 BMG penetrator)"
desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
base_icon_state = "penetrator"
ammo_type = /obj/item/ammo_casing/p50/penetrator
max_ammo = 5

/obj/item/ammo_box/magazine/sniper_rounds/marksman
name = "sniper rounds (marksman)"
name = "anti-materiel sniper rounds (.50 BMG marksman)"
desc = "An extremely fast sniper round able to pretty much instantly shoot through something."
base_icon_state = "marksman"
ammo_type = /obj/item/ammo_casing/p50/marksman
max_ammo = 5
5 changes: 0 additions & 5 deletions code/modules/projectiles/guns/ballistic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -701,8 +701,3 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
icon = 'icons/obj/weapons/guns/ballistic.dmi'
icon_state = "suppressor"
w_class = WEIGHT_CLASS_TINY


/obj/item/suppressor/specialoffer
name = "cheap suppressor"
desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits most weapons."
46 changes: 0 additions & 46 deletions code/modules/projectiles/guns/ballistic/automatic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -316,52 +316,6 @@
return
..()



// SNIPER //

/obj/item/gun/ballistic/automatic/sniper_rifle
name = "sniper rifle"
desc = "A long ranged weapon that does significant damage. No, you can't quickscope."
icon_state = "sniper"
w_class = WEIGHT_CLASS_BULKY
inhand_icon_state = "sniper"
worn_icon_state = null
fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
fire_sound_volume = 90
load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg'
rack_sound = 'sound/weapons/gun/sniper/rack.ogg'
suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
recoil = 2
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
fire_delay = 4 SECONDS
burst_size = 1
w_class = WEIGHT_CLASS_NORMAL
slot_flags = ITEM_SLOT_BACK
actions_types = list()
mag_display = TRUE
suppressor_x_offset = 3
suppressor_y_offset = 3

/obj/item/gun/ballistic/automatic/sniper_rifle/Initialize(mapload)
. = ..()
AddComponent(/datum/component/scope, range_modifier = 2)

/obj/item/gun/ballistic/automatic/sniper_rifle/reset_semicd()
. = ..()
if(suppressed)
playsound(src, 'sound/machines/eject.ogg', 25, TRUE, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
else
playsound(src, 'sound/machines/eject.ogg', 50, TRUE)

/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
name = "syndicate sniper rifle"
desc = "An illegally modified .50 cal sniper rifle with suppression compatibility. Quickscoping still doesn't work."
can_suppress = TRUE
can_unsuppress = TRUE
pin = /obj/item/firing_pin/implant/pindicate

// Old Semi-Auto Rifle //

/obj/item/gun/ballistic/automatic/surplus
Expand Down
51 changes: 51 additions & 0 deletions code/modules/projectiles/guns/ballistic/rifle.dm
Original file line number Diff line number Diff line change
Expand Up @@ -231,3 +231,54 @@
user.put_in_hands(gun)
else
user.dropItemToGround(src, TRUE)

// SNIPER //

/obj/item/gun/ballistic/rifle/sniper_rifle
name = "anti-materiel sniper rifle"
desc = "A boltaction anti-materiel rifle, utilizing .50 BMG cartridges. While technically outdated in modern arms markets, it still works exceptionally well as \
an anti-personnel rifle. In particular, the employment of modern armored MODsuits utilizing advanced armor plating has given this weapon a new home on the battlefield. \
It is also able to be suppressed....somehow."
icon_state = "sniper"
weapon_weight = WEAPON_HEAVY
inhand_icon_state = "sniper"
worn_icon_state = null
fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
fire_sound_volume = 90
load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg'
rack_sound = 'sound/weapons/gun/sniper/rack.ogg'
suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
recoil = 2
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
internal_magazine = FALSE
w_class = WEIGHT_CLASS_NORMAL
slot_flags = ITEM_SLOT_BACK
mag_display = TRUE
tac_reloads = TRUE
rack_delay = 1 SECONDS
can_suppress = TRUE
can_unsuppress = TRUE
suppressor_x_offset = 3
suppressor_y_offset = 3

/obj/item/gun/ballistic/rifle/sniper_rifle/examine(mob/user)
. = ..()
. += span_warning("<b>It seems to have a warning label:</b> Do NOT, under any circumstances, attempt to 'quickscope' with this rifle.")

/obj/item/gun/ballistic/rifle/sniper_rifle/Initialize(mapload)
. = ..()
AddComponent(/datum/component/scope, range_modifier = 7) //enough range to at least make extremely good use of the penetrator rounds

/obj/item/gun/ballistic/rifle/sniper_rifle/reset_semicd()
. = ..()
if(suppressed)
playsound(src, 'sound/machines/eject.ogg', 25, TRUE, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
else
playsound(src, 'sound/machines/eject.ogg', 50, TRUE)

/obj/item/gun/ballistic/rifle/sniper_rifle/syndicate
desc = "A boltaction anti-materiel rifle, utilizing .50 BMG cartridges. While technically outdated in modern arms markets, it still works exceptionally well as \
an anti-personnel rifle. In particular, the employment of modern armored MODsuits utilizing advanced armor plating has given this weapon a new home on the battlefield. \
It is also able to be suppressed....somehow. This one seems to have a little picture of someone in a blood-red MODsuit stenciled on it, pointing at a green floppy disk. \
Who knows what that might mean."
pin = /obj/item/firing_pin/implant/pindicate
1 change: 1 addition & 0 deletions code/modules/projectiles/projectile.dm
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@
var/slur = 0 SECONDS

var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
var/catastropic_dismemberment = FALSE //If TRUE, this projectile deals its damage to the chest if it dismembers a limb.
var/impact_effect_type //what type of impact effect to show when hitting something
var/log_override = FALSE //is this type spammed enough to not log? (KAs)
/// We ignore mobs with these factions.
Expand Down
Loading

0 comments on commit c27f9a6

Please sign in to comment.