DRAGnet; new sprite, new functionality (#90713)

## About The Pull Request


![image](https://github.com/user-attachments/assets/9e143b3c-3435-430b-a949-04a354a46688)

New sprites for the DRAGnet, coming alongside some functionaltiy
changes.

DRAGnets are now bulky, and do not fit in backpacks. They also cannot be
dual-wielded.

DRAGnet no longer have the trap snare functionality. You know, the
infamous bola bullet.

DRAGnets now have two functions; 
The first function is straight up a scatter disabler blast that does a
total of 55 stamina damage point blank (it's like, 5 less than what it
did before).

The second function is a single bolt that, when it hits a living mob,
dealing 30 damage and staggering it briefly slowing it down. It also
places down a wide net of transportation fields around the target, much
like the net functionality does on live (but that's attached to the
scatter function, not the single bolt)


![image](https://github.com/user-attachments/assets/336585d3-924e-4d4c-9c29-c16e7de88990)

### Misc Changes

DRAGnets now cost more form cargo, at 3600 credits. (This barely matters
for departmental orders)

## Why It's Good For The Game

The sprite is ancient. Like nearing two decades old ancient. I believe
the INTENTION was this thing


![a3ec8cabc5d93992168a57ad48d21996d037e67f_00](https://github.com/user-attachments/assets/bc29c2ad-dc93-4503-83e3-8997f4e625c1)

It didn't really work out that way.


![image](https://github.com/user-attachments/assets/db2bcc94-902f-476f-8ed4-b90883519bc9)

Either way, the new sprite is cool and more unique in my opinion.
Fitting its status as an energy weapon.

As for balance changes; I've wanted to do this for a very long time but
put it off a lot. I think this is about the most moderate approach I
have. It otherwise functions pretty much as expected, maintaining the
cool niche functionality while exorcising the problem bits; one-handed
energy shotgun bit, and the bola shot bit.

I think I've spent at least the last...four or so years hammering on
about the horror that is this gun for balance? And even when it was
seeing more widespread use from people who recognized how bullshit it
really was, I didn't really want to get rid of the bit I actually quite
liked, which was the teleportation field.

I'm happy with this version.

## Changelog
🆑 NecromancerAnne (Code, Mild Sprite Edits) Michiyamenotehifunana
(Sprites)
image: Replaces the decrepit DRAGnet sprite with something newer and
more interesting.
balance: Completely reworks the DRAGnet. They are now bulky energy guns.
balance: Snare is now a single shot bolt that deals 30 stamina force,
staggers the target and lays out a net of teleportation fields that can
transport anyone standing on them for too long to a DRAGnet beacon.
balance: Net has been replaced with a scattershot disabler round. 
/🆑
This commit is contained in:
necromanceranne
2025-04-30 22:31:39 +10:00
committed by GitHub
parent 96cdac9d0b
commit 1c3c50c9e9
14 changed files with 57 additions and 73 deletions

View File

@@ -158,7 +158,6 @@
/obj/projectile/magic/fetch = 15, /obj/projectile/magic/fetch = 15,
/obj/projectile/beam/emitter = 15, /obj/projectile/beam/emitter = 15,
/obj/projectile/magic/flying = 15, /obj/projectile/magic/flying = 15,
/obj/projectile/energy/net = 15,
/obj/projectile/bullet/incendiary/c9mm = 15, /obj/projectile/bullet/incendiary/c9mm = 15,
/obj/projectile/temp/hot = 15, /obj/projectile/temp/hot = 15,
/obj/projectile/beam/disabler = 15) /obj/projectile/beam/disabler = 15)

View File

@@ -221,12 +221,12 @@
crate_name = "combat shotguns crate" crate_name = "combat shotguns crate"
/datum/supply_pack/security/armory/dragnet /datum/supply_pack/security/armory/dragnet
name = "DRAGnet Crate" name = "DRAGnet Translocation Shotgun Crate"
desc = "Contains three \"Dynamic Rapid-Apprehension of the Guilty\" netting devices, \ desc = "Contains two \"Dynamic Rapid-Apprehension of the Guilty Network\" translocation shotguns, \
a recent breakthrough in law enforcement prisoner management technology. Includes a DRAGnet beacon." a recent breakthrough in law enforcement prisoner management technology. Includes a DRAGnet beacon."
cost = CARGO_CRATE_VALUE * 5 cost = CARGO_CRATE_VALUE * 18
contains = list( contains = list(
/obj/item/gun/energy/e_gun/dragnet = 3, /obj/item/gun/energy/e_gun/dragnet = 2,
/obj/item/dragnet_beacon = 1 /obj/item/dragnet_beacon = 1
) )
crate_name = "\improper DRAGnet crate" crate_name = "\improper DRAGnet crate"

View File

@@ -50,15 +50,15 @@
select_name = "goddamn meteor" select_name = "goddamn meteor"
newtonian_force = 3 newtonian_force = 3
/obj/item/ammo_casing/energy/net /obj/item/ammo_casing/energy/scatter
projectile_type = /obj/projectile/energy/net projectile_type = /obj/projectile/beam/disabler/scatter
select_name = "netting" select_name = "scatter"
pellets = 6 pellets = 10
variance = 40 variance = 10
harmful = FALSE harmful = FALSE
/obj/item/ammo_casing/energy/trap /obj/item/ammo_casing/energy/snare
projectile_type = /obj/projectile/energy/trap projectile_type = /obj/projectile/energy/snare
select_name = "snare" select_name = "snare"
harmful = FALSE harmful = FALSE

View File

@@ -29,6 +29,8 @@
var/single_shot_type_overlay = TRUE var/single_shot_type_overlay = TRUE
///Should we give an overlay to empty guns? ///Should we give an overlay to empty guns?
var/display_empty = TRUE var/display_empty = TRUE
///If we have an additional overlay based on our shot type while active
var/shot_type_fluff_overlay = FALSE
///whether the gun's cell drains the cyborg user's cell to recharge ///whether the gun's cell drains the cyborg user's cell to recharge
var/use_cyborg_cell = FALSE var/use_cyborg_cell = FALSE
@@ -256,8 +258,9 @@
return return
var/overlay_icon_state = "[icon_state]_charge" var/overlay_icon_state = "[icon_state]_charge"
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(modifystate) if(modifystate)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(single_shot_type_overlay) if(single_shot_type_overlay)
. += "[icon_state]_[initial(shot.select_name)]" . += "[icon_state]_[initial(shot.select_name)]"
overlay_icon_state += "_[initial(shot.select_name)]" overlay_icon_state += "_[initial(shot.select_name)]"
@@ -266,6 +269,10 @@
if(ratio == 0 && display_empty) if(ratio == 0 && display_empty)
. += "[icon_state]_empty" . += "[icon_state]_empty"
return return
if(shot_type_fluff_overlay)
. += "[icon_state]_[initial(shot.select_name)]_extra"
if(shaded_charge) if(shaded_charge)
. += "[icon_state]_charge[ratio]" . += "[icon_state]_charge[ratio]"
return return

View File

@@ -85,16 +85,23 @@
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 flags_1 = PREVENT_CONTENTS_EXPLOSION_1
/obj/item/gun/energy/e_gun/dragnet /obj/item/gun/energy/e_gun/dragnet
name = "\improper DRAGnet" name = "\improper DRAGnet translocation shotgun"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology. Can be synced with a DRAGnet beacon to set a teleport destination for snare rounds." desc = "The \"Dynamic Rapid-Apprehension of the Guilty Network\" translocation shotgun (or DRAGnet for short) is a revolution in law enforcement technology. \
By syncing the weapon to a DRAGnet beacon, the bluespace transportation fields produced by the weapon's 'snare' function can rapidly exfiltrate an entire \
security squad, with criminal in tow. Otherwise, the weapon is an entirely nonlethal apprehension tool. Exceptionally useful for nonlethal close-quarters battle."
icon_state = "dragnet" icon_state = "dragnet"
inhand_icon_state = "dragnet" worn_icon_state = "dragnet"
base_icon_state = "dragnet"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) ammo_type = list(/obj/item/ammo_casing/energy/scatter, /obj/item/ammo_casing/energy/snare)
modifystate = FALSE w_class = WEIGHT_CLASS_BULKY
w_class = WEIGHT_CLASS_NORMAL weapon_weight = WEAPON_MEDIUM
ammo_x_offset = 1 slot_flags = ITEM_SLOT_BACK
ammo_y_offset = 1
ammo_x_offset = 0
charge_sections = 3
shot_type_fluff_overlay = TRUE
///A dragnet beacon set to be the teleport destination for snare teleport rounds. ///A dragnet beacon set to be the teleport destination for snare teleport rounds.
var/obj/item/dragnet_beacon/linked_beacon var/obj/item/dragnet_beacon/linked_beacon
@@ -124,11 +131,6 @@
visible_message(span_warning("A light on the [src] flashes, indicating that it is no longer linked with a DRAGnet beacon!")) visible_message(span_warning("A light on the [src] flashes, indicating that it is no longer linked with a DRAGnet beacon!"))
linked_beacon = null linked_beacon = null
/obj/item/gun/energy/e_gun/dragnet/snare
name = "Energy Snare Launcher"
desc = "Fires an energy snare that slows the target down."
ammo_type = list(/obj/item/ammo_casing/energy/trap)
/obj/item/gun/energy/e_gun/turret /obj/item/gun/energy/e_gun/turret
name = "hybrid turret gun" name = "hybrid turret gun"
desc = "A heavy hybrid energy cannon with two settings: Stun and kill." desc = "A heavy hybrid energy cannon with two settings: Stun and kill."

View File

@@ -202,7 +202,6 @@
/obj/projectile/bullet/mime, /obj/projectile/bullet/mime,
/obj/projectile/curse_hand, /obj/projectile/curse_hand,
/obj/projectile/energy/electrode, /obj/projectile/energy/electrode,
/obj/projectile/energy/net,
/obj/projectile/energy/nuclear_particle, /obj/projectile/energy/nuclear_particle,
/obj/projectile/gravityattract, /obj/projectile/gravityattract,
/obj/projectile/gravitychaos, /obj/projectile/gravitychaos,

View File

@@ -145,6 +145,17 @@
/obj/projectile/beam/disabler/weak /obj/projectile/beam/disabler/weak
damage = 15 damage = 15
/obj/projectile/beam/disabler/scatter
name = "scatter disabler"
icon_state = "scatterdisabler"
damage = 5.5
damage_falloff_tile = -0.5
speed = 1.2
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
tracer_type = /obj/effect/projectile/tracer/xray
muzzle_type = /obj/effect/projectile/muzzle/xray
impact_type = /obj/effect/projectile/impact/xray
/obj/projectile/beam/disabler/smoothbore /obj/projectile/beam/disabler/smoothbore
name = "unfocused disabler beam" name = "unfocused disabler beam"
weak_against_armour = TRUE weak_against_armour = TRUE

View File

@@ -1,28 +1,32 @@
/obj/projectile/energy/net /obj/projectile/energy/snare
name = "energy netting" name = "energy snare"
icon_state = "e_netting" icon_state = "e_netting"
damage = 10 damage = 30
damage_type = STAMINA damage_type = STAMINA
hitsound = 'sound/items/weapons/taserhit.ogg' hitsound = 'sound/items/weapons/taserhit.ogg'
range = 10 range = 10
/obj/projectile/energy/net/Initialize(mapload) /obj/projectile/energy/snare/Initialize(mapload)
. = ..() . = ..()
SpinAnimation() SpinAnimation()
/obj/projectile/energy/net/on_hit(atom/target, blocked = 0, pierce_hit) /obj/projectile/energy/snare/on_hit(atom/target, blocked = 0, pierce_hit)
var/obj/item/dragnet_beacon/destination_beacon = null var/obj/item/dragnet_beacon/destination_beacon = null
var/obj/item/gun/energy/e_gun/dragnet/our_dragnet = fired_from var/obj/item/gun/energy/e_gun/dragnet/our_dragnet = fired_from
if(our_dragnet && istype(our_dragnet)) if(our_dragnet && istype(our_dragnet))
destination_beacon = our_dragnet.linked_beacon destination_beacon = our_dragnet.linked_beacon
if(isliving(target)) if(isliving(target))
var/turf/Tloc = get_turf(target) var/mob/living/living_target = target
if(!locate(/obj/effect/nettingportal) in Tloc) living_target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 0.5, 5 SECONDS)
new /obj/effect/nettingportal(Tloc, destination_beacon) for(var/turf/trapped_turf in range(1, get_turf(living_target)))
if(trapped_turf.density)
continue
new /obj/effect/nettingportal(trapped_turf, destination_beacon)
. = ..() . = ..()
/obj/projectile/energy/net/on_range() /obj/projectile/energy/snare/on_range()
do_sparks(1, TRUE, src) do_sparks(1, TRUE, src)
. = ..() . = ..()
@@ -114,41 +118,3 @@
do_sparks(3, TRUE, src) do_sparks(3, TRUE, src)
balloon_alert(user, "beacon unlocked") balloon_alert(user, "beacon unlocked")
return TRUE return TRUE
/obj/projectile/energy/trap
name = "energy snare"
icon_state = "e_snare"
hitsound = 'sound/items/weapons/taserhit.ogg'
range = 4
/obj/projectile/energy/trap/on_hit(atom/target, blocked = 0, pierce_hit)
if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap
new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
else if(iscarbon(target))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
B.spring_trap(target)
. = ..()
/obj/projectile/energy/trap/on_range()
new /obj/item/restraints/legcuffs/beartrap/energy(loc)
..()
/obj/projectile/energy/trap/cyborg
name = "Energy Bola"
icon_state = "e_snare"
hitsound = 'sound/items/weapons/taserhit.ogg'
range = 10
/obj/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0, pierce_hit)
if(!ismob(target) || blocked >= 100)
do_sparks(1, TRUE, src)
qdel(src)
if(iscarbon(target))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
B.spring_trap(target)
QDEL_IN(src, 10)
. = ..()
/obj/projectile/energy/trap/cyborg/on_range()
do_sparks(1, TRUE, src)
qdel(src)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 144 KiB