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 ( @@ -843,6 +847,30 @@ const ContentPreferencesTab = (props, context) => { })} /> + +
); };