Adds Stinger Grenades (#17474)

* balls

* lint this

* lint deez

* le change

* Update stinger.dm

* i am going to murder the new linter

* sprite

* Update CampinKiller24-ready-or-not.yml
This commit is contained in:
CampinKiller24
2023-10-05 05:16:21 -05:00
committed by GitHub
parent 4538e2a7cc
commit cea8ca8d9a
15 changed files with 169 additions and 5 deletions

View File

@@ -762,7 +762,8 @@
)
contraband = list(
/obj/item/clothing/glasses/sunglasses = 2,
/obj/item/grenade/flashbang = 4
/obj/item/grenade/flashbang = 4,
/obj/item/grenade/stinger = 4
)
restock_blocked_items = list(
/obj/item/storage/box/fancy/donut,

View File

@@ -0,0 +1,60 @@
///Stinger grenade projectile
/obj/item/projectile/bullet/rubberball/stinger_ball
damage = 2
agony = 50
armor_penetration = 10
range_step = 2
embed = FALSE
base_spread = 0
spread_step = 20
suppressed = TRUE //embedding messages are still produced so it's kind of weird when enabled.
no_attack_log = 1
muzzle_type = null
/obj/item/grenade/stinger
name = "stinger grenade"
desc = "A stinger grenade, designed to explode and expel rubber balls over an area for less-lethal takedowns. Popular with many law enforcement agencies."
icon_state = "stinger"
var/num_fragments = 70 ///total number of balls produced by the grenade
var/fragment_damage = 2
var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
var/explosion_size = 1 ///size of the center explosion
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
var/spread_range = 7
/obj/item/grenade/stinger/proc/sting(var/source, var/fragmin, var/fragmax, var/light_dam, var/flash_dam, var/p_dam, var/p_range, var/can_cover=TRUE, var/shard_range = 50)
var/turf/O = get_turf(source)
var/fragger = rand(fragmin,fragmax)
explosion(O, -1, -1, light_dam, flash_dam)
var/list/target_turfs = getcircle(O, 7)
var/fragments_per_projectile = round(fragger/target_turfs.len)
for(var/turf/T in target_turfs)
var/obj/item/projectile/bullet/rubberball/stinger_ball/P = new (O)
P.damage = p_dam
P.balls = fragments_per_projectile
P.range_step = p_range
P.shot_from = source
P.range = shard_range
P.name = "rubber ball"
P.launch_projectile(T)
if(can_cover)
for(var/mob/living/M in O)
if(M.lying && isturf(get_turf(source)))
P.attack_mob(M, 0, 0)
else
P.attack_mob(M, 0, 100)
/obj/item/grenade/stinger/prime()
..()
INVOKE_ASYNC(src, PROC_REF(sting), src, num_fragments, num_fragments, explosion_size, explosion_size+1, fragment_damage, damage_step, TRUE)
qdel(src)

View File

@@ -387,6 +387,14 @@
illustration = "flashbang"
starts_with = list(/obj/item/grenade/flashbang = 7)
/obj/item/storage/box/stingers
name = "box of stinger grenades"
desc = "A box containing 7 antipersonnel stinger grenades. <br> WARNING: These devices are extremely dangerous and can cause injury."
icon_state = "secbox"
item_state = "secbox"
illustration = "stinger"
starts_with = list(/obj/item/grenade/stinger = 7)
/obj/item/storage/box/firingpins
name = "box of firing pins"
desc = "A box of NT brand Firearm authentication pins; Needed to operate most weapons."

View File

@@ -144,7 +144,8 @@
/obj/item/grenade/smokebomb,
/obj/item/grenade/flashbang,
/obj/item/grenade/empgrenade,
/obj/item/grenade/chem_grenade/incendiary
/obj/item/grenade/chem_grenade/incendiary,
/obj/item/grenade/stinger
)
var/obj/item/storage/bag/plasticbag/bag = new /obj/item/storage/bag/plasticbag(spawned.loc)
for(var/i in 1 to 7)

View File

@@ -102,6 +102,7 @@
//Supply
new /obj/item/storage/box/flashbangs(src)
new /obj/item/storage/box/ids(src)
new /obj/item/storage/box/stingers(src)
//Appearance
if(prob(50))
new /obj/item/storage/backpack/security(src)
@@ -170,6 +171,7 @@
new /obj/item/storage/box/ids(src)
new /obj/item/storage/box/flashbangs(src)
new /obj/item/storage/box/teargas(src)
new /obj/item/storage/box/stingers(src)
//Appearance
if(prob(50))
new /obj/item/storage/backpack/security(src)

View File

@@ -42,6 +42,7 @@
new /obj/item/ammo_magazine/a10mm(src)
new /obj/item/storage/box/handcuffs(src)
new /obj/item/storage/box/flashbangs(src)
new /obj/item/storage/box/stingers(src)
new /obj/item/gun/energy/gun(src)
new /obj/item/gun/energy/gun(src)
new /obj/item/gun/energy/gun(src)

View File

@@ -30,6 +30,11 @@
unit_name = "flashbang grenade"
export_types = list(/obj/item/grenade/flashbang)
/datum/export/weapon/stinger
cost = 5
unit_name = "stinger grenade"
export_types = list(/obj/item/grenade/stinger)
/datum/export/weapon/teargas
cost = 5
unit_name = "tear gas grenade"
@@ -46,4 +51,5 @@
cost = 3
unit_name = "pair"
message = "of handcuffs"
export_types = list(/obj/item/handcuffs)
export_types = list(/obj/item/handcuffs)

View File

@@ -48,6 +48,9 @@ STOCK_ITEM_UNCOMMON(implants, 1)
STOCK_ITEM_UNCOMMON(flashbang, 0.75)
new /obj/item/storage/box/flashbangs(L)
STOCK_ITEM_UNCOMMON(stinger, 0.75)
new /obj/item/storage/box/stingers(L)
STOCK_ITEM_UNCOMMON(arrest, 1)
if(prob(60))
new /obj/item/storage/box/handcuffs(L)

View File

@@ -34,7 +34,8 @@
charges = list(
list("flashbang", "flashbang", /obj/item/grenade/flashbang, 3),
list("smoke bomb", "smoke bomb", /obj/item/grenade/smokebomb, 3),
list("EMP grenade", "EMP grenade", /obj/item/grenade/empgrenade, 3)
list("EMP grenade", "EMP grenade", /obj/item/grenade/empgrenade, 3),
list("stinger", "stinger", /obj/item/grenade/stinger, 3)
)
/obj/item/rig_module/grenade_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user)

View File

@@ -133,6 +133,13 @@
holding_type = /obj/item/gun/launcher/mech/mountedgl/fl
restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER)
/obj/item/mecha_equipment/mounted_system/combat/grenadestinger
name = "stinger grenade launcher"
desc = "The SGL-6SG grenade launcher is designated to launch primed stinger grenades."
icon_state = "mech_gl"
holding_type = /obj/item/gun/launcher/mech/mountedgl/st
restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER)
/obj/item/mecha_equipment/mounted_system/combat/grenadetear
name = "teargas launcher"
desc = "The SGL-6TGL grenade launcher is designated to launch primed teargas grenades."
@@ -234,6 +241,11 @@
grenade_type = /obj/item/grenade/flashbang
proj_gen_time = 200
/obj/item/gun/launcher/mech/mountedgl/st
desc = "The SGL-6SG grenade launcher is designated to launch primed stinger grenades."
grenade_type = /obj/item/grenade/stinger
proj_gen_time = 200
/obj/item/gun/launcher/mech/mountedgl/tg
name = "mounted teargas launcher"
desc = "The SGL-6TGL grenade launcher is designated to launch primed teargas grenades."

View File

@@ -118,6 +118,58 @@
if(Collide(M)) //Bump will make sure we don't hit a mob multiple times
return
/obj/item/projectile/bullet/rubberball
name = "rubber ball"
icon_state = "pellets"
damage = 2
agony = 45
embed = FALSE
var/balls = 4
///projectile will lose a fragment each time it travels this distance. Can be a non-integer.
var/range_step = 2
var/base_spread = 90
var/spread_step = 10
/obj/item/projectile/bullet/rubberball/proc/get_balls(var/distance)
var/ball_loss = round((distance - 1)/range_step)
return max(balls - ball_loss, 1)
/obj/item/projectile/bullet/rubberball/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier)
if (balls < 0)
return TRUE
var/total_balls = get_balls(distance)
var/spread = max(base_spread - (spread_step*distance), 0)
var/prone_chance = 0
if(!base_spread)
prone_chance = max(spread_step*(distance - 2), 0)
var/hits = 0
for (var/i in 1 to total_balls)
if(target_mob.lying && target_mob != original && prob(prone_chance))
continue
var/old_zone = def_zone
def_zone = ran_zone(def_zone, spread)
if (..())
hits++
def_zone = old_zone
balls -= hits
if (hits >= total_balls || balls <= 0)
return TRUE
return FALSE
/obj/item/projectile/bullet/rubberball/Move()
. = ..()
if(. && !base_spread && isturf(loc))
for(var/mob/living/M in loc)
if(M.lying || !M.CanPass(src, loc))
if(Collide(M))
return
/* short-casing projectiles, like the kind used in pistols or SMGs */
/obj/item/projectile/bullet/pistol

View File

@@ -78,6 +78,12 @@
build_path = /obj/item/mecha_equipment/mounted_system/combat/grenadeflash
materials = list(DEFAULT_WALL_MATERIAL = 20000, MATERIAL_GOLD = 3000, MATERIAL_SILVER = 3000)
/datum/design/item/mechfab/exosuit_equipment/stinger
name = "Mounted Stinger Launcher"
req_tech = list(TECH_COMBAT = 3)
build_path = /obj/item/mecha_equipment/mounted_system/combat/grenadestinger
materials = list(DEFAULT_WALL_MATERIAL = 20000, MATERIAL_GOLD = 3000, MATERIAL_SILVER = 3000)
/datum/design/item/mechfab/exosuit_equipment/cleaner
name = "Mounted Cleaner Grenade Launcher"
req_tech = list(TECH_MATERIAL = 2)
@@ -141,4 +147,5 @@
/datum/design/item/mechfab/exosuit_equipment/phazon/AssembleDesignDesc()
. = ..()
desc += " It needs an anomaly core to function, however."
desc += " It needs an anomaly core to function, however."