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.", \