From 6fb58ad15f693173b80dda8db03a5d35cdfab345 Mon Sep 17 00:00:00 2001 From: Chemlight Date: Fri, 25 Feb 2022 06:55:30 -0800 Subject: [PATCH] Come yourself --- .../code/modules/arousal/arousalhud.dm | 38 ++++++++++++++++++- .../code/modules/arousal/arousal.dm | 34 +++++++++++++++-- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 55d58183e..b183c3181 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -25,6 +25,9 @@ dat += "Fill container" dat += "(Use a container in your hand to collect your seminal fluid.)
" + dat += "Climax on self" + dat += "(Stimulate a sexual organ to climax onto yourself.)
" + var/mob/living/carbon/human/C = usr if(C && C.w_uniform || C.wear_suit) //if they are wearing cloths dat += "Explode out of clothes" @@ -160,6 +163,14 @@ to_chat(usr, "You aren't aroused enough for that! ") return + if(href_list["climaxself"]) + if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. + H.climaxself() + return + else + to_chat(usr, "You aren't aroused enough for that! ") + return + if(href_list["climax"]) if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal. H.climaxalone(FALSE) @@ -503,4 +514,29 @@ obj/screen/arousal/proc/kiss() cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) if(cum_splatter_icon) cut_overlay(cum_splatter_icon) - return TRUE \ No newline at end of file + return TRUE + +/mob/living/carbon/human/proc/climaxself() + if(restrained(TRUE)) + 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 + for(var/helditem in held_items) + if(isobj(helditem)) + free_hands-- + if(free_hands <= 0) + to_chat(src, "You're holding too many things.") + return + //We got hands, let's pick an organ + var/obj/item/organ/genital/picked_organ + picked_organ = pick_masturbate_genitals() + if(picked_organ) + src << browse(null, "window=arousal") //closes the window + mob_masturbate(picked_organ, cover = TRUE) + return + else //They either lack organs that can masturbate, or they didn't pick one. + to_chat(src, "You cannot climax without choosing genitals.") + return \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index ef8047dde..c8d4ea191 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -238,7 +238,7 @@ //These are various procs that we'll use later, split up for readability instead of having one, huge proc. //For all of these, we assume the arguments given are proper and have been checked beforehand. -/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral +/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, cover = FALSE, mb_time = 30) //Masturbation, keep it gender-neutral var/total_fluids = 0 var/datum/reagents/fluid_source = null var/condomed = 0 @@ -267,10 +267,36 @@ if(total_fluids > 5 &&!condomed &&!sounded) fluid_source.reaction(src.loc, TOUCH, 1, 0) fluid_source.clear_reagents() - if(!condomed &&!sounded) + if(!condomed && !sounded && !cover) 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.") + "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ + "You have relieved yourself.") + + if(!condomed &&!sounded && cover)//For when you want to make a mess of yourself. + fluid_source.trans_to(src, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(total_fluids > 80) // now thats a big cum! + if(isliving(src)) + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + src.add_overlay(cumoverlaylarge) + + if(total_fluids > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + var/mob/living/carbon/human/H = src + if(H && G.name == "penis") + H.cumdrip_rate += rand(5,10) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes over [p_their()] self, using [p_their()] [G.name]!", \ + "You orgasm over yourself, using your [G.name].", \ + "You have climaxed over something, using your [G.name].") + if(isliving(src)) + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + src.add_overlay(cumoverlay) + else + src.add_cum_overlay() + if(condomed) //condomed src.visible_message("[src] orgasms, climaxing into [p_their()] condom ", \ "You cum into your condom.", \