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)