diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 344615093..57ce2307c 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1648,7 +1648,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if (target.canbearoused)
target.adjustArousalLoss(5)
if (target.can_orgasm() && HAS_TRAIT(target, TRAIT_MASO))
- target.mob_climax(forced_climax=TRUE)
+ target.mob_climax_forced()
if (!HAS_TRAIT(target, TRAIT_NYMPHO))
stop_wagging_tail(target)
@@ -2006,7 +2006,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(HAS_TRAIT(H, TRAIT_MASO))
H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
if (H.can_orgasm())
- H.mob_climax(forced_climax=TRUE)
+ H.mob_climax_forced()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 471109572..7484bdbd6 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -78,7 +78,7 @@
if(HAS_TRAIT(B, TRAIT_CHOKE_SLUT))
B.adjustArousalLoss(7)
if (B.can_orgasm())
- B.mob_climax(forced_climax=TRUE)
+ B.mob_climax_forced()
else
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation)
else
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 31fbecea0..e8b79c5f6 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -289,7 +289,7 @@
to_chat(user, "You hear a voice in your head... \"You are not horny enough to receive my blessing, dear~\"")
return
if(user.can_orgasm())
- user.mob_climax(forced_climax=TRUE)
+ user.mob_climax_forced()
to_chat(user, "You hear a voice in your head... \"You are worth of my blessing dear~\"")
to_chat(user, "You feel overpowering pleasure surge through your entire body.")
var/A = new /obj/item/reagent_containers/chalice/lust
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index b2d19c586..3d9b5d637 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -581,7 +581,7 @@
for(var/V in listeners)
var/mob/living/carbon/human/H = V
if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure
- H.mob_climax(forced_climax=TRUE)
+ H.mob_climax_forced()
*/
else if((findtext(message, family_friendly_words)))
cooldown = COOLDOWN_MEME
@@ -1123,7 +1123,7 @@
if(E.phase > 1)
if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5)
- H.mob_climax(forced_climax=TRUE)
+ H.mob_climax_forced()
H.SetStun(20)
H.setArousalLoss(H.min_arousal)
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm
index ce98c62e6..a7410a204 100644
--- a/hyperstation/code/obj/fleshlight.dm
+++ b/hyperstation/code/obj/fleshlight.dm
@@ -64,7 +64,7 @@
C.do_jitter_animation()
C.adjustArousalLoss(20) //make the target more aroused.
if (C.can_orgasm())
- C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge.
+ C.mob_climax_forced() //make them cum if they are over the edge.
return
diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm
index 8eedff37e..f0911b4f3 100644
--- a/hyperstation/code/obj/vibrator.dm
+++ b/hyperstation/code/obj/vibrator.dm
@@ -133,13 +133,13 @@ Code:
to_chat(U, "You feel intense pleasure surge through your [G.name]")
U.do_jitter_animation()
if (U.can_orgasm())
- U.mob_climax(forced_climax=TRUE)
+ U.mob_climax_forced()
if(3) //high, makes you stun
to_chat(U, "You feel overpowering pleasure surge through your [G.name]")
U.Jitter(3)
U.Stun(30)
if (U.can_orgasm())
- U.mob_climax(forced_climax=TRUE)
+ U.mob_climax_forced()
if(prob(50))
U.emote("moan")
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 92aa3b21b..2720bc97c 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -620,7 +620,7 @@
else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd)
if (C.getArousalLoss() > 80)
- C.mob_climax(forced_climax=TRUE)
+ C.mob_climax_forced()
C.SetStun(10)//We got your stun effects in somewhere, Kev.
else
C.adjustArousalLoss(10)
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 42521dcf1..365f9a0f1 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -11,7 +11,6 @@
/mob/living/carbon/human
canbearoused = TRUE
-
var/saved_underwear = ""//saves their underwear so it can be toggled later
var/saved_undershirt = ""
var/saved_socks = ""
@@ -193,7 +192,9 @@
/mob/living/proc/can_orgasm(arousal = 100)
return src.getArousalLoss() >= arousal && ishuman(src) && src.has_dna()
-/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
+/mob/living/proc/mob_climax()
+// This is just so I can test this shit without being forced to add actual content
+// to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
@@ -575,57 +576,23 @@
return null //If nothing correct, give null.
-//Here's the main proc itself
-/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
+/mob/living/carbon/human/mob_climax()
if(stat == DEAD) //corpses can't cum
return
if(mb_cd_timer > world.time)
- if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
- to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!")
+ to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!")
return
mb_cd_timer = (world.time + mb_cd_length)
if(canbearoused && has_dna())
- if(stat==2)
+ if(stat == DEAD)
to_chat(src, "You can't do that while dead!")
return
- if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
- for(var/obj/item/organ/O in internal_organs)
- if(istype(O, /obj/item/organ/genital))
- var/obj/item/organ/genital/G = O
- if(!G.can_climax) //Skip things like wombs and testicles
- continue
- var/mob/living/carbon/partner
- var/check_target
- var/list/worn_stuff = get_equipped_items()
-
- if(G.is_exposed(worn_stuff))
- if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick
- if(iscarbon(src.pulling)) //Don't fuck objects
- check_target = src.pulling
- else if(src.pulledby) //prioritise pulled over pulledby
- if(iscarbon(src.pulledby))
- check_target = src.pulledby
- //Now we should have a partner, or else we have to come alone
- if(check_target)
- var/mob/living/carbon/C = check_target
- if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough?
- partner = C
- if(partner) //Did they pass the clothing checks?
- mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced
- continue //You've climaxed once with this organ, continue on
- //not exposed OR if no partner was found while exposed, climax alone
- mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms
- //Now all genitals that could climax, have.
- //Since this was a forced climax, we do not need to continue with the other stuff
- return
- //If we get here, then this is not a forced climax and we gotta check a few things.
- if(stat==1) //No sleep-masturbation, you're unconscious.
+ if(stat == UNCONSCIOUS)
to_chat(src, "You must be conscious to do that!")
return
- if(getArousalLoss() < 33) //flat number instead of percentage
+ if(getArousalLoss() < 33)
to_chat(src, "You aren't aroused enough for that!")
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","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod")
switch(choice)
if("Remove sounding rod")
@@ -774,3 +741,33 @@
else //Somehow another option was taken, maybe something interrupted the selection or it was cancelled
return //Just end it in that case.
+
+/mob/living/carbon/human/proc/mob_climax_forced()
+ for(var/obj/item/organ/O in internal_organs)
+ if(istype(O, /obj/item/organ/genital))
+ var/obj/item/organ/genital/G = O
+ if(!G.can_climax) //Skip things like wombs and testicles
+ continue
+ var/mob/living/carbon/partner
+ var/check_target
+ var/list/worn_stuff = get_equipped_items()
+ if(G.is_exposed(worn_stuff))
+ if(src.pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick
+ if(iscarbon(src.pulling)) //Don't fuck objects
+ check_target = src.pulling
+ else if(src.pulledby) //prioritise pulled over pulledby
+ if(iscarbon(src.pulledby))
+ check_target = src.pulledby
+ //Now we should have a partner, or else we have to come alone
+ if(check_target)
+ var/mob/living/carbon/C = check_target
+ if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough?
+ partner = C
+ if(partner) //Did they pass the clothing checks?
+ mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced
+ continue //You've climaxed once with this organ, continue on
+ //not exposed OR if no partner was found while exposed, climax alone
+ mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms
+ //Now all genitals that could climax, have.
+ //Since this was a forced climax, we do not need to continue with the other stuff
+ return
\ No newline at end of file
diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
index 5ce3ae234..6ec3687b4 100644
--- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -30,7 +30,7 @@
var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!")
H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
- H.mob_climax(forced_climax=TRUE)
+ H.mob_climax_forced()
orgasm = TRUE
else
M.adjustArousalLoss(arousal_gain)