adds the Ansem/SC, the logical conclusion to the John Splintercell series (#83228)

## About The Pull Request
Replaces the Ansem, SC/FISHER, and suppressor in the Sam Fisher gimmick
bundle with the Ansem/SC, a variant of the Ansem that:
- has an integral suppressor (read: acts like it's always suppressed,
because it is)
- an underbarrel light disruptor (functionally identical to the
SC/FISHER, fired with RMB)
(note: firing the disruptor in combat mode causes the main gun to fire
as if it were being fired akimbo. which it shouldn't, but I'm not sure
how to make it not do that)
- is longer, visually, but not storage-wise, and also visibly has an
underbarrel light disruptor

![image](https://github.com/tgstation/tgstation/assets/31829017/0842d9b9-9b24-4833-aeae-631c3bf1a5d5)

Also added code support for integrally suppressed ballistic guns (with
no separate suppressor overlay), handled by the can_unsuppress variable.

Also fixes the SC/FISHER disrupting APCs for ten times longer than they
probably should have been disrupted.
## Why It's Good For The Game
In regards to the Ansem, SC/FISHER, suppressor:
The Sam Fisher gimmick bundle having the Ansem and SC/FISHER as separate
items always kinda bugged me, since it seemed too clunky for a
sneaky-beaky operator-type to have to juggle two guns (one which you had
to bump to normal-size, leaving it unable to fit in the belt) to break
lights and then shoot dudes in the back of the head. So now it's one
gun, like the M-90gl and its grenade launcher. I think the bundle's rare
enough that it's fine to give them this much.

In regards to the APC thing:
Shooting an APC with a gimmick gun and leaving it unpowered for two
minutes seemed unintentional.

In regards to the code support for integrally suppressed guns:
Maybe someone else will want to put in another integrally suppressed
gun? It was relevant for this use-case.
## Changelog

🆑
qol: The Ansem, suppressor, and SC/FISHER included in the Fisher gimmick
bundle now come together as one whole gun, the Ansem/SC. It's integrally
suppressed, and fires the disruptor on right-click.
fix: The SC/FISHER disrupts APCs for an appropriate amount of time, not
ten times the intended disruption length.
/🆑

---------

Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
This commit is contained in:
Hatterhat
2024-05-17 09:17:05 +00:00
committed by GitHub
co-authored by Hatterhat Zephyr Ghom
parent cd9e9dcd35
commit 14e27ec462
7 changed files with 60 additions and 10 deletions
+1 -1
View File
@@ -32,7 +32,7 @@
var/can_suppress = FALSE
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
var/can_unsuppress = TRUE
var/can_unsuppress = TRUE /// whether a gun can be unsuppressed. for ballistics, also determines if it generates a suppressor overlay
var/recoil = 0 //boom boom shake the room
var/clumsy_check = TRUE
var/obj/item/ammo_casing/chambered = null
+3 -3
View File
@@ -220,7 +220,7 @@
if (bolt_type == BOLT_TYPE_OPEN && bolt_locked)
. += "[icon_state]_bolt"
if(suppressed)
if(suppressed && can_unsuppress) // if it can't be unsuppressed, we assume the suppressor is integrated into the gun itself and don't generate an overlay
var/mutable_appearance/MA = mutable_appearance(icon, "[icon_state]_suppressor")
if(suppressor_x_offset)
MA.pixel_x = suppressor_x_offset
@@ -572,9 +572,9 @@
if (bolt_locked)
. += "The [bolt_wording] is locked back and needs to be released before firing or de-fouling."
if (suppressed)
. += "It has a suppressor attached that can be removed with <b>alt+click</b>."
. += "It has a suppressor [can_unsuppress ? "attached that can be removed with <b>alt+click</b>." : "that is integral or can't otherwise be removed."]"
if(can_misfire)
. += span_danger("You get the feeling this might explode if you fire it....")
. += span_danger("You get the feeling this might explode if you fire it...")
if(misfire_probability > 0)
. += span_danger("Given the state of the gun, there is a [misfire_probability]% chance it'll misfire.")
@@ -57,6 +57,53 @@
empty_indicator = TRUE
suppressor_x_offset = 12
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher
name = "\improper Ansem/SC pistol"
desc = "A modified variant of the Ansem, spiritual successor to the Makarov, featuring an integral suppressor and push-button trigger on the grip \
for an underbarrel-mounted disruptor, similar in operation to the standalone SC/FISHER. Chambered in 10mm."
desc_controls = "Right-click to use the underbarrel disruptor. Two shots maximum between self-charges."
icon_state = "pistol_evil_fisher"
suppressed = TRUE
can_suppress = FALSE
can_unsuppress = FALSE
var/obj/item/gun/energy/recharge/fisher/underbarrel
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/examine_more(mob/user)
. = ..()
. += span_notice("The Ansem/SC is a Scarborough Arms-manufactured overhaul suite for the also Scarborough Arms-manufactured Ansem handgun, designed for special \
operators who like to operate operationally, and/or people who really, really hate lightbulbs, and tend to fight people who really like lightbulbs. \
The slide is lengthened and has an integrated suppressor, while a compact kinetic light disruptor was mounted underneath the barrel. \
Scarborough Arms has never actually officially responded to allegations that they're involved with the modification and/or manufacture \
of the SC/FISHER or similar disruptor weapons. Operators are reminded that kinetic light disruptors do not actually physically harm targets.<br>\
Caveat emptor.")
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Initialize(mapload)
. = ..()
underbarrel = new /obj/item/gun/energy/recharge/fisher(src)
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Destroy()
QDEL_NULL(underbarrel)
return ..()
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack_secondary(atom/target, mob/living/user, proximity_flag, click_parameters)
underbarrel.afterattack(target, user, proximity_flag, click_parameters)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/living/user, flag, params)
// mirrors what the standalone fisher does when you hit people with it
. = ..()
if(user.Adjacent(target))
var/obj/projectile/energy/fisher/melee/simulated_hit = new
simulated_hit.firer = user
simulated_hit.on_hit(target)
/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
// as above comment, mirrors what the standalone fisher does when you hit people with it
. = ..()
var/obj/projectile/energy/fisher/melee/simulated_hit = new
simulated_hit.firer = throwingdatum.get_thrower()
simulated_hit.on_hit(hit_atom)
/obj/item/gun/ballistic/automatic/pistol/m1911
name = "\improper M1911"
desc = "A classic .45 handgun with a small magazine capacity."
@@ -150,19 +150,23 @@
/obj/item/gun/energy/recharge/fisher/examine_more(mob/user)
. = ..()
. += span_notice("The SC/FISHER is an illegally-modified kinetic accelerator cut down and refit into a disassembled miniature energy gun chassis, with its pressure chamber \
attenuated to launch kinetic bolts that <b>disrupt flashlights and cameras, if only temporarily</b>. This effect also works on <b>cyborg headlamps<b>, and works longer in melee.<br><br>\
While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources. Caveat emptor.")
. += span_notice("The SC/FISHER is an illegally-modified kinetic accelerator cut down and refit into a disassembled miniature energy gun chassis, \
with its pressure chamber attenuated to launch kinetic bolts that <b>temporarily disrupt flashlights, cameras, and certain other electronics</b>. \
This effect also works on <b>cyborg headlamps<b>, and works longer in melee.<br><br>\
While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources.<br>\
Caveat emptor.")
/obj/item/gun/energy/recharge/fisher/afterattack(atom/target, mob/living/user, flag, params)
// you should just shoot them, but in case you can't/wont
. = ..()
if(user.Adjacent(target))
var/obj/projectile/energy/fisher/melee/simulated_hit = new
simulated_hit.firer = user
simulated_hit.on_hit(target)
/obj/item/gun/energy/recharge/fisher/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
// ...you reeeeeally just shoot them, but in case you can't/won't
. = ..()
var/obj/projectile/energy/fisher/melee/simulated_hit = new
simulated_hit.firer = throwingdatum.get_thrower()
simulated_hit.on_hit(hit_atom)