diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 920a93a90675..4638476691f1 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -202,6 +202,7 @@
#define TRAIT_NEVERBONER "never_aroused"
#define TRAIT_NYMPHO "nymphomaniac"
#define TRAIT_MASO "masochism"
+#define TRAIT_HAIR_TRIGGER "hair_trigger"
#define TRAIT_HIGH_BLOOD "high_blood"
#define TRAIT_PARA "paraplegic"
#define TRAIT_EMPATH "empath"
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 709d558a4203..e59522507f73 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -122,6 +122,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER,
"TRAIT_MUSICIAN" = TRAIT_MUSICIAN,
"TRAIT_MASO" = TRAIT_MASO,
+ "TRAIT_HAIR_TRIGGER" = TRAIT_HAIR_TRIGGER,
"TRAIT_HIGH_BLOOD" = TRAIT_HIGH_BLOOD,
"TRAIT_EMPATH" = TRAIT_EMPATH,
"TRAIT_FRIENDLY" = TRAIT_FRIENDLY,
diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm
index 643dfeafb80b..e4eaad96920c 100644
--- a/modular_sand/code/datums/interactions/lewd_definitions.dm
+++ b/modular_sand/code/datums/interactions/lewd_definitions.dm
@@ -34,6 +34,7 @@
var/lastlusttime = 0
var/lust = 0
var/multiorgasms = 1
+ var/hair_trigger_mul = 1
COOLDOWN_DECLARE(refractory_period)
COOLDOWN_DECLARE(last_interaction_time)
var/datum/interaction/lewd/last_lewd_datum //Recording our last lewd datum allows us to do stuff like custom cum messages.
@@ -65,10 +66,11 @@
/mob/living/proc/add_lust(add)
var/cur = get_lust() //GetLust handles per-time lust loss
- if((cur + add) < 0) //in case we retract lust
+ if((cur + add) < 0) //in case we retract lust, doesn't have to account for hair trigger, since we aren't multiplying with a negative
lust = 0
else
- lust = cur + add
+ lust = cur + add * hair_trigger_mul
+
/mob/living/proc/get_lust()
diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm
index 44a529dd064c..8500f5c8311e 100644
--- a/modular_splurt/code/datums/traits/neutral.dm
+++ b/modular_splurt/code/datums/traits/neutral.dm
@@ -820,3 +820,55 @@
var/obj/item/clothing/mask/gas/cosmetic/gasmask = new(get_turf(quirk_holder)) // Uses a custom gas mask
H.equip_to_slot(gasmask, ITEM_SLOT_MASK)
H.regenerate_icons()
+
+/datum/quirk/prem
+ name = "Hair Trigger"
+ desc = "Your libido is hyperactive to the point where the slightest of sexual stimuli can set you off. Much to your misfortune (or fortune), there is plenty of that around here!"
+ value = 0
+ mob_trait = TRAIT_HAIR_TRIGGER
+ gain_text = "You could cum at any given moment."
+ lose_text = "Your hypersensitivity to arousal fades."
+ var/sexword_delay = 0
+
+/datum/quirk/prem/add()
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/quirk_examine_prem)
+ RegisterSignal(quirk_holder, COMSIG_MOVABLE_HEAR, .proc/hear_teasing)
+ var/mob/living/carbon/human/H = quirk_holder
+ H.hair_trigger_mul = 5 // the multiplier for how much lust should be added. by default this is a three and therefore quintuplicates the lust you get from interactions
+
+/datum/quirk/prem/remove()
+ UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(quirk_holder, COMSIG_MOVABLE_HEAR)
+ var/mob/living/carbon/human/H = quirk_holder
+ if(!H)
+ return
+ H.hair_trigger_mul = 1 // this should always be one, if it isn't, arousal related stuff might break
+
+/datum/quirk/prem/proc/quirk_examine_prem(atom/examine_target, mob/living/carbon/human/examiner, list/examine_list)
+ SIGNAL_HANDLER
+
+ var/mob/living/carbon/human/H = examine_target
+ if(!istype(examiner) || H.get_lust() < 10) // if the target is horny, people WILL notice it
+ return
+ examine_list += span_lewd("[H.p_they(TRUE)] [H.p_are()] fidgeting with arousal.")
+
+/datum/quirk/prem/proc/hear_teasing(datum/source, list/hearing_args)
+ SIGNAL_HANDLER
+
+ var/mob/living/carbon/human/H = quirk_holder
+ var/static/regex/sexywords = regex("sex|fuck|hump|dick|cock|penis|pussy|clit|cum|jizz|orgasm|spurt")
+ var/list/nnngh = list(
+ "Hearing that really got you going...",
+ "Calm down... it's just words...",
+ "That sounds exciting...",
+ "It's hard to keep your composure with that kinda talk!",
+ )
+ if (H == hearing_args[HEARING_SPEAKER])
+ return
+ if (findtext(lowertext(hearing_args[HEARING_RAW_MESSAGE]), sexywords) && sexword_delay < world.time)
+ H.handle_post_sex(5, null, null)
+ sexword_delay = world.time + 10 SECONDS
+ spawn(2) // this is just for aesthetics so the notification is placed after the message in chatbox, if it causes issues feel free to remove :dawgdoin:
+ to_chat(H, span_lewd(pick(nnngh)))
+