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"