From a127b0e553787e263e5b399acb718291d52c19f5 Mon Sep 17 00:00:00 2001
From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com>
Date: Tue, 30 Nov 2021 17:26:10 -0500
Subject: [PATCH] Added genital picking for climax (#200)
* Added genital picking for climax
Yup
* Fixed
---
code/__DEFINES/citadel_defines.dm | 1 +
code/modules/arousal/arousal.dm | 31 ++++++++++++++++++++-------
code/modules/arousal/organs/vagina.dm | 2 +-
3 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 04eeb515c9..b0834012bc 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -26,6 +26,7 @@
#define GENITAL_UNDIES_HIDDEN (1<<9)
#define UPDATE_OWNER_APPEARANCE (1<<10)
#define GENITAL_CAN_TAUR (1<<11)
+#define CAN_CUM_INTO (1<<12) //Sandstorm change
#define DEF_VAGINA_SHAPE "Human"
diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm
index c3775b929e..7bd9ef2fbd 100644
--- a/code/modules/arousal/arousal.dm
+++ b/code/modules/arousal/arousal.dm
@@ -97,21 +97,21 @@
to_chat(src,"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) //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) //Used for climaxing with any living thing
var/datum/reagents/fluid_source = G.climaxable(src)
if(!fluid_source)
return
if(mb_time) //Skip warning if this is an instant climax.
- to_chat(src,"You're about to climax with [L]!")
- to_chat(L,"[src] is about to climax with you!")
+ to_chat(src,"You're about to climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"]!")
+ to_chat(L,"[src] 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,"You orgasm with [L], spilling out of them, using your [G.name].")
- to_chat(L,"[src] climaxes with you, overflowing and spilling, using [p_their()] [G.name]!")
+ to_chat(src,"You orgasm with [L], spilling out of [(Lgen) ? "[L.p_their()] [Lgen.name]" : "[L.p_them()]"], using your [G.name].")
+ to_chat(L,"[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], overflowing and spilling, using [p_their()] [G.name]!")
else //knots and other non-spilling orgasms
- to_chat(src,"You climax with [L], your [G.name] spilling nothing.")
- to_chat(L,"[src] climaxes with you, [p_their()] [G.name] spilling nothing!")
+ to_chat(src,"You climax [(Lgen) ? "in [L]'s [Lgen.name]" : "with [L]"], your [G.name] spilling nothing.")
+ to_chat(L,"[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!")
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
do_climax(fluid_source, spillage ? loc : L, G, spillage)
@@ -126,6 +126,19 @@
to_chat(src,"You used your [G.name] to fill [container].")
do_climax(fluid_source, container, G, FALSE)
+/mob/living/carbon/human/proc/pick_receiving_organ(mob/living/L)
+ if (!iscarbon(L))
+ return
+ var/mob/living/carbon/C = L
+ var/list/receivers_list
+ var/list/other_worn = C.get_equipped_items()
+ for(var/obj/item/organ/genital/G in C.internal_organs)
+ if((G.genital_flags & CAN_CUM_INTO) && G.is_exposed(other_worn)) //filter out what you can't cum into
+ LAZYADD(receivers_list, G)
+ if(LAZYLEN(receivers_list))
+ var/obj/item/organ/genital/ret_organ = input(src, "in what hole?", "Climax", null) as null|obj in receivers_list
+ return ret_organ
+
/mob/living/carbon/human/proc/pick_climax_genitals(silent = FALSE)
var/list/genitals_list
var/list/worn_stuff = get_equipped_items()
@@ -280,12 +293,14 @@
if("Climax with partner")
//We need no hands, we can be restrained and so on, so let's pick an organ
var/obj/item/organ/genital/picked_organ = pick_climax_genitals()
+ var/obj/item/organ/genital/picked_target = null
if(picked_organ)
var/mob/living/partner = pick_partner() //Get someone
if(partner)
+ picked_target = pick_receiving_organ(partner)
var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as null|anything in list("Yes", "No")
if(spillage && in_range(src, partner))
- mob_climax_partner(picked_organ, partner, spillage == "Yes" ? TRUE : FALSE)
+ mob_climax_partner(picked_organ, partner, spillage == "Yes" ? TRUE : FALSE, Lgen = picked_target)
if("Fill container")
//We'll need hands and no restraints.
if(!available_rosie_palms(FALSE, /obj/item/reagent_containers))
diff --git a/code/modules/arousal/organs/vagina.dm b/code/modules/arousal/organs/vagina.dm
index 5c8bbeea98..41fa0ad3cf 100644
--- a/code/modules/arousal/organs/vagina.dm
+++ b/code/modules/arousal/organs/vagina.dm
@@ -7,7 +7,7 @@
slot = "vagina"
size = 1 //There is only 1 size right now
shape = DEF_VAGINA_SHAPE
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|GENITAL_UNDIES_HIDDEN
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|GENITAL_UNDIES_HIDDEN|CAN_CUM_INTO
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
unarousal_verb = "You no longer feel wet"