diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index b04be4cb85b..5b42bf3e432 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -327,11 +327,9 @@
/obj/item/storage/belt/military/assault/fisher
/obj/item/storage/belt/military/assault/fisher/PopulateContents()
- new /obj/item/gun/ballistic/automatic/pistol/clandestine(src) // 7 TC
- new /obj/item/suppressor(src) // 3 TC
+ new /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher(src) // 11 TC: 7 (pistol) + 3 (suppressor) + lightbreaker (1 TC, black market meme/util item)
new /obj/item/ammo_box/magazine/m10mm(src) // 1 TC
new /obj/item/ammo_box/magazine/m10mm(src)
- new /obj/item/gun/energy/recharge/fisher(src) // Acquirable through black market, shit utility item 1 TC
new /obj/item/card/emag/doorjack(src) // 3 TC
new /obj/item/knife/combat(src) //comparable to the e-dagger, 2 TC
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 40af69a8dd0..7e63aff7cbe 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -250,6 +250,7 @@
/obj/machinery/power/apc/proc/on_saboteur(datum/source, disrupt_duration)
SIGNAL_HANDLER
+ disrupt_duration *= 0.1 // so, turns out, failure timer is in seconds, not deciseconds; without this, disruptions last 10 times as long as they probably should
energy_fail(disrupt_duration)
return COMSIG_SABOTEUR_SUCCESS
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 2a18aae0c0f..912f162b922 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -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
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 71a69c02d99..6f798eb8908 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -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 alt+click."
+ . += "It has a suppressor [can_unsuppress ? "attached that can be removed with alt+click." : "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.")
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 9d109d6af78..53af6c45dd1 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -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.
\
+ 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."
diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm
index 3d94193a531..71d14348608 100644
--- a/code/modules/projectiles/guns/energy/recharge.dm
+++ b/code/modules/projectiles/guns/energy/recharge.dm
@@ -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 disrupt flashlights and cameras, if only temporarily. This effect also works on cyborg headlamps, and works longer in melee.
\
- 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 temporarily disrupt flashlights, cameras, and certain other electronics. \
+ This effect also works on cyborg headlamps, and works longer in melee.
\
+ 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.")
/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)
diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi
index f6105e9c5ae..abbb7743b01 100644
Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ