diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm
index 41c645ff..5964c84f 100644
--- a/hyperstation/code/obj/condom.dm
+++ b/hyperstation/code/obj/condom.dm
@@ -97,7 +97,7 @@
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom)
new /obj/item/condom/filled(usr.loc)
- to_chat(src, "The condom bubbled outwards and filled with your cum.")
+ to_chat(src, "The condom bubbles outwards and fills with your cum.")
P.condom = 0
P.colourtint = ""
- src.update_genitals()
\ No newline at end of file
+ src.update_genitals()
diff --git a/hyperstation/code/obj/sounding.dm b/hyperstation/code/obj/sounding.dm
new file mode 100644
index 00000000..29b34a8c
--- /dev/null
+++ b/hyperstation/code/obj/sounding.dm
@@ -0,0 +1,68 @@
+/obj/item/sounding
+ name = "sounding rod"
+ desc = "Dont be silly, stuff your willy!"
+ icon = 'hyperstation/icons/obj/sounding.dmi'
+ throwforce = 0
+ icon_state = "sounding_wrapped"
+ var/unwrapped = 0
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/sounding/attack_self(mob/user)
+ if(!istype(user))
+ return
+ if(isliving(user))
+ if(unwrapped == 0)
+ icon_state = "sounding_rod"
+ unwrapped = 1
+ to_chat(user, "You unwrap the rod.")
+ playsound(user, 'sound/items/poster_ripped.ogg', 50, 1, -1)
+ return
+
+/obj/item/sounding/attack(mob/living/carbon/C, mob/living/user)
+
+ if(unwrapped == 0 )
+ to_chat(user, "You must remove the rod from the package first!")
+ return
+ var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
+ if(P&&P.is_exposed())
+ if(P.sounding)
+ to_chat(user, "They already have a rod inside!")
+ return
+ if(isliving(C)&&isliving(user)&&unwrapped == 1)
+ C.visible_message("[user] is trying to insert a rod inside [C]!",\
+ "[user] is trying to insert a rod inside you!")
+ if(!do_mob(user, C, 4 SECONDS))
+ return
+ var/mob/living/carbon/human/L = C
+ playsound(C, 'sound/lewd/champ_fingering.ogg', 50, 1, -1)
+ P.sounding = 1
+ if(L)
+ L.update_genitals()
+ to_chat(C, "Your penis feels stuffed and stretched!")
+ qdel(src)
+
+ return
+ to_chat(user, "You can't find anywhere to put the rod inside.")
+
+/mob/living/carbon/human/proc/removesounding()
+
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.sounding)
+ new /obj/item/sounding/used_sounding(usr.loc)
+ to_chat(src, "The rod falls off from your penis.")
+ P.sounding = 0
+ src.update_genitals()
+
+/obj/item/sounding/used_sounding
+ name = "sounding rod"
+ icon_state = "sounding_rod"
+ unwrapped = 2
+ w_class = WEIGHT_CLASS_TINY
+
+/mob/living/carbon/human/proc/soundingclimax()
+
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.sounding)
+ new /obj/item/sounding/used_sounding(usr.loc)
+ P.sounding = 0
+ src.update_genitals()
\ No newline at end of file
diff --git a/hyperstation/icons/obj/sounding.dmi b/hyperstation/icons/obj/sounding.dmi
new file mode 100644
index 00000000..75c237e8
Binary files /dev/null and b/hyperstation/icons/obj/sounding.dmi differ
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 5d66bf77..109484ff 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -43,6 +43,7 @@
vend_reply = "Have fun, you shameless pervert!"
products = list(
/obj/item/condom = 10,
+ /obj/item/sounding = 5,
/obj/item/clothing/head/maidband = 5,
/obj/item/clothing/under/maid = 5,
/obj/item/clothing/under/stripper_pink = 5,
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 278f7b57..5f31d788 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -239,11 +239,14 @@
var/total_fluids = 0
var/datum/reagents/fluid_source = null
var/condomed = 0
+ var/sounded = 0
if(G.name == "penis")//if the select organ is a penis
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom) //if the penis is condomed
condomed = 1
+ if(P.sounding)
+ sounded = 1
if(G.producing) //Can it produce its own fluids, such as breasts?
fluid_source = G.reagents
else
@@ -258,10 +261,10 @@
"You start to [G.masturbation_verb] your [G.name].")
if(do_after(src, mb_time, target = src))
- if(total_fluids > 5 &&!condomed)
+ if(total_fluids > 5 &&!condomed &&!sounded)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- if(!condomed)
+ if(!condomed &&!sounded)
src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
"You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
"You have relieved yourself.")
@@ -269,7 +272,11 @@
src.visible_message("[src] orgasms, climaxing into [p_their()] condom ", \
"You cum into your condom.", \
"You have relieved yourself.")
- if(total_fluids > 0 &&condomed)
+ if(sounded) //sounded
+ src.visible_message("[src] orgasms, but the rod blocks anything from leaking out!", \
+ "You cum with the rod inside.", \
+ "You don't quite feel totally relieved.")
+ if(total_fluids > 0 &&condomed &&!sounded)
src.condomclimax()
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
@@ -391,6 +398,9 @@
if(P.condom) //if the penis is condomed
to_chat(src, "You cannot fill containers when there is a condom over your [G.name].")
return
+ if(P.sounding) //if the penis is sounded
+ to_chat(src, "You cannot fill containers when there is a rod inside your [G.name].")
+ return
if(G.producing) //Can it produce its own fluids, such as breasts?
fluid_source = G.reagents
else
@@ -540,9 +550,27 @@
return
//Ok, now we check what they want to do.
- var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container", "Remove condom")
+ var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container", "Remove condom", "Remove sounding rod")
switch(choice)
+ if("Remove sounding rod")
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(!P.sounding)
+ to_chat(src, "You don't have a rod inside!")
+ return
+ if(P.sounding)
+ to_chat(src, "You pull the rod off from the tip of your penis!")
+ src.removesounding()
+ return
+ return
+
if("Remove condom")
if(restrained(TRUE)) //TRUE ignores grabs
to_chat(src, "You can't do that while restrained!")
@@ -617,7 +645,7 @@
var/mob/living/partner = pick_partner() //Get someone
if(partner)
var/obj/item/organ/genital/penis/P = picked_organ
- if(partner.breedable == 1 && picked_organ.name == "penis"&&!P.condom == 1)
+ if(partner.breedable == 1 && picked_organ.name == "penis"&&!P.condom == 1&&!P.sounding == 1)
var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No")
if(impreg == "Yes") //If we are impregging
var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index d836c628..5a9d7fdc 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -11,6 +11,7 @@
fluid_transfer_factor = 0.5
size = 2 //arbitrary value derived from length and girth for sprites.
var/condom = 0 //No condom, its better this way...
+ var/sounding = 0
var/length = 6 //inches
var/cached_length //used to detect a change in length
var/girth = 3.38
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index e5465b01..cd57203e 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -155,3 +155,9 @@
category = SLOT_IN_BACKPACK
path = /obj/item/condom
cost = 1
+
+/datum/gear/sounding
+ name = "Sounding rod"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/sounding
+ cost = 1
diff --git a/sound/lewd/champ_fingering.ogg b/sound/lewd/champ_fingering.ogg
new file mode 100644
index 00000000..7e540c97
Binary files /dev/null and b/sound/lewd/champ_fingering.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index c7758496..2a10589a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2961,6 +2961,7 @@
#include "hyperstation\code\obj\pregnancytester.dm"
#include "hyperstation\code\obj\rewards.dm"
#include "hyperstation\code\obj\rope.dm"
+#include "hyperstation\code\obj\sounding.dm"
#include "interface\interface.dm"
#include "interface\menu.dm"
#include "interface\stylesheet.dm"