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