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"