diff --git a/code/__SPLURTCODE/DEFINES/signals.dm b/code/__SPLURTCODE/DEFINES/signals.dm
index c5e4f45aaca8..d83c1a355bf1 100644
--- a/code/__SPLURTCODE/DEFINES/signals.dm
+++ b/code/__SPLURTCODE/DEFINES/signals.dm
@@ -1,7 +1,7 @@
#define COMSIG_HEALTH_SCAN "health_scan"
#define COMSIG_ORGAN_INSERTED "organ_inserted"
#define COMSIG_ORGAN_REMOVED "organ_removed"
-#define COMSIG_MOB_CLIMAX "mob_coomed"
+#define COMSIG_MOB_CLIMAX "mob_coomed" /// datum/source, datum/reagents/senders_cum, atom/target, obj/item/organ/genital/sender, obj/item/organ/genital/receiver, spill, anonymous
#define COMSIG_OBJ_WRITTEN_ON "written_on"
#define COMSIG_MOB_GENITAL_TRY_INSERTING "mob_genital_try_inserting" //Handles external restrictions to the inserting
diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm
index c89f8b07344e..1305ac683d47 100644
--- a/code/modules/arousal/arousal.dm
+++ b/code/modules/arousal/arousal.dm
@@ -73,18 +73,18 @@
if(!. && !silent)
to_chat(H, "Your [name] is unable to produce it's own fluids, it's missing the organs for it.")
-/mob/living/carbon/human/proc/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/G, spill = TRUE)
- if(!G)
+/mob/living/carbon/human/proc/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/sender, spill, cover = FALSE, obj/item/organ/genital/receiver, anonymous = FALSE)
+ if(!sender)
return
if(!target || !R)
return
var/turfing = isturf(target)
var/condomning
- if(istype(G, /obj/item/organ/genital/penis))
- var/obj/item/organ/genital/penis/P = G
+ if(istype(sender, /obj/item/organ/genital/penis))
+ var/obj/item/organ/genital/penis/P = sender
condomning = locate(/obj/item/genital_equipment/condom) in P.contents
- G.generate_fluid(R)
- log_message("Climaxed using [G] with [target]", LOG_EMOTE)
+ sender.generate_fluid(R)
+ log_message("Climaxed using [sender] with [target]", LOG_EMOTE)
if(condomning)
to_chat(src, "You feel the condom bubble outwards and fill up with your spunk")
R.trans_to(condomning, R.total_volume)
@@ -113,7 +113,7 @@
if(!turfing)
// sandstorm edit - advanced cum drip
- var/amount_to_transfer = R.total_volume * (spill ? G.fluid_transfer_factor : 1)
+ var/amount_to_transfer = R.total_volume * (spill ? sender.fluid_transfer_factor : 1)
var/mob/living/carbon/human/cummed_on = target
if(istype(cummed_on))
var/datum/reagents/copy = new()
@@ -124,7 +124,7 @@
cummed_on.apply_status_effect(STATUS_EFFECT_DRIPPING_CUM, copy, get_blood_dna_list())
R.trans_to(target, amount_to_transfer, log = TRUE)
//
- G.last_orgasmed = world.time
+ sender.last_orgasmed = world.time
R.clear_reagents()
//sandstorm edit - gain momentum from dirty deeds.
if(!Process_Spacemove(turn(dir, 180)))
@@ -143,23 +143,40 @@
to_chat(src, span_userlove("You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name]."))
do_climax(fluid_source, loc, G)
-/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30, obj/item/organ/genital/Lgen = null) //Used for climaxing with any living thing
+/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30, obj/item/organ/genital/Lgen = null, forced = FALSE, anonymous = FALSE) //Used for climaxing with any living thing
var/datum/reagents/fluid_source = G.climaxable(src)
if(!fluid_source)
return
+ var/user_name
+ var/user_p_their
+ var/target_name
+ var/target_p_their
+ var/target_p_them
+ if(anonymous)
+ user_name = "Someone"
+ target_name = "someone"
+ user_p_their = "their"
+ target_p_their = "their"
+ target_p_them = "them"
+ else
+ user_name = "[src]"
+ target_name = "[L]"
+ user_p_their = p_their()
+ target_p_their = L.p_their()
+ target_p_them = L.p_them()
if(mb_time) //Skip warning if this is an instant climax.
- to_chat(src, span_userlove("You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!"))
- to_chat(L, span_userlove("[src] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!"))
+ to_chat(src, span_userlove("You're about to climax [(Lgen) ? "in [target_name]'s [Lgen.name]" : "with [L]"]!"))
+ to_chat(L, span_userlove("[user_name] is about to climax [(Lgen) ? "in your [Lgen.name]" : "with you"]!"))
if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE))
return
if(spillage)
- to_chat(src, span_userlove("You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name]."))
- to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!"))
+ to_chat(src, span_userlove("You orgasm with [target_name], spilling out of [(Lgen) ? "[target_p_their] [Lgen.name]" : "[target_p_them]"], using your [G.name]."))
+ to_chat(L, span_userlove("[user_name] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [user_p_their] [G.name]!"))
else //knots and other non-spilling orgasms
- to_chat(src, span_userlove("You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing."))
- to_chat(L, span_userlove("[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!"))
+ to_chat(src, span_userlove("You climax [(Lgen) ? "in [target_name]'s [Lgen.name]" : "with [target_name]"], your [G.name] spilling nothing."))
+ to_chat(L, span_userlove("[user_name] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [user_p_their] [G.name] spilling nothing!"))
//SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) //Sandstorm edit
- do_climax(fluid_source, spillage ? loc : L, G, spillage,, Lgen)
+ do_climax(fluid_source, spillage ? loc : L, G, spillage, FALSE, Lgen, anonymous)
//L.receive_climax(src, Lgen, G, spillage)
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
@@ -260,7 +277,7 @@
//Here's the main proc itself
//skyrat edit - forced partner and spillage
-/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "", var/mob/living/forced_partner = null, var/forced_spillage = TRUE, var/obj/item/organ/genital/forced_receiving_genital = null) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
+/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "", var/mob/living/forced_partner = null, var/forced_spillage = TRUE, var/obj/item/organ/genital/forced_receiving_genital = null, anonymous = FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
set waitfor = FALSE
if(mb_cd_timer > world.time)
if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
@@ -287,7 +304,7 @@
var/check_target
var/list/worn_stuff = get_equipped_items()
- if(G.is_exposed(worn_stuff))
+ if(forced_receiving_genital || G.is_exposed(worn_stuff))
if(pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick
if(isliving(pulling)) //Don't fuck objects
check_target = pulling
@@ -311,7 +328,7 @@
//
if(partner) //Did they pass the clothing checks?
//skyrat edit
- mob_climax_partner(G, partner, spillage = forced_spillage, mb_time = 0, Lgen = forced_receiving_genital, forced = forced_climax) //Instant climax due to forced
+ mob_climax_partner(G, partner, forced_spillage, 0, forced_receiving_genital, forced_climax, anonymous) //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
diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm
index fa70d693ac82..7803ee193473 100644
--- a/modular_sand/code/datums/interactions/lewd_definitions.dm
+++ b/modular_sand/code/datums/interactions/lewd_definitions.dm
@@ -295,7 +295,7 @@
audible_message(span_lewd("[src] [pick("mimes a pleasured moan","moans in silence")]."))
lastmoan = moan
-/mob/living/proc/cum(mob/living/partner, target_orifice)
+/mob/living/proc/cum(mob/living/partner, target_orifice, cum_inside = FALSE, anonymous = FALSE) //SPLURT EDIT - extra argument `cum_inside` and 'anonymous'
if(HAS_TRAIT(src, TRAIT_NEVERBONER))
return FALSE
if(SEND_SIGNAL(src, COMSIG_MOB_PRE_CAME, target_orifice, partner))
@@ -305,7 +305,7 @@
var/u_He = p_they()
var/u_S = p_s()
var/t_His = partner?.p_their()
- var/cumin = FALSE
+ var/cumin = cum_inside // SPLURT EDIT - defaults to argument `cum_inside` rather than FALSE
var/partner_carbon_check = FALSE
var/obj/item/organ/genital/target_gen = null
var/mob/living/carbon/c_partner = null
@@ -318,6 +318,16 @@
c_partner = partner
partner_carbon_check = TRUE
+ // SPLURT EDIT- new variables that are used in place of [partner_t_His] and [partner] in message strings to support anonymity
+ var/partner_name
+ var/partner_t_His
+ if(anonymous)
+ partner_name = "someone"
+ partner_t_His = "their"
+ else
+ partner_name = "\the [partner]"
+ partner_t_His = partner?.p_their()
+
if(src != partner)
if(ismob(partner))
if(!last_genital)
@@ -327,82 +337,82 @@
switch(target_orifice)
if(CUM_TARGET_MOUTH)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "cums right in \the [partner]'s mouth."
+ message = "cums right in [partner_name]'s mouth."
cumin = TRUE
else
- message = "cums on \the [partner]'s face."
+ message = "cums on [partner_name]'s face."
if(CUM_TARGET_THROAT)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "shoves deep into \the [partner]'s throat and cums."
+ message = "shoves deep into [partner_name]'s throat and cums."
cumin = TRUE
else
- message = "cums on \the [partner]'s face."
+ message = "cums on [partner_name]'s face."
if(CUM_TARGET_VAGINA)
var/has_vagina = partner.has_vagina()
if(has_vagina == TRUE || has_vagina == HAS_EXPOSED_GENITAL)
if(partner_carbon_check)
target_gen = c_partner.getorganslot(ORGAN_SLOT_VAGINA)
- message = "cums in \the [partner]'s pussy."
+ message = "cums in \the [partner_name]'s pussy."
cumin = TRUE
else
- message = "cums on \the [partner]'s belly."
+ message = "cums on [partner_name]'s belly."
if(CUM_TARGET_ANUS)
var/has_anus = partner.has_anus()
if(has_anus == TRUE || has_anus == HAS_EXPOSED_GENITAL)
- message = "cums in \the [partner]'s asshole."
+ message = "cums in \the [partner_name]'s asshole."
cumin = TRUE
else
- message = "cums on \the [partner]'s backside."
+ message = "cums on [partner_name]'s backside."
if(CUM_TARGET_HAND)
if(partner.has_hand())
- message = "cums in \the [partner]'s hand."
+ message = "cums in \the [partner_name]'s hand."
else
- message = "cums on \the [partner]."
+ message = "cums on [partner_name]."
if(CUM_TARGET_BREASTS)
var/has_breasts = partner.has_breasts()
if(has_breasts == TRUE || has_breasts == HAS_EXPOSED_GENITAL)
- message = "cums onto \the [partner]'s breasts."
+ message = "cums onto \the [partner_name]'s breasts."
else
- message = "cums on \the [partner]'s chest and neck."
+ message = "cums on [partner_name]'s chest and neck."
if(NUTS_TO_FACE)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "vigorously ruts [u_His] nutsack into \the [partner]'s mouth before shooting [u_His] thick, sticky jizz all over [t_His] eyes and hair."
+ message = "vigorously ruts [u_His] nutsack into [partner_name]'s mouth before shooting [u_His] thick, sticky jizz all over [partner_t_His] eyes and hair."
if(THIGH_SMOTHERING)
var/has_penis = has_penis()
if(has_penis == TRUE || has_penis == HAS_EXPOSED_GENITAL) //it already checks for the cock before, why the hell would you do this redundant shit
- message = "keeps \the [partner] locked in [u_His] thighs as [u_His] cock throbs, dumping its heavy load all over [t_His] face."
+ message = "keeps \the [partner_name] locked in [u_His] thighs as [u_His] cock throbs, dumping its heavy load all over [t_His] face."
else
- message = "reaches [u_His] peak, locking [u_His] legs around \the [partner]'s head extra hard as [u_He] cum[u_S] straight onto the head stuck between [u_His] thighs"
+ message = "reaches [u_His] peak, locking [u_His] legs around [partner_name]'s head extra hard as [u_He] cum[u_S] straight onto the head stuck between [u_His] thighs"
cumin = TRUE
if(CUM_TARGET_FEET)
if(!last_lewd_datum.require_target_num_feet)
if(partner.has_feet())
- message = "cums on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "cums on [partner_name]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "cums on the floor!"
else
if(partner.has_feet())
- message = "cums on \the [partner]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "cums on \the [partner_name]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "cums on the floor!"
//weird shit goes here
if(CUM_TARGET_EARS)
if(partner.has_ears())
- message = "cums inside \the [partner]'s ear."
+ message = "cums inside [partner_name]'s ear."
else
- message = "cums inside \the [partner]'s earsocket."
+ message = "cums inside [partner_name]'s earsocket."
cumin = TRUE
if(CUM_TARGET_EYES)
if(partner.has_eyes())
- message = "cums on \the [partner]'s eyeball."
+ message = "cums on [partner_name]'s eyeball."
else
- message = "cums inside \the [partner]'s eyesocket."
+ message = "cums inside [partner_name]'s eyesocket."
cumin = TRUE
//
if(CUM_TARGET_PENIS)
var/has_penis = partner.has_penis()
if(has_penis == TRUE || has_penis == HAS_EXPOSED_GENITAL)
- message = "cums on \the [partner]."
+ message = "cums on \the [partner_name]."
else
message = "cums on the floor!"
else
@@ -414,76 +424,79 @@
switch(target_orifice)
if(CUM_TARGET_MOUTH)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "squirts right in \the [partner]'s mouth."
+ message = "squirts right in [partner_name]'s mouth."
cumin = TRUE
else
- message = "squirts on \the [partner]'s face."
+ message = "squirts on [partner_name]'s face."
if(CUM_TARGET_THROAT)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "rubs [u_His] vagina against \the [partner]'s mouth and cums."
+ message = "rubs [u_His] vagina against [partner_name]'s mouth and cums."
cumin = TRUE
else
- message = "squirts on \the [partner]'s face."
+ message = "squirts on [partner_name]'s face."
if(CUM_TARGET_VAGINA)
+ if(partner.has_vagina(REQUIRE_EXPOSED))
+ message = "squirts on [partner_name]'s pussy."
var/has_vagina = partner.has_vagina()
if(has_vagina == TRUE || has_vagina == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s pussy."
+ message = "squirts on \the [partner_name]'s pussy."
cumin = TRUE
else
- message = "squirts on \the [partner]'s belly."
+ message = "squirts on [partner_name]'s belly."
if(CUM_TARGET_ANUS)
var/has_anus = partner.has_anus()
if(has_anus == TRUE || has_anus == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s asshole."
+ message = "squirts on \the [partner_name]'s asshole."
cumin = TRUE
else
- message = "squirts on \the [partner]'s backside."
+ message = "squirts on [partner_name]'s backside."
if(CUM_TARGET_HAND)
if(partner.has_hand())
- message = "squirts on \the [partner]'s hand."
+ message = "squirts on \the [partner_name]'s hand."
else
- message = "squirts on \the [partner]."
+ message = "squirts on [partner_name]."
if(CUM_TARGET_BREASTS)
var/has_breasts = partner.has_breasts()
if(has_breasts == TRUE || has_breasts == HAS_EXPOSED_GENITAL)
- message = "squirts onto \the [partner]'s breasts."
+ message = "squirts onto \the [partner_name]'s breasts."
else
- message = "squirts on \the [partner]'s chest and neck."
+ message = "squirts on [partner_name]'s chest and neck."
if(NUTS_TO_FACE)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "vigorously ruts [u_His] clit into \the [partner]'s mouth before shooting [u_His] femcum all over [t_His] eyes and hair."
+ message = "vigorously ruts [u_His] clit into [partner_name]'s mouth before shooting [u_His] femcum all over [partner_t_His] eyes and hair."
+
if(THIGH_SMOTHERING)
- message = "keeps \the [partner] locked in [u_His] thighs as [u_He] orgasm[u_S], squirting over [t_His] face."
- cumin = TRUE
+ message = "keeps \the [partner_name] locked in [u_His] thighs as [u_He] orgasm[u_S], squirting over [partner_t_His] face."
+
if(CUM_TARGET_FEET)
if(!last_lewd_datum.require_target_num_feet)
if(partner.has_feet())
- message = "squirts on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "squirts on [partner_name]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "squirts on the floor!"
else
if(partner.has_feet())
- message = "squirts on \the [partner]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "squirts on \the [partner_name]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "squirts on the floor!"
//weird shit goes here
if(CUM_TARGET_EARS)
if(partner.has_ears())
- message = "squirts on \the [partner]'s ear."
+ message = "squirts on [partner_name]'s ear."
else
- message = "squirts on \the [partner]'s earsocket."
+ message = "squirts on [partner_name]'s earsocket."
cumin = TRUE
if(CUM_TARGET_EYES)
if(partner.has_eyes())
- message = "squirts on \the [partner]'s eyeball."
+ message = "squirts on [partner_name]'s eyeball."
else
- message = "squirts on \the [partner]'s eyesocket."
+ message = "squirts on [partner_name]'s eyesocket."
cumin = TRUE
//
if(CUM_TARGET_PENIS)
var/has_penis = partner.has_penis()
if(has_penis == TRUE || has_penis == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s penis"
+ message = "squirts on \the [partner_name]'s penis"
else
message = "squirts on the floor!"
else
@@ -500,80 +513,80 @@
switch(target_orifice)
if(CUM_TARGET_MOUTH)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "cums right in \the [partner]'s mouth."
+ message = "cums right in \the [partner_name]'s mouth."
cumin = TRUE
else
- message = "cums on \the [partner]'s face."
+ message = "cums on \the [partner_name]'s face."
if(CUM_TARGET_THROAT)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "shoves deep into \the [partner]'s throat and cums."
+ message = "shoves deep into \the [partner_name]'s throat and cums."
cumin = TRUE
else
- message = "cums on \the [partner]'s face."
+ message = "cums on \the [partner_name]'s face."
if(CUM_TARGET_VAGINA)
var/has_vagina = partner.has_vagina()
if(has_vagina == TRUE || has_vagina == HAS_EXPOSED_GENITAL)
if(partner_carbon_check)
target_gen = c_partner.getorganslot(ORGAN_SLOT_VAGINA)
- message = "cums in \the [partner]'s pussy."
+ message = "cums in \the [partner_name]'s pussy."
cumin = TRUE
else
- message = "cums on \the [partner]'s belly."
+ message = "cums on \the [partner_name]'s belly."
if(CUM_TARGET_ANUS)
var/has_anus = partner.has_anus()
if(has_anus == TRUE || has_anus == HAS_EXPOSED_GENITAL)
- message = "cums in \the [partner]'s asshole."
+ message = "cums in \the [partner_name]'s asshole."
cumin = TRUE
else
- message = "cums on \the [partner]'s backside."
+ message = "cums on \the [partner_name]'s backside."
if(CUM_TARGET_HAND)
if(partner.has_hand())
- message = "cums in \the [partner]'s hand."
+ message = "cums in \the [partner_name]'s hand."
else
- message = "cums on \the [partner]."
+ message = "cums on \the [partner_name]."
if(CUM_TARGET_BREASTS)
if(partner.is_topless() && partner.has_breasts())
- message = "cums onto \the [partner]'s breasts."
+ message = "cums onto \the [partner_name]'s breasts."
else
- message = "cums on \the [partner]'s chest and neck."
+ message = "cums on \the [partner_name]'s chest and neck."
if(NUTS_TO_FACE)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "vigorously ruts [u_His] nutsack into \the [partner]'s mouth before shooting [u_His] thick, sticky jizz all over [t_His] eyes and hair."
+ message = "vigorously ruts [u_His] nutsack into \the [partner_name]'s mouth before shooting [u_His] thick, sticky jizz all over [partner_t_His] eyes and hair."
if(THIGH_SMOTHERING)
if(has_penis()) //it already checks for the cock before, why the hell would you do this redundant shit
- message = "keeps \the [partner] locked in [u_His] thighs as [u_His] cock throbs, dumping its heavy load all over [t_His] face."
+ message = "keeps \the [partner_name] locked in [u_His] thighs as [u_His] cock throbs, dumping its heavy load all over [partner_t_His] face."
else
- message = "reaches [u_His] peak, locking [u_His] legs around \the [partner]'s head extra hard as [u_He] cum[u_S] straight onto the head stuck between [u_His] thighs"
+ message = "reaches [u_His] peak, locking [u_His] legs around \the [partner_name]'s head extra hard as [u_He] cum[u_S] straight onto the head stuck between [u_His] thighs"
cumin = TRUE
if(CUM_TARGET_FEET)
if(!last_lewd_datum || !last_lewd_datum.require_target_num_feet)
if(partner.has_feet())
- message = "cums on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "cums on \the [partner_name]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "cums on the floor!"
else
if(partner.has_feet())
- message = "cums on \the [partner]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "cums on \the [partner_name]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "cums on the floor!"
//weird shit goes here
if(CUM_TARGET_EARS)
if(partner.has_ears())
- message = "cums inside \the [partner]'s ear."
+ message = "cums inside \the [partner_name]'s ear."
else
- message = "cums inside \the [partner]'s earsocket."
+ message = "cums inside \the [partner_name]'s earsocket."
cumin = TRUE
if(CUM_TARGET_EYES)
if(partner.has_eyes())
- message = "cums on \the [partner]'s eyeball."
+ message = "cums on \the [partner_name]'s eyeball."
else
- message = "cums inside \the [partner]'s eyesocket."
+ message = "cums inside \the [partner_name]'s eyesocket."
cumin = TRUE
//
if(CUM_TARGET_PENIS)
var/has_penis = partner.has_penis()
if(has_penis == TRUE || has_penis == HAS_EXPOSED_GENITAL)
- message = "cums on \the [partner]."
+ message = "cums on \the [partner_name]."
else
message = "cums on the floor!"
else
@@ -585,77 +598,77 @@
switch(target_orifice)
if(CUM_TARGET_MOUTH)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "squirts right in \the [partner]'s mouth."
+ message = "squirts right in \the [partner_name]'s mouth."
cumin = TRUE
else
- message = "squirts on \the [partner]'s face."
+ message = "squirts on \the [partner_name]'s face."
if(CUM_TARGET_THROAT)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "rubs [u_His] vagina against \the [partner]'s mouth and cums."
+ message = "rubs [u_His] vagina against \the [partner_name]'s mouth and cums."
cumin = TRUE
else
- message = "squirts on \the [partner]'s face."
+ message = "squirts on \the [partner_name]'s face."
if(CUM_TARGET_VAGINA)
var/has_vagina = partner.has_vagina()
if(has_vagina == TRUE || has_vagina == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s pussy."
+ message = "squirts on \the [partner_name]'s pussy."
cumin = TRUE
else
- message = "squirts on \the [partner]'s belly."
+ message = "squirts on \the [partner_name]'s belly."
if(CUM_TARGET_ANUS)
var/has_anus = partner.has_anus()
if(has_anus == TRUE || has_anus == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s asshole."
+ message = "squirts on \the [partner_name]'s asshole."
cumin = TRUE
else
- message = "squirts on \the [partner]'s backside."
+ message = "squirts on \the [partner_name]'s backside."
if(CUM_TARGET_HAND)
if(partner.has_hand())
- message = "squirts on \the [partner]'s hand."
+ message = "squirts on \the [partner_name]'s hand."
else
- message = "squirts on \the [partner]."
+ message = "squirts on \the [partner_name]."
if(CUM_TARGET_BREASTS)
var/has_breasts = partner.has_breasts()
if(has_breasts == TRUE || has_breasts == HAS_EXPOSED_GENITAL)
- message = "squirts onto \the [partner]'s breasts."
+ message = "squirts onto \the [partner_name]'s breasts."
else
- message = "squirts on \the [partner]'s chest and neck."
+ message = "squirts on \the [partner_name]'s chest and neck."
if(NUTS_TO_FACE)
if(partner.has_mouth() && partner.mouth_is_free())
- message = "vigorously ruts [u_His] clit into \the [partner]'s mouth before shooting [u_His] femcum all over [t_His] eyes and hair."
+ message = "vigorously ruts [u_His] clit into \the [partner_name]'s mouth before shooting [u_His] femcum all over [partner_t_His] eyes and hair."
if(THIGH_SMOTHERING)
- message = "keeps \the [partner] locked in [u_His] thighs as [u_He] orgasm[u_S], squirting over [t_His] face."
+ message = "keeps \the [partner_name] locked in [u_His] thighs as [u_He] orgasm[u_S], squirting over [partner_t_His] face."
if(CUM_TARGET_FEET)
if(!last_lewd_datum || !last_lewd_datum.require_target_num_feet)
if(partner.has_feet())
- message = "squirts on \the [partner]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "squirts on \the [partner_name]'s [partner.has_feet() == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "squirts on the floor!"
else
if(partner.has_feet())
- message = "squirts on \the [partner]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
+ message = "squirts on \the [partner_name]'s [last_lewd_datum.require_target_num_feet == 1 ? pick("foot", "sole") : pick("feet", "soles")]."
else
message = "squirts on the floor!"
//weird shit goes here
if(CUM_TARGET_EARS)
if(partner.has_ears())
- message = "squirts on \the [partner]'s ear."
+ message = "squirts on \the [partner_name]'s ear."
else
- message = "squirts on \the [partner]'s earsocket."
+ message = "squirts on \the [partner_name]'s earsocket."
cumin = TRUE
if(CUM_TARGET_EYES)
if(partner.has_eyes())
- message = "squirts on \the [partner]'s eyeball."
+ message = "squirts on \the [partner_name]'s eyeball."
else
- message = "squirts on \the [partner]'s eyesocket."
+ message = "squirts on \the [partner_name]'s eyesocket."
cumin = TRUE
//
if(CUM_TARGET_PENIS)
var/has_penis = partner.has_penis()
if(has_penis == TRUE || has_penis == HAS_EXPOSED_GENITAL)
- message = "squirts on \the [partner]'s penis"
+ message = "squirts on \the [partner_name]'s penis"
else
message = "squirts on the floor!"
else
@@ -666,15 +679,27 @@
var/did_anything = TRUE
switch(last_genital.type)
if(/obj/item/organ/genital/penis)
- message = "cums into \the [partner]!"
+ message = "cums into \the [partner_name]!"
if(/obj/item/organ/genital/vagina)
- message = "squirts into \the [partner]!"
+ message = "squirts into \the [partner_name]!"
else
did_anything = FALSE
if(did_anything)
LAZYADD(obscure_to, src)
if(!message) //todo: better self cum messages
message = "cums all over themselves!"
+
+ if(partner_carbon_check && cumin)
+ switch(target_orifice)
+ if(CUM_TARGET_VAGINA)
+ target_gen = c_partner.getorganslot(ORGAN_SLOT_VAGINA)
+ if(CUM_TARGET_ANUS)
+ target_gen = c_partner.getorganslot(ORGAN_SLOT_ANUS)
+ if(CUM_TARGET_BREASTS)
+ target_gen = c_partner.getorganslot(ORGAN_SLOT_BREASTS)
+ if(CUM_TARGET_PENIS)
+ target_gen = c_partner.getorganslot(ORGAN_SLOT_PENIS)
+
if(gender == MALE)
playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_m1.ogg',
'modular_sand/sound/interactions/final_m2.ogg',
@@ -697,7 +722,7 @@
else if(istype(partner, /obj/item/reagent_containers))
H.mob_fill_container(last_genital, partner, 0)
else
- H.mob_climax(TRUE, "sex", partner, !cumin, target_gen)
+ H.mob_climax(TRUE, "sex", partner, !cumin, target_gen, anonymous)
set_lust(0)
SEND_SIGNAL(src, COMSIG_MOB_POST_CAME, target_orifice, partner, cumin, last_genital)
@@ -741,8 +766,8 @@
txt = copytext(A.name, 1, length(A.name))
return txt
-///Handles the sex, if cumming returns true.
-/mob/living/proc/handle_post_sex(amount, orifice, mob/living/partner)
+/// Handles the sex, if cumming returns true.
+/mob/living/proc/handle_post_sex(amount, orifice, mob/living/partner, organ = null, cum_inside = FALSE, anonymous = FALSE) //SPLURT EDIT - extra argument `cum_inside` and `anonymous`
if(stat != CONSCIOUS)
return FALSE
@@ -756,7 +781,7 @@
moan()
return FALSE
if(lust >= (lust_tolerance * 3))
- if(cum(partner, orifice))
+ if(cum(partner, orifice, cum_inside, anonymous)) //SPLURT EDIT - extra argument `cum_inside` and `anonymous`
return TRUE
return FALSE
diff --git a/modular_sand/code/game/objects/items/fleshlight.dm b/modular_sand/code/game/objects/items/fleshlight.dm
index b7df74cd050d..af26a4c5be67 100644
--- a/modular_sand/code/game/objects/items/fleshlight.dm
+++ b/modular_sand/code/game/objects/items/fleshlight.dm
@@ -116,6 +116,8 @@
updatesleeve()
/obj/item/portallight/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
+ if(portalunderwear == null)
+ return
var/user_message = ""
var/target_message = ""
var/user_lust_amt = NONE
@@ -420,7 +422,7 @@
if(user_message)
if(portal_target && (portal_target?.client?.prefs.toggles & VERB_CONSENT || !portal_target.ckey))
user.visible_message("[user] [user_message].")
- if(M.can_penetrating_genital_cum() && M.handle_post_sex(user_lust_amt, target, portal_target, target)) //SPLURT edit
+ if(M.can_penetrating_genital_cum() && M.handle_post_sex(user_lust_amt, portalunderwear.targetting, portal_target, null, TRUE, TRUE)) //SPLURT edit
switch(target)
if(CUM_TARGET_PENIS)
switch(portalunderwear.targetting)
@@ -464,7 +466,7 @@
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
to_chat(portal_target, "Someone uses the linked [name], they [target_message].")
- if(portal_target.handle_post_sex(target_lust_amt, portalunderwear.targetting, M, portalunderwear.targetting)) //SPLURT edit
+ if(portal_target.handle_post_sex(target_lust_amt, portalunderwear.targetting, M, null, TRUE, TRUE)) //SPLURT edit
switch(portalunderwear.targetting)
if(CUM_TARGET_VAGINA)
switch(target)
diff --git a/modular_sand/code/modules/arousal/arousal.dm b/modular_sand/code/modules/arousal/arousal.dm
index 5ff997e32c60..b71bcf66c2b5 100644
--- a/modular_sand/code/modules/arousal/arousal.dm
+++ b/modular_sand/code/modules/arousal/arousal.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/G, spill) //Now I know how to modularize it :D
+/mob/living/carbon/human/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/sender, spill, cover = FALSE, obj/item/organ/genital/receiver, anonymous = FALSE) //Now I know how to modularize it :D
. = ..()
set_lust(0)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
diff --git a/modular_splurt/code/datums/components/pregnancy_inert.dm b/modular_splurt/code/datums/components/pregnancy_inert.dm
index 5d8e2643206e..f6766783bfd8 100644
--- a/modular_splurt/code/datums/components/pregnancy_inert.dm
+++ b/modular_splurt/code/datums/components/pregnancy_inert.dm
@@ -62,9 +62,12 @@
eggs_stored += 1
eggs_stored = min(3, eggs_stored)
-/datum/component/ovipositor/proc/on_climax(datum/source, datum/reagents/senders_cum, atom/target, obj/item/organ/genital/sender, obj/item/organ/genital/receiver, spill)
+/datum/component/ovipositor/proc/on_climax(datum/source, datum/reagents/senders_cum, atom/target, obj/item/organ/genital/sender, obj/item/organ/genital/receiver, spill, anonymous)
SIGNAL_HANDLER
+ if(prob(30))
+ return FALSE
+
var/obj/item/organ/genital/stuff = parent
if(stuff != sender && stuff.linked_organ != sender)
return FALSE
@@ -74,15 +77,12 @@
if(receiver && isliving(target))
if(CHECK_BITFIELD(receiver.genital_flags, GENITAL_CAN_STUFF))
- return lay_eg(receiver, senders_cum)
- return lay_eg(get_turf(carrier), senders_cum)
+ return lay_eg(receiver, senders_cum, anonymous)
+ return lay_eg(get_turf(carrier), senders_cum, anonymous)
-/datum/component/ovipositor/proc/lay_eg(atom/location, datum/reagents/senders_cum)
+/datum/component/ovipositor/proc/lay_eg(atom/location, datum/reagents/senders_cum, anonymous)
to_chat(carrier, span_userlove("You feel your egg sliding slowly inside!"))
- if(prob(30))
- return FALSE
-
if(isorgan(location))
var/obj/item/organ/recv = location
@@ -104,8 +104,14 @@
var/obj/item/organ/recv = location
var/datum/component/genital_equipment/equipment = eggo.GetComponent(/datum/component/genital_equipment)
equipment.holder_genital = recv
- carrier.visible_message(span_userlove("[carrier] laid an egg!"), \
- span_userlove("You laid an egg inside [recv.owner]'s [recv]"))
+ if(anonymous)
+ carrier.visible_message(span_userlove("[carrier] laid an egg!"), \
+ span_userlove("You laid an egg inside someone's [recv]"))
+ to_chat(recv, span_userlove("Someone laid an egg in you!"))
+ else
+ carrier.visible_message(span_userlove("[carrier] laid an egg!"), \
+ span_userlove("You laid an egg inside [recv.owner]'s [recv]"))
+ to_chat(recv, span_userlove("[carrier] laid an egg in you!"))
else
carrier.visible_message(span_notice("[carrier] laid an egg!"), \
span_nicegreen("The egg came out!"))
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm b/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
index e5b631e20e01..900b93062ad3 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
@@ -72,14 +72,14 @@ GLOBAL_LIST_INIT(anus_traits, list("[TRAIT_HYPERSENS_ANUS]" = 3, "[TRAIT_OVERSTI
*/
/mob/living/proc/check_orgasm(datum/source, R, target, obj/item/organ/genital/sender, receiver, spill)
SIGNAL_HANDLER
-
+
if(CHECK_BITFIELD(sender.genital_flags, GENITAL_IMPOTENT) || CHECK_BITFIELD(sender.genital_flags, GENITAL_DISAPPOINTING))
emote("sigh")
to_chat(src, "[pick("Ugh, that was embarassing...", "I could've done it better...")]")
return TRUE
return FALSE
-/mob/living/carbon/handle_post_sex(amount, orifice, mob/living/partner, organ = null)
+/mob/living/carbon/handle_post_sex(amount, orifice, mob/living/partner, organ = null, cum_inside = FALSE, anonymous = FALSE)
if(organ)
amount = check_stimulation(amount, organ)
diff --git a/modular_splurt/code/modules/arousal/arousal.dm b/modular_splurt/code/modules/arousal/arousal.dm
index 21f107076aaf..1d9c99e28df1 100644
--- a/modular_splurt/code/modules/arousal/arousal.dm
+++ b/modular_splurt/code/modules/arousal/arousal.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage, mb_time, obj/item/organ/genital/Lgen, forced = FALSE)
+/mob/living/carbon/human/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30, obj/item/organ/genital/Lgen = null, forced = FALSE, anonymous = FALSE)
. = ..()
L.receive_climax(src, Lgen, G, spillage, forced = forced)
if(iswendigo(L))
@@ -43,13 +43,13 @@
eggo.forceMove(container)
eggo.AddComponent(/datum/component/pregnancy, src, partner, baby_type)
-/mob/living/carbon/human/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/sender, spill, cover = FALSE, obj/item/organ/genital/receiver)
+/mob/living/carbon/human/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/sender, spill, cover = FALSE, obj/item/organ/genital/receiver, anonymous = FALSE)
if(!sender)
return
if(!target || !R)
return
- if(SEND_SIGNAL(src, COMSIG_MOB_CLIMAX, R, target, sender, receiver, spill))
+ if(SEND_SIGNAL(src, COMSIG_MOB_CLIMAX, R, target, sender, receiver, spill, anonymous))
return
var/cached_fluid