diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index b0d73615b9..8dd6d80a92 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -173,7 +173,7 @@
/datum/mood_event/orgasm
description = "I came!\n" //funny meme haha
mood_change = 3
- timeout = 100 SECONDS
+ timeout = 3 MINUTES
/datum/mood_event/fedpred
description = "I've devoured someone!\n"
diff --git a/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm
index 604963948a..89f2ef34dc 100644
--- a/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/code/modules/arousal/genitals_sprite_accessories.dm
@@ -6,6 +6,18 @@
var/taur_dimension_y = 32
var/taur_dimension_x = 32
+/*
+ * This is an example of a penis object in the code.
+ * The icon_state of the penis is structured as follows:
+ * "penis_human_4_1_FRONT"
+ * Where "human" is the type of the penis, "4" is the size stage of the penis, and "1" means it's the erect sprite, while "0" would be the soft one.
+ * If the sprite is like this: "penis_human_4_s_1_FRONT", the extra "_s" means it's used by the default skintones (the list of default skin tones that "Albino, Caucasian, etc.").
+ * Those "_s" sprites use a more pink-ish tone instead of white, to match the different default skin tones automatically,
+ * while the icon states without the "_s" are used by the custom skin tone.
+ * In the future, it would be best to solve this, as it creates useless duplicated icon states, and therefore heavier file sizes.
+ * It would be best to just have 1 set of icon states that apply themselves normally to both custom skin tone users and match default skin tone users,
+ * effectively removing the need of using the extra "_s". - Goku
+ */
//DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index f96fe2ac2a..370f8c4eec 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -7,15 +7,31 @@
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.9
equip_delay_other = 20
+ equip_delay_self = 20
mutantrace_variation = STYLE_MUZZLE
+ var/seamless = FALSE
-/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(src == C.wear_mask)
- to_chat(user, "You need help taking this off!")
- return
- ..()
+/obj/item/clothing/mask/muzzle/attack_paw(mob/user, act_intent, attackchain_flags)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(src == C.wear_mask)
+ if(seamless)
+ to_chat(user, span_warning("You need help taking this off!"))
+ return
+ else
+ if(!do_after(C, 60, target = src))
+ return
+ ..()
+
+/obj/item/clothing/mask/muzzle/attackby(obj/item/K, mob/user, params)
+ if(istype(K, /obj/item/key/latex))
+ if(seamless != FALSE)
+ to_chat(user, span_notice("The latches suddenly loosen!"))
+ seamless = FALSE
+ else
+ to_chat(user, span_warning("The latches suddenly tighten!"))
+ seamless = TRUE
+ return
/obj/item/clothing/mask/surgical
name = "sterile mask"
diff --git a/icons/obj/genitals/penis_onmob.dmi b/icons/obj/genitals/penis_onmob.dmi
index 111a36975f..780e982f9e 100644
Binary files a/icons/obj/genitals/penis_onmob.dmi and b/icons/obj/genitals/penis_onmob.dmi differ
diff --git a/icons/obj/genitals/testicles_onmob.dmi b/icons/obj/genitals/testicles_onmob.dmi
index 5bec4d9b6b..075421afd8 100644
Binary files a/icons/obj/genitals/testicles_onmob.dmi and b/icons/obj/genitals/testicles_onmob.dmi differ
diff --git a/modular_sand/code/datums/interactions/_interaction.dm b/modular_sand/code/datums/interactions/_interaction.dm
index cf00b85774..28d6c4e441 100644
--- a/modular_sand/code/datums/interactions/_interaction.dm
+++ b/modular_sand/code/datums/interactions/_interaction.dm
@@ -135,7 +135,7 @@
/// After the interaction, the base only plays the sound and only if it has one
/datum/interaction/proc/post_interaction(mob/living/user, mob/living/target)
- COOLDOWN_START(user, last_interaction_time, 0.6 SECONDS)
+ COOLDOWN_START(user, last_interaction_time, 0.55 SECONDS)
if(interaction_sound)
playsound(get_turf(user), interaction_sound, 50, 1, -1)
return
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm
index 2434459cdc..258e012e15 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm
@@ -25,9 +25,9 @@
var/milktext = milk.name
lines = list(
- "pushes [u_His] breasts against \the [target]'s mouth, squirting [u_His] warm [lowertext(milktext)] into [t_His] mouth",
- "fills \the [target]'s mouth with warm, sweet [lowertext(milktext)] as [u_He] squeezes [u_His] boobs, panting",
- "lets a large stream of [u_His] own abundant [lowertext(milktext)] coat the back of \the [target]'s throat"
+ "pushes [u_His] breasts against \the [target]'s mouth, squirting [u_His] warm [lowertext(milktext)] into [t_His] mouth.",
+ "fills \the [target]'s mouth with warm, sweet [lowertext(milktext)] as [u_He] squeezes [u_His] boobs, panting.",
+ "lets a large stream of [u_His] own abundant [lowertext(milktext)] coat the back of \the [target]'s throat."
)
message = span_lewd("\The [user] [pick(lines)]")
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
index 8cac9b1c2b..963478fdc4 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
@@ -88,9 +88,9 @@
if(user.has_penis() || user.has_strapon())
var/genital_name = user.get_penetrating_genital_name()
if(user.is_fucking(partner, CUM_TARGET_THROAT))
- message = "retracts [u_His] [genital_name] from \the [partner]'s throat"
+ message = "retracts [u_His] [genital_name] from \the [partner]'s throat."
else
- message = "shoves [u_His] [genital_name] into \the [partner]'s mouth"
+ message = "shoves [u_His] [genital_name] into \the [partner]'s mouth."
else
improv = TRUE
if(improv)
@@ -150,7 +150,7 @@
genital = check
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
else
- message = "forces [u_His] [genital_name] deep down \the [partner]'s throat"
+ message = "forces [u_His] [genital_name] deep down \the [partner]'s throat."
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
if(check)
genital = check
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm
index 14ed43017f..460812fd4b 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/fuck.dm
@@ -15,7 +15,7 @@
if(user.is_fucking(partner, CUM_TARGET_VAGINA))
message = "[pick(
"pounds \the [partner]'s pussy.",
- "shoves [u_His] [genital_name] deep into \the [partner]'s pussy",
+ "shoves [u_His] [genital_name] deep into \the [partner]'s pussy.",
"thrusts in and out of \the [partner]'s cunt.",
"goes balls deep into \the [partner]'s pussy over and over again.")]"
else
@@ -23,7 +23,7 @@
user.set_is_fucking(partner, CUM_TARGET_VAGINA, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/champ1.ogg',
- 'modular_sand/sound/interactions/champ2.ogg'), 50, 1, -1)
+ 'modular_sand/sound/interactions/champ2.ogg'), 70, 1, -1)
user.visible_message(span_lewd("\The [user] [message]"), ignored_mobs = user.get_unconsenting())
if(user.can_penetrating_genital_cum())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner, ORGAN_SLOT_PENIS) //SPLURT edit
@@ -74,7 +74,7 @@
var/genital_name = user.get_penetrating_genital_name()
if(user.is_fucking(partner, CUM_TARGET_BREASTS))
- message = "[pick("fucks \the [partner]'s' breasts.",
+ message = "[pick("fucks \the [partner]'s breasts.",
"grinds [u_His] [genital_name] between \the [partner]'s boobs.",
"thrusts into \the [partner]'s tits.",
"grabs \the [partner]'s breasts together and presses [u_His] [genital_name] between them.")]"
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm
index ede0c0ca04..de5675734d 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/mount.dm
@@ -12,7 +12,7 @@
if(partner.is_fucking(user, CUM_TARGET_VAGINA))
message = "[pick("rides \the [partner]'s [genital_name].",
- "forces [partner]'s [genital_name] on [u_His] pussy")]"
+ "forces [partner]'s [genital_name] on [u_His] pussy.")]"
else
message = "slides [u_His] pussy onto \the [partner]'s [genital_name]."
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_PENIS))
@@ -38,7 +38,7 @@
if(partner.is_fucking(user, CUM_TARGET_ANUS))
message = "[pick("rides \the [partner]'s [genital_name].",
- "forces [partner]'s [genital_name] on [u_His] ass")]"
+ "forces [partner]'s [genital_name] on [u_His] ass.")]"
else
message = "lowers [u_His] ass onto \the [partner]'s [genital_name]."
partner.set_is_fucking(user, CUM_TARGET_ANUS, partner.getorganslot(ORGAN_SLOT_PENIS))
@@ -68,7 +68,7 @@
else
message = "[pick(
"grabs the back of \the [partner]'s head and forces it into [u_His] asscheeks.",
- "squats down and plants [u_His] ass right on \the [partner]'s face")]"
+ "squats down and plants [u_His] ass right on \the [partner]'s face.")]"
user.set_is_fucking(partner, GRINDING_FACE_WITH_ANUS, null)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg',
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
index 67738e7c0d..b9991235cf 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm
@@ -102,9 +102,9 @@
var/milktext = milk.name
lines = list(
- "brings [u_His] own milk tanks to [u_His] mouth and sucks deeply into them",
- "takes a big sip of [u_His] own fresh [lowertext(milktext)]",
- "fills [u_His] own mouth with a big gulp of [u_His] warm [lowertext(milktext)]"
+ "brings [u_His] own milk tanks to [u_His] mouth and sucks deeply into them.",
+ "takes a big sip of [u_His] own fresh [lowertext(milktext)].",
+ "fills [u_His] own mouth with a big gulp of [u_His] warm [lowertext(milktext)]."
)
message = span_lewd("\The [user] [pick(lines)]")
diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
index 52160d03d0..3e4948ff85 100644
--- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm
+++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
@@ -125,7 +125,7 @@
gut.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS), target_orifice)
if(CUM_TARGET_ARMPIT)
- message = "cums under \the [partner]'s armpit"
+ message = "cums under \the [partner]'s armpit!"
if(CUM_TARGET_MOUTH, CUM_TARGET_THROAT, CUM_TARGET_VAGINA, CUM_TARGET_ANUS)
if(c_partner)
@@ -219,7 +219,7 @@
'modular_sand/sound/interactions/final_m2.ogg',
'modular_sand/sound/interactions/final_m3.ogg',
'modular_sand/sound/interactions/final_m4.ogg',
- 'modular_sand/sound/interactions/final_m5.ogg'), 90, 1, 0)
+ 'modular_sand/sound/interactions/final_m5.ogg'), 70, 1, 0)
else if(gender == FEMALE)
playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_f1.ogg',
'modular_sand/sound/interactions/final_f2.ogg',
@@ -286,7 +286,7 @@
if(istype(src, /mob/living)) // Argh.
var/mob/living/H = src
H.adjustOxyLoss(3)
- message = "sucks [t_Him]self off"
+ message = "sucks [t_Him]self off."
lust_increase += 5
else
var/improv = FALSE
@@ -449,7 +449,7 @@
if(is_fucking(partner, CUM_TARGET_BELLY))
message = "[pick(
"pounds \the [partner]'s belly.",
- "shoves their [genital_name] deep into \the [partner]'s soft tummy",
+ "shoves their [genital_name] deep into \the [partner]'s soft tummy.",
"thrusts in and out of \the [partner]'s navel.",
"goes balls deep into \the [partner]'s gut over and over again.")]"
else
@@ -467,9 +467,9 @@
var/message
var/u_His = p_their()
var/list/lines = list(
- "squishes [target]'s face [pick(list("in between", "with"))] [u_His] [pick(GLOB.breast_nouns)]",
- "presses [u_His] [pick(GLOB.breast_nouns)] into \the [target]'s face",
- "shoves \the [target]'s whole head into [u_His] cleavage"
+ "squishes [target]'s face [pick(list("in between", "with"))] [u_His] [pick(GLOB.breast_nouns)].",
+ "presses [u_His] [pick(GLOB.breast_nouns)] into \the [target]'s face.",
+ "shoves \the [target]'s whole head into [u_His] cleavage."
)
message = span_lewd("\The [src] [pick(lines)]")
@@ -481,10 +481,10 @@
/mob/living/proc/lick_sweat(mob/living/target)
var/message
var/t_His = target.p_their()
- var/list/lines = list("licks \the [target]'s sweat off [t_His] body",
- "slurps the salty sweat running through [target]'s skin",
- "has a nice taste of \the [target]'s drenched body",
- "takes a whiff of \the [target]'s musk and drinks [t_His] warm sweat")
+ var/list/lines = list("licks \the [target]'s sweat off [t_His] body.",
+ "slurps the salty sweat running through [target]'s skin.",
+ "has a nice taste of \the [target]'s drenched body.",
+ "takes a whiff of \the [target]'s musk and drinks [t_His] warm sweat.")
message = span_lewd("\The [src] [pick(lines)]")
visible_message(message, ignored_mobs = get_unconsenting())
@@ -495,9 +495,9 @@
var/u_His = p_their()
var/list/musk = list("musky ", "sweaty ", "damp ", "smelly ", "")
var/list/lines = list(
- "shoves \the [target]'s face in [u_His] [pick(musk)] armpit",
- "squeezes \the [target]'s nose under [u_His] [pick(musk)] pit",
- "makes sure to squeeze \the [target]'s face well under [u_His] [pick(musk)] armpit and let them take a whiff"
+ "shoves \the [target]'s face in [u_His] [pick(musk)] armpit.",
+ "squeezes \the [target]'s nose under [u_His] [pick(musk)] pit.",
+ "makes sure to squeeze \the [target]'s face well under [u_His] [pick(musk)] armpit and let them take a whiff."
)
message = span_lewd("\The [src] [pick(lines)]")
@@ -513,8 +513,8 @@
var/list/musk = list("musky ", "sweaty ", "damp ", "smelly ", "")
var/list/lines = list(
"shoves [u_His] nose deep into \the [target]'s armpit, giving it a big [pick(list("whiff", "lick", "nuzzle"))].",
- "presses [u_His] face under \the [target]'s [pick(musk)] pit, [pick(list("tasting and lapping it all over", "sniffing its scent"))]",
- "goes face deep into \the [target] [pick(musk)] armpit, worshipping it with [u_His] tongue and nose"
+ "presses [u_His] face under \the [target]'s [pick(musk)] pit, [pick(list("tasting and lapping it all over", "sniffing its scent"))].",
+ "goes face deep into \the [target] [pick(musk)] armpit, worshipping it with [u_His] tongue and nose."
)
message = span_lewd("\The [src] [pick(lines)]")
@@ -534,14 +534,14 @@
if(is_fucking(target, CUM_TARGET_ARMPIT))
lines = list(
- " slides [u_His] [genital_name] back and forth under \the [target]'s [pick(musk)] armpit",
- "'s [genital_name] drools pre all over \the [target]'s [pick(musk)] armpit, thoroughly fucking its warm embrace",
- " shoves [u_His] [genital_name] under \the [target]'s arm, using [t_His] [pick(musk)] pit like a fleshlight"
+ " slides [u_His] [genital_name] back and forth under \the [target]'s [pick(musk)]armpit.",
+ "'s [genital_name] drools pre all over \the [target]'s [pick(musk)]armpit, thoroughly fucking its warm embrace.",
+ " shoves [u_His] [genital_name] under \the [target]'s arm, using [t_His] [pick(musk)]pit like a fleshlight."
)
else
if(target.is_topless())
lines = list(
- " presents [u_His] [genital_name] to \the [target]'s [pick(musk)] armpit, beginning to thrust its whole length right under [t_His] arm!"
+ " presents [u_His] [genital_name] to \the [target]'s [pick(musk)]armpit, beginning to thrust its whole length right under [t_His] arm!"
)
else // https://cdn.discordapp.com/attachments/802990353883070474/962478553117622322/NoName-480p.mp4
lines = list(
@@ -598,15 +598,15 @@
if(target.is_fucking(src, CUM_TARGET_BREASTS))
lines = list(
- "slides [u_His] [pick(GLOB.breast_nouns)], up and down through \the [target]'s throbbing [genital_name]",
- "squeezes [u_His] [pick(GLOB.breast_nouns)] through all of \the [target]'s length",
- "jerks \the [target] off lustfully with [u_His] supple [pick(GLOB.breast_nouns)]"
+ "slides [u_His] [pick(GLOB.breast_nouns)], up and down through \the [target]'s throbbing [genital_name].",
+ "squeezes [u_His] [pick(GLOB.breast_nouns)] through all of \the [target]'s length.",
+ "jerks \the [target] off lustfully with [u_His] supple [pick(GLOB.breast_nouns)]."
)
else
lines = list(
- "clamps [u_His] [pick(GLOB.breast_nouns)] around \the [target]'s throbbing [genital_name], wrapping it in their sheer warmth",
- "envelops \the [target]'s hard member with [u_His] soft [pick(GLOB.breast_nouns)], giving it a tight and sloshing squeeze",
- "lets [u_His] [pick(GLOB.breast_nouns)] fall into \the [target]'s fat [genital_name], smothering it in [u_His] cleavage"
+ "clamps [u_His] [pick(GLOB.breast_nouns)] around \the [target]'s throbbing [genital_name], wrapping it in their sheer warmth.",
+ "envelops \the [target]'s hard member with [u_His] soft [pick(GLOB.breast_nouns)], giving it a tight and sloshing squeeze.",
+ "lets [u_His] [pick(GLOB.breast_nouns)] fall into \the [target]'s fat [genital_name], smothering it in [u_His] cleavage."
)
target.set_is_fucking(src, CUM_TARGET_BREASTS, getorganslot(ORGAN_SLOT_PENIS))
@@ -628,15 +628,15 @@
if(target.is_fucking(src, NUTS_TO_FACE))
lines = list(
- "worships \the [target]'s [pick(balls)] with [u_His] tongue",
- "takes a huff of \the [target]'s heavy ball musk and proceeds to lap the sweat off [t_His] [pick(balls)]",
- "plants smooches all over \the [target]'s heavy [pick(balls)], tasting [t_His] nutsack and massaging it with [u_His] lips"
+ "worships \the [target]'s [pick(balls)] with [u_His] tongue.",
+ "takes a huff of \the [target]'s heavy ball musk and proceeds to lap the sweat off [t_His] [pick(balls)].",
+ "plants smooches all over \the [target]'s heavy [pick(balls)], tasting [t_His] nutsack and massaging it with [u_His] lips."
)
else
lines = list(
- "opens [u_His] maw and proceeds to bring \the [target]'s [pick(balls)] right in",
- "uses [u_His] tongue to fit \the [target]'s balls in [u_His] mouth, deeply huffing their scent",
- "willingly lets \the [target]'s [pick(balls)] fall into and fill [u_His] mouth, lustfully sucking into them"
+ "opens [u_His] maw and proceeds to bring \the [target]'s [pick(balls)] right in.",
+ "uses [u_His] tongue to fit \the [target]'s balls in [u_His] mouth, deeply huffing their scent.",
+ "willingly lets \the [target]'s [pick(balls)] fall into and fill [u_His] mouth, lustfully sucking into them."
)
target.set_is_fucking(src, NUTS_TO_FACE, getorganslot(ORGAN_SLOT_PENIS))
@@ -662,15 +662,15 @@
if(is_fucking(target, CUM_TARGET_URETHRA))
lines = list(
- "humps right into \the [target]'s [t_genital_name], stretching it as their balls slam together",
+ "humps right into \the [target]'s [t_genital_name], stretching it as their balls slam together!",
"slides [u_His] [u_genital_name] all the way down \the [target]'s own throbbing [t_genital_name], [t_His] urethra is so tight!",
- "rams [u_His] [u_genital_name] back and forth through \the [target]'s urethra, giving it a very nice fucking"
+ "rams [u_His] [u_genital_name] back and forth through \the [target]'s urethra, giving it a very eager fucking!"
)
else
lines = list(
- "'s tip gently smooches \the [target]'s, right before forcing its way right down [t_His] dickhole",
- "grinds [u_His] tip against \the [target]'s [t_genital_name], only to slide [u_His] whole [ui_ai_alerts] all the way down to [t_His] base",
- "makes \the [target]'s fat [t_genital_name] stretch and throb as the size of [u_His] [u_genital_name] makes its way right in"
+ "'s tip gently smooches \the [target]'s, right before forcing its way right down [t_His] dickhole.",
+ "grinds [u_His] tip against \the [target]'s [t_genital_name], only to slide [u_His] whole [ui_ai_alerts] all the way down to [t_His] base.",
+ "makes \the [target]'s fat [t_genital_name] stretch and throb as the size of [u_His] [u_genital_name] makes its way right in."
)
set_is_fucking(target, CUM_TARGET_URETHRA, getorganslot(ORGAN_SLOT_PENIS))
@@ -697,7 +697,7 @@
else if(target.has_breasts(REQUIRE_EXPOSED))
lines = list(
"presses [u_His] throbbing tip against \the [target]'s puffy nipple, forcing the whole length all the way in with a wet smack",
- "stretches \the [target]'s nipple with his fingers, before forcing it open with the whole girth of [u_His] twitching [genital_name]"
+ "stretches \the [target]'s nipple with [u_His] fingers, before forcing it open with the whole girth of [u_His] twitching [genital_name]"
)
else
lines = list(
@@ -733,7 +733,7 @@
)
else
lines = list(
- "presses [u_His] tip against \the [target]'s [pick("pudgy ", "soft ", "")] thighs, soon shoving [u_His] whole length right in between them",
+ "presses [u_His] tip against \the [target]'s [pick("pudgy ", "soft ", "")]thighs, soon shoving [u_His] whole length right in between them",
"presents [u_His] [genital_name] to \the [target]'s legs, ramming its full size right into [t_His] thigh lock",
"smooches \the [target]'s crotch with [u_His] throbbing tip, right before piercing between [t_His] thighs with [u_His] full [genital_name]"
)
@@ -758,15 +758,15 @@
if(target.is_fucking(src, CUM_TARGET_THIGHS))
lines = list(
- "grinds and presses [u_His] thighs [pick("deeply ", "")] against \the [target]'s [genital_name], massaging it all over with [u_His] thighs",
- "squeezes \the [target]'s [genital_name] between [u_His] supple thighs, smothering it deep under [u_His] crotch",
- "rides \the [target]'s [genital_name] with [u_His] [pick("pudgy ", "soft ", "")]thighs, [t_He] can feel [u_His] flesh smothering it down"
+ "grinds and presses [u_His] thighs [pick("deeply ", "")] against \the [target]'s [genital_name], massaging it all over with [u_His] thighs.",
+ "squeezes \the [target]'s [genital_name] between [u_His] supple thighs, smothering it deep under [u_His] crotch.",
+ "rides \the [target]'s [genital_name] with [u_His] [pick("pudgy ", "soft ", "")]thighs, [t_He] can feel [u_His] flesh smothering it down."
)
else
lines = list(
- "presents [u_His] [pick("pudgy ", "soft ", "")] thighs to \the [target]'s [genital_name], slamming them right into it[pick(" with a [pick("wet ", "")]smack", "")]",
- "grinds \the [target]'s tip against [u_His] supple thighs, before slamming them right down into [t_His] [genital_name]",
- "forces \the [target]'s [genital_name] right into the tight hold of [u_His] thighs, giving it a deep and lewd squeeze"
+ "presents [u_His] [pick("pudgy ", "soft ", "")] thighs to \the [target]'s [genital_name], slamming them right into it[pick(" with a [pick("wet ", "")]smack", "")]!",
+ "grinds \the [target]'s tip against [u_His] supple thighs, before slamming them right down into [t_His] [genital_name]!",
+ "forces \the [target]'s [genital_name] right into the tight hold of [u_His] thighs, giving it a deep and lewd squeeze!"
)
target.set_is_fucking(src, CUM_TARGET_THIGHS, target.getorganslot(ORGAN_SLOT_PENIS))
diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm
index 455fc926c8..0e127ec9d5 100644
--- a/modular_splurt/code/datums/traits/good.dm
+++ b/modular_splurt/code/datums/traits/good.dm
@@ -1,7 +1,7 @@
/datum/quirk/tough
name = "Tough"
desc = "Your body is abnormally enduring and can take 10% more damage."
- value = 4
+ value = 2
medical_record_text = "Patient has an abnormally high capacity for injury."
gain_text = span_notice("You feel very sturdy.")
lose_text = span_notice("You feel less sturdy.")
diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm
index af515414ba..8e080cc8d8 100644
--- a/modular_splurt/code/datums/traits/neutral.dm
+++ b/modular_splurt/code/datums/traits/neutral.dm
@@ -44,6 +44,21 @@
lose_text = span_notice("Having your head pet doesn't sound so bad right about now...")
medical_record_text = "Patient cares little with or dislikes being touched."
+/datum/quirk/headpat_hater/add()
+
+ var/mob/living/carbon/human/quirk_mob = quirk_holder
+
+ var/datum/action/cooldown/toggle_distant/act_toggle = new
+ act_toggle.Grant(quirk_mob)
+
+/datum/quirk/headpat_hater/remove()
+
+ var/mob/living/carbon/human/quirk_mob = quirk_holder
+
+ var/datum/action/cooldown/toggle_distant/act_toggle = locate() in quirk_mob.actions
+ if(act_toggle)
+ act_toggle.Remove(quirk_mob)
+
/datum/quirk/headpat_slut
name = "Headpat Slut"
desc = "You love the feeling of others touching your head! Maybe a little too much, actually... Others patting your head will provide a bigger mood boost and cause aroused reactions."
diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm
index 4b62fc2631..43164bf538 100644
--- a/modular_splurt/code/datums/traits/trait_actions.dm
+++ b/modular_splurt/code/datums/traits/trait_actions.dm
@@ -1494,10 +1494,10 @@
button_icon_state = "blank"
// Glow color to use
- var/glow_color = "#39ff14" // Neon green
+ var/glow_color
// Thickness of glow outline
- var/glow_range = 1 //Less than radfiend
+ var/glow_range
/datum/action/cosglow/update_glow/Grant()
@@ -1691,5 +1691,25 @@
to_chat(U, span_warning("You and [C] must both stand still for you to remove one of their limbs!"))
return
+/datum/action/cooldown/toggle_distant
+ name = "Toggle Distant"
+ desc = "Allows you to let your headpat-guard down, or put it back up."
+ icon_icon = 'modular_splurt/icons/mob/actions/lewd_actions/lewd_icons.dmi'
+ button_icon_state = "pain_max"
+
+/datum/action/cooldown/toggle_distant/Trigger()
+ . = ..()
+ if(!.)
+ return
+
+ var/mob/living/carbon/human/action_owner = owner
+
+ if(HAS_TRAIT(action_owner, TRAIT_DISTANT))
+ REMOVE_TRAIT(action_owner, TRAIT_DISTANT, ROUNDSTART_TRAIT)
+ to_chat(action_owner, span_notice("You let your headpat-guard down!"))
+ else
+ ADD_TRAIT(action_owner, TRAIT_DISTANT, ROUNDSTART_TRAIT)
+ to_chat(action_owner, span_warning("You let your headpat-guard up!"))
+
#undef HYPNOEYES_COOLDOWN_NORMAL
#undef HYPNOEYES_COOLDOWN_BRAINWASH
diff --git a/modular_splurt/code/modules/client/loadout/socks.dm b/modular_splurt/code/modules/client/loadout/socks.dm
index d44e772163..0d48b6707c 100644
--- a/modular_splurt/code/modules/client/loadout/socks.dm
+++ b/modular_splurt/code/modules/client/loadout/socks.dm
@@ -2,7 +2,7 @@
name = "Cow Thigh High Socks"
path = /obj/item/clothing/underwear/socks/thigh/thigh_cow
-/datum/gear/socks/thigh/thigh_cow
+/datum/gear/socks/thigh/fishnet
name = "Fishnet tights"
path = /obj/item/clothing/underwear/socks/thigh/fishnet/white //This one is pretty much greyscale aka easier to recolor
diff --git a/modular_splurt/code/modules/client/loadout/uniform.dm b/modular_splurt/code/modules/client/loadout/uniform.dm
index fedfbf61bc..4b39e33675 100644
--- a/modular_splurt/code/modules/client/loadout/uniform.dm
+++ b/modular_splurt/code/modules/client/loadout/uniform.dm
@@ -40,6 +40,10 @@
name = "Performers one piece"
path = /obj/item/clothing/under/performer
+/datum/gear/uniform/blutigen_undergarment
+ name = "Blutigen Undergarments"
+ path = /obj/item/clothing/under/blutigen_undergarment
+
// Suggestion #151
/datum/gear/uniform/waiter
name = "waiter's outfit"
diff --git a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm
index d34201e7a8..caf6cc6a47 100644
--- a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm
+++ b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm
@@ -1,11 +1,15 @@
//Main code edits
/obj/item/clothing/mask/muzzle/attack_hand(mob/user, act_intent, attackchain_flags)
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(src == C.wear_mask)
- to_chat(user, span_warning("You need help taking this off!"))
- return
- ..()
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(src == C.wear_mask)
+ if(seamless)
+ to_chat(user, span_warning("You need help taking this off!"))
+ return
+ else
+ if(!do_after(C, 60, target = src))
+ return
+ ..()
//Own stuff
diff --git a/modular_splurt/code/modules/clothing/under/miscellaneous.dm b/modular_splurt/code/modules/clothing/under/miscellaneous.dm
index 9774f6f28c..82c53a84e0 100644
--- a/modular_splurt/code/modules/clothing/under/miscellaneous.dm
+++ b/modular_splurt/code/modules/clothing/under/miscellaneous.dm
@@ -87,6 +87,17 @@
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
body_parts_covered = CHEST
+/obj/item/clothing/under/blutigen_undergarment
+ name = "Blutigen Undergarments"
+ desc = "It'd barely cover your chest and groin."
+ icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi'
+ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi'
+ icon_state = "blutigen_undergarment"
+ item_state = "blutigen_undergarment"
+ can_adjust = FALSE
+ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+ body_parts_covered = CHEST
+
/obj/item/clothing/under/bunnysuit/white
name = "white bunny outfit"
desc = "A simple white bunny outfit."
diff --git a/modular_splurt/code/modules/mob/living/living.dm b/modular_splurt/code/modules/mob/living/living.dm
index a34675b9a3..2638d8e6c6 100644
--- a/modular_splurt/code/modules/mob/living/living.dm
+++ b/modular_splurt/code/modules/mob/living/living.dm
@@ -9,26 +9,36 @@
to_chat(usr, span_warning("You cannot toggle your gender while unconcious!"))
return
- var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female", "None", "Toggle Breasts"))
+ var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female", "None", "Toggle Breasts", "Toggle Penis", "Toggle Pussy", "Toggle Balls"))
switch(choice)
if("Both")
has_penis = TRUE
has_balls = TRUE
has_vagina = TRUE
+ gender = PLURAL
if("Male")
has_penis = TRUE
has_balls = TRUE
has_vagina = FALSE
+ gender = MALE
if("Female")
has_penis = FALSE
has_balls = FALSE
has_vagina = TRUE
+ gender = FEMALE
if("None")
has_penis = FALSE
has_balls = FALSE
has_vagina = FALSE
+ gender = NEUTER
if("Toggle Breasts") // Idea/Initial code by @LunarFleet (github)
has_breasts = !has_breasts // Simplified line by @Zirok-BYOND (github)
+ if("Toggle Penis")
+ has_penis = !has_penis
+ if("Toggle Pussy")
+ has_vagina = !has_vagina
+ if("Toggle Balls")
+ has_balls = !has_balls
/// Toggle admin frozen
/mob/living/proc/toggle_admin_freeze(client/admin)
diff --git a/modular_splurt/icons/mob/clothing/uniform.dmi b/modular_splurt/icons/mob/clothing/uniform.dmi
index 38de7053ca..559b834879 100644
Binary files a/modular_splurt/icons/mob/clothing/uniform.dmi and b/modular_splurt/icons/mob/clothing/uniform.dmi differ
diff --git a/modular_splurt/icons/obj/clothing/uniforms.dmi b/modular_splurt/icons/obj/clothing/uniforms.dmi
index 3b185d8527..ce39086b59 100644
Binary files a/modular_splurt/icons/obj/clothing/uniforms.dmi and b/modular_splurt/icons/obj/clothing/uniforms.dmi differ