diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index c943a0d144112..ff2a58cba765b 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -325,6 +325,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_GRABWEAKNESS "grab_weakness"
#define TRAIT_BRAIN_TUMOR "brain_tumor"
#define TRAIT_PROSKATER "pro_skater"
+#define TRAIT_PLUSHIELOVER "plushie lover"
///Trait for dryable items
#define TRAIT_DRYABLE "trait_dryable"
diff --git a/code/datums/traits/positive_quirk.dm b/code/datums/traits/positive_quirk.dm
index c9b71106f1148..60010a3b2c8e5 100644
--- a/code/datums/traits/positive_quirk.dm
+++ b/code/datums/traits/positive_quirk.dm
@@ -89,7 +89,7 @@
/datum/quirk/musician
name = "Musician"
- desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul."
+ desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul. You start with a delivery beacon."
icon = "guitar"
value = 1
mob_trait = TRAIT_MUSICIAN
@@ -284,3 +284,21 @@
/datum/quirk/proskater/on_spawn()
var/mob/living/carbon/human/H = quirk_target
H.equip_to_slot_or_del(new /obj/item/melee/skateboard/pro(H), ITEM_SLOT_BACKPACK)
+
+/datum/quirk/plushielover
+ name = "Plushie Lover"
+ desc = "You love your squishy friends so much. You start with a plushie delivery beacon."
+ icon = "heart"
+ value = 1
+ mob_trait = TRAIT_PLUSHIELOVER
+ gain_text = "You can't wait to hug a plushie!."
+ lose_text = "You don't feel that passion for plushies anymore."
+
+/datum/quirk/plushielover/on_spawn()
+ var/mob/living/carbon/human/H = quirk_target
+ var/obj/item/choice_beacon/radial/plushie/B = new(get_turf(H))
+ var/list/slots = list (
+ "backpack" = ITEM_SLOT_BACKPACK,
+ "hands" = ITEM_SLOT_HANDS,
+ )
+ H.equip_in_one_of_slots(B, slots , qdel_on_fail = TRUE)
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 328ca4ba4675a..9b9a9f1bacecf 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -721,6 +721,77 @@
desc = "Hgrgrhrhg cute."
icon_state = "flushplush"
+/obj/item/choice_beacon/radial/plushie
+ name = "plushie delivery beacon"
+ desc = "Summon your new friend!"
+ icon_state = "gangtool-plushie"
+ var/static/list/plushie_list = list(
+ /obj/item/toy/plush/bubbleplush,
+ /obj/item/toy/plush/carpplushie,
+ /obj/item/toy/plush/snakeplushie,
+ /obj/item/toy/plush/lizardplushie,
+ /obj/item/toy/plush/slimeplushie,
+ /obj/item/toy/plush/nukeplushie,
+ /obj/item/toy/plush/awakenedplushie,
+ /obj/item/toy/plush/beeplushie,
+ /obj/item/toy/plush/crossed,
+ /obj/item/toy/plush/rouny,
+ /obj/item/toy/plush/runtime,
+ /obj/item/toy/plush/flushed,
+ /obj/item/toy/plush/gondola,
+ /obj/item/toy/plush/moth/atlas,
+ /obj/item/toy/plush/moth/bluespace,
+ /obj/item/toy/plush/moth/brown,
+ /obj/item/toy/plush/moth/clockwork,
+ /obj/item/toy/plush/moth/deadhead,
+ /obj/item/toy/plush/moth/firewatch,
+ /obj/item/toy/plush/moth/gothic,
+ /obj/item/toy/plush/moth/lovers,
+ /obj/item/toy/plush/moth/luna,
+ /obj/item/toy/plush/moth/monarch,
+ /obj/item/toy/plush/moth/moonfly,
+ /obj/item/toy/plush/moth/plasmafire,
+ /obj/item/toy/plush/moth/poison,
+ /obj/item/toy/plush/moth/punished,
+ /obj/item/toy/plush/moth/ragged,
+ /obj/item/toy/plush/moth/rainbow,
+ /obj/item/toy/plush/moth/redish,
+ /obj/item/toy/plush/moth/rosy,
+ /obj/item/toy/plush/moth/royal,
+ /obj/item/toy/plush/moth/snow,
+ /obj/item/toy/plush/moth/whitefly,
+ /obj/item/toy/plush/moth/witchwing
+ )
+
+/obj/item/choice_beacon/radial/plushie/generate_options(mob/living/M)
+ var/list/item_list = generate_item_list()
+ if(!length(item_list))
+ return
+ var/choice = show_radial_menu(M, src, item_list, radius = 36, require_near = TRUE)
+ if(!QDELETED(src) && !(isnull(choice)) && !M.incapacitated() && in_range(M,src))
+ for(var/V in plushie_list)
+ var/atom/A = V
+ if(initial(A.name) == choice)
+ spawn_option(A,M)
+ uses--
+ if(!uses)
+ qdel(src)
+ else
+ balloon_alert(M, "[uses] use[uses > 1 ? "s" : ""] remaining")
+ to_chat(M, "[uses] use[uses > 1 ? "s" : ""] remaining on the [src].")
+ return
+
+/obj/item/choice_beacon/radial/plushie/generate_item_list()
+ var/static/list/item_list
+ if(!item_list)
+ item_list = list()
+ for(var/obj/item/toy/plush/I as() in plushie_list)
+ var/image/plushie_icon = image(initial(I.icon), initial(I.icon_state))
+ var/datum/radial_menu_choice/choice = new
+ choice.image = plushie_icon
+ item_list[initial(I.name)] = choice
+ return item_list
+
/////////////////
//DONATOR ITEMS//
/////////////////
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index dde806fa765e5..03ea1866af324 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -239,7 +239,7 @@
/obj/item/choice_beacon/radial/music
name = "instrument delivery beacon"
desc = "Summon your tool of art."
- icon_state = "gangtool-red"
+ icon_state = "gangtool-music"
var/static/list/instrument_list
/obj/item/choice_beacon/radial/music/Initialize(mapload)
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index abe44ffc5eb06..3a470546c5c5c 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -11,7 +11,9 @@
/obj/item/toy/cards/deck/cas/black = 3,
/obj/item/toy/cards/deck/unum = 3,
/obj/item/toy/cards/deck/tarot = 3,
- /obj/item/hourglass = 2)
+ /obj/item/hourglass = 2
+ )
+
contraband = list(/obj/item/dice/fudge = 9,
/obj/item/instrument/musicalmoth = 1)
premium = list(/obj/item/melee/skateboard/pro = 3,
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index f2eb2c33bb66e..e6379f882ff31 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ