diff --git a/modular_skyrat/modules/borgs/code/robot_upgrade.dm b/modular_skyrat/modules/borgs/code/robot_upgrade.dm index 77af4f0db1d..7b2da6f87b4 100644 --- a/modular_skyrat/modules/borgs/code/robot_upgrade.dm +++ b/modular_skyrat/modules/borgs/code/robot_upgrade.dm @@ -331,4 +331,5 @@ /obj/item/spanking_pad, /obj/item/tickle_feather, /obj/item/clothing/erp_leash, + /obj/item/clicker ) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/erp_belt.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/erp_belt.dm index a4eec86abf6..e58e0d36d75 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/erp_belt.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/erp_belt.dm @@ -38,6 +38,7 @@ /obj/item/restraints/handcuffs/lewd, /obj/item/reagent_containers/cup/lewd_filter, /obj/item/assembly/signaler, //because it's used for several toys + /obj/item/clicker, //clothing /obj/item/clothing/mask/ballgag, diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm index 176e615653f..ed83de9dcb5 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm @@ -232,3 +232,8 @@ . = ..() if(CONFIG_GET(flag/disable_lewd_items)) return INITIALIZE_HINT_QDEL + +/obj/item/clicker/Initialize(mapload) + . = ..() + if(CONFIG_GET(flag/disable_lewd_items)) + return INITIALIZE_HINT_QDEL diff --git a/modular_zubbers/code/_globalvars/lists/erp_items.dm b/modular_zubbers/code/_globalvars/lists/erp_items.dm index 82a915157f2..05da84cdb6a 100644 --- a/modular_zubbers/code/_globalvars/lists/erp_items.dm +++ b/modular_zubbers/code/_globalvars/lists/erp_items.dm @@ -1,5 +1,6 @@ GLOBAL_LIST_INIT(erp_items, list( /obj/item/bdsm_candle, + /obj/item/clicker, /obj/item/clothing/ears/kinky_headphones, /obj/item/clothing/erp_leash, /obj/item/clothing/glasses/blindfold/kinky, diff --git a/modular_zubbers/code/modules/lewd_machinery/clicker.dm b/modular_zubbers/code/modules/lewd_machinery/clicker.dm new file mode 100644 index 00000000000..7a6c477ddf0 --- /dev/null +++ b/modular_zubbers/code/modules/lewd_machinery/clicker.dm @@ -0,0 +1,75 @@ +/obj/item/clicker + name = "clicker" + desc = "A small clicking toy that fits in the palm of your hand, typically used to condition pets into obedience. It makes a satisfying 'click' sound when pressed." + icon = 'modular_zubbers/icons/obj/lewd.dmi' + icon_state = "clicker_pink" + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + +/obj/item/clicker/Initialize(mapload) + . = ..() + AddComponent(/datum/component/reskinable_item, /datum/atom_skin/clicker) + +/datum/atom_skin/clicker + abstract_type = /datum/atom_skin/clicker + +/datum/atom_skin/clicker/pink + preview_name = "Pink" + new_icon_state = "clicker_pink" + +/datum/atom_skin/clicker/teal + preview_name = "Teal" + new_icon_state = "clicker_teal" + +/obj/item/clicker/proc/click(atom/source, mob/user) + SIGNAL_HANDLER + source.balloon_alert(user, "click!") + playsound(source, "modular_zubbers/sound/lewd/clicker.ogg", 40, FALSE) + +/obj/item/clicker/attack_self(mob/user) + . = ..() + click(src, user) + +// If the user has the dominant aura quirk, nearby bottoms will react to the click. + if(istype(user, /mob/living)) + var/mob/living/living_user = user + if(living_user.has_quirk(/datum/quirk/dominant_aura) && TIMER_COOLDOWN_FINISHED(living_user, DOMINANT_COOLDOWN_SNAP)) + for(var/mob/living/carbon/human/sub in hearers(world.view / 2, living_user)) + if(!sub.has_quirk(/datum/quirk/well_trained) || sub == living_user || sub.stat == DEAD) + continue + + if(get_dist(sub, living_user) > world.view / 2) + continue + sub.dir = get_dir(sub, living_user) + sub.emote("me", 1, "suddenly perks up in attention!", TRUE) + to_chat(sub, span_purple("You perk up in attention hearing [living_user]'s click!")) +// Short mood boost for flavour + sub.add_mood_event("good_pet", /datum/mood_event/good_pet) +// Shivering animation + animate(sub, pixel_w = 1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + for(var/i in 1 to 1 SECONDS / (0.2 SECONDS)) + animate(pixel_w = -2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(pixel_w = 2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(pixel_w = -1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE) + +//For the borgs + for(var/mob/living/silicon/robot/borg_sub in hearers(world.view / 2, living_user)) + if(!borg_sub.has_quirk(/datum/quirk/well_trained) || borg_sub == living_user || borg_sub.stat == DEAD) + continue + borg_sub.dir = get_dir(borg_sub, living_user) + borg_sub.emote("me", 1, "suddenly perks up in attention!", TRUE) + to_chat(borg_sub, span_purple("You perk up in attention hearing [living_user]'s click!")) +// Shivering animation + animate(borg_sub, pixel_w = 1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + for(var/i in 1 to 1 SECONDS / (0.2 SECONDS)) + animate(pixel_w = -2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(pixel_w = 2, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE|ANIMATION_CONTINUE) + animate(borg_sub, pixel_w = -1, time = 0.1 SECONDS, flags = ANIMATION_RELATIVE) + +// Shares cooldown with the dominant aura snap + TIMER_COOLDOWN_START(living_user, DOMINANT_COOLDOWN_SNAP, 10 SECONDS) + +/datum/mood_event/good_pet + description = span_nicegreen("Being obedient feels rewarding!") + mood_change = 2 + timeout = 2 MINUTES diff --git a/modular_zubbers/code/modules/vending/lustwish.dm b/modular_zubbers/code/modules/vending/lustwish.dm index 9120bb7ebe6..8ef32a2852f 100644 --- a/modular_zubbers/code/modules/vending/lustwish.dm +++ b/modular_zubbers/code/modules/vending/lustwish.dm @@ -22,9 +22,19 @@ /obj/item/clothing/under/costume/loincloth/cloth/sensor = 6, /obj/item/clothing/shoes/jackboots/toeless = 6, ) + ), + + list( + "name" = "Toys", + "icon" = FA_ICON_MAGIC_WAND_SPARKLES, + "products" = list( + /obj/item/clicker = 6, + + ) ) ) + zubbers_premium = list( /obj/item/clothing/neck/kink_collar/locked/gps = 3, /obj/item/holosign_creator/sex = 6, diff --git a/modular_zubbers/icons/obj/lewd.dmi b/modular_zubbers/icons/obj/lewd.dmi new file mode 100644 index 00000000000..96574fa622d Binary files /dev/null and b/modular_zubbers/icons/obj/lewd.dmi differ diff --git a/modular_zubbers/sound/lewd/clicker.ogg b/modular_zubbers/sound/lewd/clicker.ogg new file mode 100644 index 00000000000..17ad80db9da Binary files /dev/null and b/modular_zubbers/sound/lewd/clicker.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 15af33e4aeb..254a5cd21dd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9463,6 +9463,7 @@ #include "modular_zubbers\code\modules\languages\siikmaas.dm" #include "modular_zubbers\code\modules\languages\uncommon.dm" #include "modular_zubbers\code\modules\languages\vampiric.dm" +#include "modular_zubbers\code\modules\lewd_machinery\clicker.dm" #include "modular_zubbers\code\modules\lewd_machinery\lustwish.dm" #include "modular_zubbers\code\modules\lewd_machinery\sex_barrier.dm" #include "modular_zubbers\code\modules\limbgrowncorpses\limbgrowerblanks.dm"