From 165b9416befc011faa91481614ba3d2131bc64a1 Mon Sep 17 00:00:00 2001
From: Luc <89928798+lewcc@users.noreply.github.com>
Date: Tue, 30 Jul 2024 08:58:49 -0500
Subject: [PATCH] Adds firecrackers and decoy grenades (#25923)
* boom boom pow
* a few more sounds
* Add different forms to uplink and prize counter
* new and improved
* Fuse sound or not
* it's now a box and works properly.
* Reviews
* Minor tweaks
* static list
* ope
* adjacency checks
* angry
---
code/datums/uplink_items/uplink_general.dm | 7 ++
.../items/weapons/grenades/firecracker.dm | 90 +++++++++++++++++++
.../items/weapons/storage/uplink_kits.dm | 7 ++
code/modules/arcade/prize_datums.dm | 6 ++
paradise.dme | 1 +
5 files changed, 111 insertions(+)
create mode 100644 code/game/objects/items/weapons/grenades/firecracker.dm
diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm
index f7f78180b0e..5d83a5aec80 100644
--- a/code/datums/uplink_items/uplink_general.dm
+++ b/code/datums/uplink_items/uplink_general.dm
@@ -741,6 +741,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/jammer
cost = 20
+/datum/uplink_item/device_tools/decoy_nade
+ name = "Decoy Grenade Kit"
+ desc = "A box of five grenades that can be configured to reproduce many suspicious sounds at varying rates."
+ reference = "DCY"
+ item = /obj/item/storage/box/syndie_kit/decoy
+ cost = 20
+
////////////////////////////////////////
// MARK: SPACE SUITS AND HARDSUITS
////////////////////////////////////////
diff --git a/code/game/objects/items/weapons/grenades/firecracker.dm b/code/game/objects/items/weapons/grenades/firecracker.dm
new file mode 100644
index 00000000000..accbf90bbc2
--- /dev/null
+++ b/code/game/objects/items/weapons/grenades/firecracker.dm
@@ -0,0 +1,90 @@
+/obj/item/grenade/firecracker
+ name = "fire-cracker"
+ desc = "A firework that's great at making a lot of noise."
+ det_time = 2 SECONDS
+ /// The effect that will be randomly played at intervals.
+ var/sound_effect = 'sound/weapons/gunshots/gunshot_strong.ogg'
+ /// The minimum number of times it will fire.
+ var/min_pops = 5
+ /// The maximum number of times it fires.
+ var/max_pops = 20
+ /// How long, at least, we'll end up between pops.
+ var/min_time_between_pops = CLICK_CD_MELEE
+ /// The longest possible length between fires.
+ var/max_time_between_pops = 20 DECISECONDS
+ /// Whether or not to play a smoke sound before going off
+ var/play_fuse_sound = TRUE
+
+/obj/item/grenade/firecracker/prime()
+ . = ..()
+ if(play_fuse_sound)
+ playsound(src, 'sound/effects/smoke.ogg', 10, TRUE, -3)
+ INVOKE_ASYNC(src, PROC_REF(start_popping), TRUE)
+
+/obj/item/grenade/firecracker/proc/start_popping(del_after = FALSE)
+ for(var/i in 0 to rand(min_pops, max_pops))
+ playsound(src, sound_effect, 100, TRUE)
+ sleep(rand(min_time_between_pops, max_time_between_pops))
+ if(del_after)
+ qdel(src)
+
+/obj/item/grenade/firecracker/decoy
+ name = "decoy grenade"
+ desc = "A grenade capable of imitating many different sounds."
+ play_fuse_sound = FALSE
+
+ /// The sounds which this grenade can select.
+ var/static/list/possible_sounds = list(
+ "revolver" = 'sound/weapons/gunshots/gunshot_strong.ogg',
+ "armblade" = 'sound/weapons/armblade.ogg',
+ "laser" = 'sound/weapons/laser.ogg',
+ "sniper" = 'sound/weapons/gunshots/gunshot_sniper.ogg',
+ "pistol" = 'sound/weapons/gunshots/gunshot_pistol.ogg',
+ "blob" = 'sound/effects/splat.ogg',
+ "bite" = 'sound/weapons/bite.ogg',
+ "chainsaw" = 'sound/weapons/chainsaw.ogg'
+ )
+
+ /// The currently selected sound for the decoy.
+ var/selected_sound = "revolver"
+
+/obj/item/grenade/firecracker/decoy/Initialize(mapload)
+ . = ..()
+ selected_sound = possible_sounds[1]
+
+/obj/item/grenade/firecracker/decoy/examine(mob/user)
+ . = ..()
+ if(!user.Adjacent(src))
+ return
+ . += "[src] will sound like \a [selected_sound]."
+ . += "Alt-Click to change the imitated sound."
+ . += "Alt-Shift-Click to change the frequency of the sound."
+
+/obj/item/grenade/firecracker/decoy/AltClick(mob/user)
+ . = ..()
+ if(!user.Adjacent(src))
+ return
+ var/selected = tgui_input_list(user, "Choose the decoy sound.", items = possible_sounds)
+ if(!user.Adjacent(src))
+ to_chat(user, "You're too far from [src] to set the sound now!")
+ return
+ if(selected)
+ selected_sound = selected
+ sound_effect = possible_sounds[selected]
+ to_chat(user, "[src] will now sound like \a [selected].")
+
+/obj/item/grenade/firecracker/decoy/AltShiftClick(mob/user)
+ . = ..()
+ if(!user.Adjacent(src))
+ return
+ var/min_between_pops_input = tgui_input_number(user, "Select the minimum time between pops (in 1/10s of a second).", "Minimum time", min_time_between_pops, 50, 2)
+ if(!user.Adjacent(src))
+ to_chat(user, "You need to be closer to [src] to set this!")
+ return
+ min_time_between_pops = min_between_pops_input
+ var/max_between_pops_input = tgui_input_number(user, "Select the maximum time between pops (in 1/10s of a second).", "Maximum time", max_time_between_pops, 50, 2)
+ if(!user.Adjacent(src))
+ to_chat(user, "You need to be closer to [src] to set this!")
+ return
+
+ max_time_between_pops = max_between_pops_input
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index ffac415f508..95e4800f065 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -556,3 +556,10 @@
/obj/item/storage/box/syndie_kit/pen_bomb/populate_contents()
new /obj/item/grenade/syndieminibomb/pen(src)
+
+/obj/item/storage/box/syndie_kit/decoy
+ name = "\improper Decoy Grenade kit"
+
+/obj/item/storage/box/syndie_kit/decoy/populate_contents()
+ for(var/i in 1 to 5)
+ new /obj/item/grenade/firecracker/decoy(src)
diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm
index 7e9481bceee..c8d14c02633 100644
--- a/code/modules/arcade/prize_datums.dm
+++ b/code/modules/arcade/prize_datums.dm
@@ -111,6 +111,12 @@ GLOBAL_DATUM_INIT(global_prizes, /datum/prizes, new())
typepath = /obj/item/ammo_box/caps
cost = 30
+/datum/prize_item/firecracker
+ name = "Firecracker Grenade"
+ desc = "A loud and obnoxious firecracker. Hold away from ears and small children."
+ typepath = /obj/item/grenade/firecracker
+ cost = 50
+
/datum/prize_item/wallet
name = "Cheap Wallet"
desc = "A cheap and big enough for standard issue ID cards."
diff --git a/paradise.dme b/paradise.dme
index 051a8515bad..ac5b5a41991 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1210,6 +1210,7 @@
#include "code\game\objects\items\weapons\grenades\confetti.dm"
#include "code\game\objects\items\weapons\grenades\custom_grenades.dm"
#include "code\game\objects\items\weapons\grenades\emgrenade.dm"
+#include "code\game\objects\items\weapons\grenades\firecracker.dm"
#include "code\game\objects\items\weapons\grenades\flashbang.dm"
#include "code\game\objects\items\weapons\grenades\frag.dm"
#include "code\game\objects\items\weapons\grenades\ghettobomb.dm"