diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index bd9243f4f0..6024ea1356 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -130,6 +130,8 @@
#define BUTT_ENLARGEMENT (1<<16)
#define BELLY_INFLATION (1<<17)
#define CHASTITY (1<<18)
+#define STIMULATION (1<<19)
+#define EDGING (1<<20)
//Note: reminder, if you're a coder adding more bitflags here in the event we add more horny things, the maximum is (1<<23).
#define TOGGLES_CITADEL 0
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c90e46599f..f82e4b397d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1434,6 +1434,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
"
//SPLURT EDIT
dat += "Chastity Interactions : [(cit_toggles & CHASTITY) ? "Allowed" : "Disallowed"]
"
+ dat += "Genital Stimulation Modifiers : [(cit_toggles & STIMULATION) ? "Allowed" : "Disallowed"]
"
+ dat += "Edging : [(cit_toggles & EDGING) ? "Allowed" : "Disallowed"]
"
dat += "? "
dat += "Unholy ERP verbs : [unholypref]
" //https://www.youtube.com/watch?v=OHKARc-GObU
//END OF SPLURT EDIT
@@ -3735,6 +3737,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("chastitypref")
cit_toggles ^= CHASTITY
+ if("stimulationpref")
+ cit_toggles ^= STIMULATION
+ if("edgingpref")
+ cit_toggles ^= EDGING
//
if(href_list["preference"] == "gear")
diff --git a/modular_sand/code/datums/interactions/interaction_interface.dm b/modular_sand/code/datums/interactions/interaction_interface.dm
index 83b2101449..fd2257dc33 100644
--- a/modular_sand/code/datums/interactions/interaction_interface.dm
+++ b/modular_sand/code/datums/interactions/interaction_interface.dm
@@ -218,6 +218,8 @@
.["no_ass_slap"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_ASS_SLAP)
.["no_auto_wag"] = !CHECK_BITFIELD(prefs.cit_toggles, NO_AUTO_WAG)
.["chastity_pref"] = !!CHECK_BITFIELD(prefs.cit_toggles, CHASTITY)
+ .["stimulation_pref"] = !!CHECK_BITFIELD(prefs.cit_toggles, STIMULATION)
+ .["edging_pref"] = !!CHECK_BITFIELD(prefs.cit_toggles, EDGING)
/proc/num_to_pref(num)
switch(num)
@@ -404,6 +406,10 @@
// SPLURT edit
if("chastity_pref")
TOGGLE_BITFIELD(prefs.cit_toggles, CHASTITY)
+ if("stimulation_pref")
+ TOGGLE_BITFIELD(prefs.cit_toggles, STIMULATION)
+ if("edging_pref")
+ TOGGLE_BITFIELD(prefs.cit_toggles, EDGING)
//
else
return FALSE
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm b/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
index 7b47530a41..850f2eb285 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_definitions.dm
@@ -14,24 +14,25 @@ GLOBAL_LIST_INIT(anus_traits, list("[TRAIT_HYPERSENS_ANUS]" = 3, "[TRAIT_OVERSTI
* * genital: Genital to check for any lust modifiers.
* TODO - TURN THE TRAITS INTO COMPONENTS
*/
-/mob/living/proc/check_stimulation(amount, genital)
+/mob/living/carbon/proc/check_stimulation(amount, genital)
var/list/common_flags = list()
// Check if the given genital is an "anus"
if(genital == "anus")
- for(var/anus_trait in GLOB.anus_traits)
- if(HAS_TRAIT(src, anus_trait))
- LAZYADD(common_flags, anus_trait)
+ if(!dna.features["has_anus"])
+ for(var/anus_trait in GLOB.anus_traits)
+ if(HAS_TRAIT(src, anus_trait))
+ LAZYADD(common_flags, anus_trait)
- if(!isemptylist(common_flags))
- var/new_amount = amount * GLOB.anus_traits[common_flags[1]] // Multiply the arousal amount by the first trait added
+ if(!isemptylist(common_flags))
+ var/new_amount = amount * GLOB.anus_traits[common_flags[1]] // Multiply the arousal amount by the first trait added
- if(CHECK_BITFIELD(text2num(common_flags[1]), TRAIT_EDGINGONLY_ANUS))
- lustcap(new_amount)
+ if(CHECK_BITFIELD(text2num(common_flags[1]), TRAIT_EDGINGONLY_ANUS))
+ lustcap(new_amount)
- return new_amount
+ return new_amount
- return amount
+ return amount
// Set a G variable to a proper genital instead of a string if it's one.
@@ -76,7 +77,7 @@ GLOBAL_LIST_INIT(anus_traits, list("[TRAIT_HYPERSENS_ANUS]" = 3, "[TRAIT_OVERSTI
return TRUE
return FALSE
-/mob/living/handle_post_sex(amount, orifice, mob/living/partner, organ = null)
+/mob/living/carbon/handle_post_sex(amount, orifice, mob/living/partner, organ = null)
if(organ)
amount = check_stimulation(amount, organ)
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm
index d482f11889..b0bc752005 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm
@@ -75,10 +75,17 @@
to_chat(user, "Your anus is now [lowertext(choices[G])]")
- continue
+ trait_flag = TRAIT_IMPOTENT_ANUS
+ if("Edging-Only")
+ if(!(target.client?.prefs.cit_toggles & EDGING))
+ continue
+
+ trait_flag = TRAIT_EDGINGONLY_ANUS
+ if("Disappointing-Orgasm")
+ if(!(target.client?.prefs.cit_toggles & CHASTITY))
+ continue
+
+ trait_flag = TRAIT_DISAPPOINTING_ANUS
+ if("Overstimulated")
+ if(!(target.client?.prefs.cit_toggles & STIMULATION))
+ continue
+
+ trait_flag = TRAIT_OVERSTIM_ANUS
+ if("Hyper-Sensitive")
+ if(!(target.client?.prefs.cit_toggles & STIMULATION))
+ continue
+
+ trait_flag = TRAIT_HYPERSENS_ANUS
+
+ ADD_TRAIT(C, trait_flag, ORGAN_TRAIT)
+ to_chat(C, "Your anus is now [lowertext(choices[G])]")
+ continue
var/obj/item/organ/genital/genital = C.getorganslot(lowertext(G))
if(!genital)
@@ -42,16 +58,31 @@
switch(choices[G])
if("Impotent")
+ if(!(target.client?.prefs.cit_toggles & CHASTITY))
+ continue
+
hypno_flag = GENITAL_IMPOTENT
if(istype(genital, /obj/item/organ/genital/penis))
genital.set_aroused_state(0, "impotence") //Pp goes wooon
if("Edging-Only")
+ if(!(target.client?.prefs.cit_toggles & EDGING))
+ continue
+
hypno_flag = GENITAL_EDGINGONLY
if("Disappointing-Orgasm")
+ if(!(target.client?.prefs.cit_toggles & CHASTITY))
+ continue
+
hypno_flag = GENITAL_DISAPPOINTING
if("Overstimulated")
+ if(!(target.client?.prefs.cit_toggles & STIMULATION))
+ continue
+
hypno_flag = GENITAL_OVERSTIM
if("Hyper-Sensitive")
+ if(!(target.client?.prefs.cit_toggles & STIMULATION))
+ continue
+
hypno_flag = GENITAL_HYPERSENS
if(!hypno_flag)
diff --git a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/chastity/chastity_belt.dm b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/chastity/chastity_belt.dm
index 1b24e4332e..bb3b2e51c0 100644
--- a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/chastity/chastity_belt.dm
+++ b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/chastity/chastity_belt.dm
@@ -38,7 +38,7 @@
holder.dropItemToGround(src)
return
- blocked_genital = input(holder, "Choose a genital to block.") as null|anything in exposed_genitals + list("anus")
+ blocked_genital = input(holder, "Choose a genital to block.") as null|anything in ((exposed_genitals + list("anus")) - list("butt"))
if(!blocked_genital)
holder.dropItemToGround(src)
return
@@ -48,7 +48,7 @@
holder.dropItemToGround(src)
return
- if(blocked_genital == "anus")
+ if(blocked_genital == "anus" && !H.dna.features["has_anus"])
ADD_TRAIT(H, TRAIT_CHASTENED_ANUS, CLOTHING_TRAIT)
H.anus_toggle_visibility(GEN_VISIBLE_NEVER)
else
@@ -82,7 +82,7 @@
//
/obj/item/genital_equipment/chastity_cage/belt/unequip(obj/item/organ/genital/G, mob/living/carbon/human/H)
- if(blocked_genital == "anus")
+ if(blocked_genital == "anus" && !H.dna.features["has_anus"])
REMOVE_TRAIT(H, TRAIT_CHASTENED_ANUS, CLOTHING_TRAIT)
H.anus_toggle_visibility(GEN_VISIBLE_NO_UNDIES)
else
diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 8bf6ad1c50..95525db09e 100644
--- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -88,7 +88,7 @@
var/obj/item/organ/genital/G = C.getorganslot(genital)
if(!G)
return
-
+
G.set_aroused_state(0, "impotence") //just so it goes down if it's a penis
ENABLE_BITFIELD(G.genital_flags, mod_flag)
@@ -96,7 +96,7 @@
var/obj/item/organ/genital/G = C.getorganslot(genital)
if(!genital)
return
-
+
DISABLE_BITFIELD(G.genital_flags, mod_flag)
..()
@@ -116,12 +116,13 @@
metabolization_rate = 0.2
taste_description = "excitement"
var/mod_flag = GENITAL_OVERSTIM
+ var/trait_mod_flag = TRAIT_OVERSTIM_ANUS //In case the genital is abstract
var/genital
/datum/reagent/drug/genital_stimulator/on_mob_metabolize(mob/living/carbon/C)
..()
- if(genital == "anus")
- ADD_TRAIT(C, mod_flag, ORGAN_TRAIT)
+ if(genital == "anus" && !C.dna.features["has_anus"])
+ ADD_TRAIT(C, trait_mod_flag, ORGAN_TRAIT)
return
var/obj/item/organ/genital/G = C.getorganslot(genital)
@@ -134,9 +135,9 @@
var/obj/item/organ/genital/G = C.getorganslot(genital)
if(!genital)
return
-
- if(G == "anus")
- REMOVE_TRAIT(C, mod_flag, ORGAN_TRAIT)
+
+ if(G == "anus" && !C.dna.features["has_anus"])
+ REMOVE_TRAIT(C, trait_mod_flag, ORGAN_TRAIT)
else
DISABLE_BITFIELD(G.genital_flags, mod_flag)
@@ -145,7 +146,6 @@
/datum/reagent/drug/genital_stimulator/anal_allure
name = "Anal Allure"
color = COLOR_DARK_RED
- mod_flag = TRAIT_OVERSTIM_ANUS
genital = "anus"
/datum/reagent/drug/genital_stimulator/breast_buzzer
diff --git a/tgui/packages/tgui/interfaces/MobInteraction.tsx b/tgui/packages/tgui/interfaces/MobInteraction.tsx
index 9ded0e216d..a84ccda610 100644
--- a/tgui/packages/tgui/interfaces/MobInteraction.tsx
+++ b/tgui/packages/tgui/interfaces/MobInteraction.tsx
@@ -90,6 +90,8 @@ type ContentPrefsInfo = {
no_ass_slap: boolean,
no_auto_wag: boolean,
chastity_pref: boolean,
+ stimulation_pref: boolean,
+ edging_pref: boolean,
}
export const MobInteraction = (props, context) => {
@@ -575,7 +577,9 @@ const ContentPreferencesTab = (props, context) => {
no_aphro,
no_ass_slap,
no_auto_wag,
- chastity_pref
+ chastity_pref,
+ stimulation_pref,
+ edging_pref,
} = data;
return (