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))) +