Changes some lewd stuff (#244)

* Upload files

* bad practices
This commit is contained in:
SandPoot
2022-04-10 22:34:47 -03:00
committed by GitHub
parent 5988a8cca6
commit 7aa54845d7
27 changed files with 1681 additions and 1784 deletions
+26
View File
@@ -9,3 +9,29 @@ GLOBAL_LIST_INIT(lewd_prefs_choices, list(
"Ask",
"No"
))
#define CUM_TARGET_MOUTH "mouth"
#define CUM_TARGET_THROAT "throat"
#define CUM_TARGET_VAGINA "vagina"
#define CUM_TARGET_ANUS "anus"
#define CUM_TARGET_HAND "hand"
#define CUM_TARGET_BREASTS "breasts"
#define CUM_TARGET_FEET "feet"
#define CUM_TARGET_PENIS "penis"
//Weird defines go here
#define CUM_TARGET_EARS "ears"
#define CUM_TARGET_EYES "eyes"
//
#define GRINDING_FACE_WITH_ANUS "faceanus"
#define GRINDING_FACE_WITH_FEET "facefeet"
#define GRINDING_MOUTH_WITH_FEET "mouthfeet"
#define THIGH_SMOTHERING "thigh_smother"
#define NUTS_TO_FACE "nut_face"
#define NORMAL_LUST 10
#define LOW_LUST 1
#define REQUIRE_NONE 0
#define REQUIRE_EXPOSED 1
#define REQUIRE_UNEXPOSED 2
#define REQUIRE_ANY 3
@@ -1,36 +1,14 @@
/mob/living/proc/has_hands()
return FALSE
/mob/living/has_hands()
return TRUE
/mob/living/proc/has_mouth()
return TRUE
/mob/living/proc/mouth_is_free()
return TRUE
return !is_mouth_covered()
/mob/living/proc/foot_is_free()
return TRUE
return is_barefoot()
/mob/living/carbon/human/has_mouth()
var/obj/item/bodypart/head/headass
for(var/obj/item/bodypart/head/shoeonhead in bodyparts)
headass = shoeonhead
if(headass)
return TRUE
return FALSE
/mob/living/mouth_is_free()
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
return !H.wear_mask
else
return TRUE
/mob/living/foot_is_free()
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
return !H.shoes
else
return TRUE
return get_bodypart(BODY_ZONE_HEAD)
File diff suppressed because it is too large Load Diff
@@ -1,123 +0,0 @@
/mob/living/proc/do_frot(mob/living/target)
var/message
var/t_His = p_their()
message = "rubs [t_His] penis against [target]'s."
set_is_fucking(target, CUM_TARGET_PENIS, getorganslot(ORGAN_SLOT_PENIS))
visible_message("<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, target)
target.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, src)
/mob/living/proc/do_breastfeed(mob/living/target)
var/message
var/u_His = p_their()
var/u_He = p_they()
var/t_His = target.p_their()
var/obj/item/organ/genital/breasts/milkers = getorganslot(ORGAN_SLOT_BREASTS)
var/milktype = milkers?.fluid_id
var/modifier
var/list/lines
if(!milkers || !milktype)
return
var/datum/reagent/b_fluid = new milktype
if(target == src)
lines = list(
"brings [u_His] own milktanks to [u_His] mouth and sucks deeply into them",
"takes a big sip of [u_His] own fresh [b_fluid.name]",
"fills [u_His] own mouth with a big gulp of [u_His] warm [b_fluid.name]"
)
else
lines = list(
"pushes [u_His] breasts against \the <b>[target]</b>'s mouth, squirting [u_His] warm [b_fluid.name] into [t_His] mouth",
"fills \the <b>[target]</b>'s mouth with warm, sweet [b_fluid.name] as [u_He] squeezes [u_His] boobs, panting",
"lets a large stream of [u_His] own abundant [b_fluid.name] coat the back of \the <b>[target]</b>'s throat"
)
message = "<span class='lewd'>\The <b>[src]</b> [pick(lines)]</span>"
visible_message(message, ignored_mobs = get_unconsenting())
playlewdinteractionsound(src, pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
switch(milkers.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(milkers.size in milkers.breast_values)
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
else
modifier = 1
target.reagents.add_reagent(milktype, rand(1,3 * modifier))
/mob/living/proc/do_jackoff(mob/living/user)
var/message
var/t_His = p_their()
var/t_Him = p_them()
if(user.is_fucking(src, CUM_TARGET_HAND))
message = "[pick("jerks [t_Him]self off.",
"works [t_His] shaft.",
"strokes [t_His] penis.",
"wanks [t_His] cock hard.")]"
else
message = "[pick("wraps [t_His] hand around [t_His] cock.",
"starts to stroke [t_His] cock.",
"starts playing with [t_His] cock.")]"
user.set_is_fucking(src, CUM_TARGET_HAND, user.getorganslot(ORGAN_SLOT_PENIS) ? user.getorganslot(ORGAN_SLOT_PENIS) : null)
playlewdinteractionsound(src, pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
visible_message(message = "<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
/mob/living/proc/do_fingerass_self(mob/living/user)
var/t_His = p_their()
var/t_Him = p_them()
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("fingers [t_Him]self.",
"fingers [t_His] asshole.",
"fingers [t_Him]self hard.")]</span>", ignored_mobs = get_unconsenting())
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
/mob/living/proc/do_fingering_self(mob/living/user)
var/t_His = p_their()
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("fingers [t_His] pussy deep.",
"fingers [t_His] pussy.",
"plays with [t_His] pussy.",
"fingers [t_His] own pussy hard.")]</span>", ignored_mobs = get_unconsenting())
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
/mob/living/proc/do_titgrope_self(mob/living/user)
var/message
var/t_His = p_their()
if(user.a_intent == INTENT_HARM)
message = "[pick("aggressively gropes [t_His] breast.",
"grabs [t_His] breasts.",
"tightly squeezes [t_His] breasts.",
"slaps at [t_His] breasts.",
"gropes [t_His] breasts roughly.")]"
else
message = "[pick("gently gropes [t_His] breast.",
"softly squeezes [t_His] breasts.",
"grips [t_His] breasts.",
"runs a few fingers over [t_His] breast.",
"delicately teases [t_His] nipple.",
"traces a touch across [t_His] breast.")]"
if(prob(5 + user.get_lust()))
visible_message(message = "<span class='lewd'><b>\The [src]</b> [pick("shivers in arousal.",
"moans quietly.",
"breathes out a soft moan.",
"gasps.",
"shudders softly.",
"trembles as [t_His] hands run across bare skin.")]</span>")
visible_message(message = "<span class='lewd'><b>\The [src]</b> [message]</span>", ignored_mobs = get_unconsenting())
playlewdinteractionsound(loc, 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, src)
@@ -0,0 +1,114 @@
/datum/interaction/lewd/do_breastfeed
command = "do_breastfeed"
description = "Breastfeed them"
require_user_breasts = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
write_log_user = "breastfed"
write_log_target = "was breastfed by"
interaction_sound = null
/datum/interaction/lewd/do_breastfeed/display_interaction(mob/living/user, mob/living/target)
var/message
var/u_His = user.p_their()
var/u_He = user.p_they()
var/t_His = target.p_their()
var/obj/item/organ/genital/breasts/milkers = user.getorganslot(ORGAN_SLOT_BREASTS)
var/milktype = milkers?.fluid_id
var/modifier
var/list/lines
if(!milkers || !milktype)
return
var/milktext = initial(milktype)
lines = list(
"pushes [u_His] breasts against \the <b>[target]</b>'s mouth, squirting [u_His] warm [lowertext(milktext)] into [t_His] mouth",
"fills \the <b>[target]</b>'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 <b>[target]</b>'s throat"
)
message = "<span class='lewd'>\The <b>[user]</b> [pick(lines)]</span>"
user.visible_message(message, ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
switch(milkers.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(milkers.size in milkers.breast_values)
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
else
modifier = 1
target.reagents.add_reagent(milktype, rand(1,3 * modifier))
/datum/interaction/lewd/titgrope
command = "titgrope"
description = "Grope their breasts."
require_user_hands = TRUE
require_target_breasts = REQUIRE_ANY
write_log_user = "groped"
write_log_target = "was groped by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/titgrope/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
if(user.a_intent == INTENT_HELP)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> gently gropes \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> softly squeezes \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> grips \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> runs a few fingers over \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> delicately teases \the <b>[target]</b>'s nipple.</span>",
"<span class='lewd'>\The <b>[user]</b> traces a touch across \the <b>[target]</b>'s breast.</span>"))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> aggressively gropes \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> grabs \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> tightly squeezes \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> slaps at \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> gropes \the <b>[target]</b>'s breasts roughly.</span>"))
if(prob(5 + target.get_lust()))
if(target.a_intent == INTENT_HELP)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as hands run across bare skin.</span>"))
if(target.get_lust() < 5)
target.set_lust(5)
if(target.a_intent == INTENT_DISARM)
if (target.restrained())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from <b>[user]</b>'s roaming hand.</span>",
"<span class='lewd'>\The <b>[target]</b> thrusts bare breasts forward into <b>[user]</b>'s hands.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully bats at <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> guides <b>[user]</b>'s hand across bare breasts.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly laces a few fingers over <b>[user]</b>'s knuckles.</span>"))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> grips <b>[user]</b>'s wrist tight.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails into <b>[user]</b>'s arm.</span>",
"<span class='lewd'>\The <b>[target]</b> grabs <b>[user]</b>'s wrist for a second.</span>"))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> pushes <b>[user]</b> roughly away.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails angrily into <b>[user]</b>'s arm.</span>",
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s forearm, drawing blood.</span>",
"<span class='lewd'>\The <b>[target]</b> slaps <b>[user]</b>'s hand away.</span>"))
return
@@ -0,0 +1,48 @@
/datum/interaction/lewd/earfuck
command = "earfuck"
description = "Fuck their ear."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_ears = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "earfucked"
write_log_target = "had their ear fucked by"
extreme = TRUE
/datum/interaction/lewd/earfuck/earsocketfuck
command = "earsocketfuck"
description = "Fuck their earsocket."
require_target_ears = null
require_target_earsockets = REQUIRE_EXPOSED
write_log_user = "earsocket fucked"
write_log_target = "had their earsocket fucked by"
/datum/interaction/lewd/earfuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(user.is_fucking(partner, CUM_TARGET_EARS))
message = "[pick(
"pounds into \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"earsocker"].",
"shoves [u_His] dick deep into \the <b>[partner]</b>'s skull",
"thrusts in and out of \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"eyesocket"].",
"goes balls deep into \the <b>[partner]</b>'s cranium over and over again.")]"
var/client/cli = partner.client
var/mob/living/carbon/C = partner
if(cli && istype(C))
if(cli.prefs.extremeharm != "No")
if(prob(15))
C.bleed(2)
if(prob(25))
C.adjustOrganLoss(ORGAN_SLOT_EARS, rand(3,7))
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(3,7))
else
message = "forcefully slides [u_His] cock inside \the <b>[partner]</b>'s [partner.has_ears() ? "ear":"earsocket"]."
user.set_is_fucking(partner, CUM_TARGET_EARS, 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)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting(TRUE))
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EARS, partner)
partner.handle_post_sex(LOW_LUST, null, user)
@@ -0,0 +1,48 @@
/datum/interaction/lewd/eyefuck
command = "eyefuck"
description = "Fuck their eye."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_eyes = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "eyefucked"
write_log_target = "had their eye fucked by"
extreme = TRUE
/datum/interaction/lewd/eyefuck/eyesocketfuck
command = "eyesocketfuck"
description = "Fuck their eyesocket."
require_target_eyes = null
require_target_eyesockets = REQUIRE_EXPOSED
write_log_user = "eyesocketfucked"
write_log_target = "had their eyesocket fucked by"
/datum/interaction/lewd/eyefuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(user.is_fucking(partner, CUM_TARGET_EYES))
message = "[pick(
"pounds into \the <b>[partner]</b>'s [partner.has_eyes() ? "eye":"eyesocket"].",
"shoves [u_His] dick deep into \the <b>[partner]</b>'s skull",
"thrusts in and out of \the <b>[partner]</b>'s [partner.has_eyes() ? "eye":"eyesocket"].",
"goes balls deep into \the <b>[partner]</b>'s cranium over and over again.")]"
var/client/cli = partner.client
var/mob/living/carbon/C = partner
if(cli && istype(C))
if(cli.prefs.extremeharm != "No")
if(prob(15))
C.bleed(2)
if(prob(25))
C.adjustOrganLoss(ORGAN_SLOT_EYES,rand(3,7))
C.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(3,7))
else
message = "forcefully slides [u_His] cock inbetween \the <b>[partner]</b>'s [partner.has_eyes() ? "eyelid":"eyesocket"]."
user.set_is_fucking(partner, CUM_TARGET_EYES, 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)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting(TRUE))
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_EYES, partner)
partner.handle_post_sex(LOW_LUST, null, user)
@@ -0,0 +1,163 @@
/datum/interaction/lewd/facefuck
command = "facefuck"
description = "Fuck their mouth using your penis"
interaction_sound = null
require_target_mouth = TRUE
require_user_penis = REQUIRE_EXPOSED
max_distance = 1
var/fucktarget = "penis"
/datum/interaction/lewd/facefuck/vag
command = "facefuckvag"
description = "Fuck their mouth using your vagina"
require_user_penis = null
require_user_vagina = REQUIRE_EXPOSED
fucktarget = "vagina"
/datum/interaction/lewd/facefuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/obj/item/organ/genital/genital = null
var/retaliation_message = FALSE
var/u_His = user.p_their()
var/t_Him = partner.p_them()
var/t_Hes = partner.p_theyre()
if(user.is_fucking(partner, CUM_TARGET_MOUTH))
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(user.has_vagina())
message = pick(
"grinds [u_His] pussy into \the <b>[partner]</b>'s face.",
"grips the back of \the <b>[partner]</b>'s head, forcing [t_Him] onto [u_His] pussy.",
"rolls [u_His] pussy against \the <b>[partner]</b>'s tongue.",
"slides \the <b>[partner]</b>'s mouth between [u_His] legs.",
"looks \the <b>[partner]</b>'s in the eyes as [u_His] pussy presses into a waiting tongue.",
"sways [u_His] hips, pushing [u_His] sex into \the <b>[partner]</b>'s face.",
)
if(partner.a_intent == INTENT_HARM)
// adjustBruteLoss(5)
retaliation_message = pick(
"looks deeply displeased to be there.",
"struggles to escape from between \the [user]'s thighs.",
)
else
improv = TRUE
if("penis")
if(user.has_penis())
message = pick(
"roughly fucks \the <b>[partner]</b>'s mouth.",
"forces [u_His] cock down \the <b>[partner]</b>'s throat.",
"pushes in against \the <b>[partner]</b>'s tongue until a tight gagging sound comes.",
"grips \the <b>[partner]</b>'s hair and draws [t_Him] to the base of the cock.",
"looks \the <b>[partner]</b>'s in the eyes as [u_His] cock presses into a waiting tongue.",
"rolls [u_His] hips hard, sinking into \the <b>[partner]</b>'s mouth.",
)
if(partner.a_intent == INTENT_HARM)
// adjustBruteLoss(5)
retaliation_message = pick(
"stares up from between \the [user]'s knees, trying to squirm away.",
"struggles to escape from between \the [user]'s legs.",
)
else
improv = TRUE
if(improv)
message = pick(
"grinds against \the <b>[partner]</b>'s face.",
"feels \the <b>[partner]</b>'s face between bare legs.",
"pushes in against \the <b>[partner]</b>'s tongue.",
"grips \the <b>[partner]</b>'s hair, drawing [t_Him] into the strangely sexless spot between [u_His] legs.",
"looks \the <b>[partner]</b>'s in the eyes as [t_Hes] caught beneath two thighs.",
"rolls [u_His] hips hard against \the <b>[partner]</b>'s face.",
)
if(partner.a_intent == INTENT_HARM)
// adjustBruteLoss(5)
retaliation_message = pick(
"stares up from between \the [user]'s knees, trying to squirm away.",
"struggles to escape from between \the [user]'s legs.",
)
else
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(user.has_vagina())
message = "forces \the <b>[partner]</b>'s face into [u_His] pussy."
else
improv = TRUE
if("penis")
if(user.has_penis())
if(user.is_fucking(partner, CUM_TARGET_THROAT))
message = "retracts [u_His] cock from \the <b>[partner]</b>'s throat"
else
message = "shoves [u_His] cock into \the <b>[partner]</b>'s mouth"
else
improv = TRUE
if(improv)
message = "shoves [u_His] crotch into \the <b>[partner]</b>'s face."
else
switch(fucktarget)
if("vagina")
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
if("penis")
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
user.set_is_fucking(partner, CUM_TARGET_MOUTH, genital)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
if(retaliation_message)
user.visible_message("<font color=red><b>\The <b>[partner]</b></b> [retaliation_message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner)
/datum/interaction/lewd/throatfuck
command = "throatfuck"
description = "Fuck their throat. | Does oxy damage."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
/datum/interaction/lewd/throatfuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/obj/item/organ/genital/genital = null
var/retaliation_message = FALSE
var/u_His = user.p_their()
var/t_His = partner.p_their()
var/t_Him = partner.p_them()
if(user.is_fucking(partner, CUM_TARGET_THROAT))
message = "[pick(
"brutally shoves [u_His] cock into \the <b>[partner]</b>'s throat to make [t_Him] gag.",
"chokes \the <b>[partner]</b> on [u_His] dick, going in balls deep.",
"slams in and out of \the <b>[partner]</b>'s mouth, [u_His] balls slapping off [t_His] face.")]"
if(rand(3))
partner.emote("chokes on \the [user]")
if(prob(1) && istype(partner))
partner.adjustOxyLoss(5)
if(partner.a_intent == INTENT_HARM)
// adjustBruteLoss(5)
retaliation_message = pick(
"stares up from between \the [user]'s knees, trying to squirm away.",
"struggles to escape from between \the [user]'s legs.",
)
else if(user.is_fucking(partner, CUM_TARGET_MOUTH))
message = "thrusts deeper into \the <b>[partner]</b>'s mouth and down [t_His] throat."
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
if(check)
genital = check
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
else
message = "forces [u_His] dick deep down \the <b>[partner]</b>'s throat"
var/check = user.getorganslot(ORGAN_SLOT_PENIS)
if(check)
genital = check
user.set_is_fucking(partner, CUM_TARGET_THROAT, genital)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
if(retaliation_message)
user.visible_message(message = "<font color=red><b>\The <b>[partner]</b></b> [retaliation_message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_THROAT, partner)
@@ -0,0 +1,202 @@
/datum/interaction/lewd/grindface
command = "grindface"
description = "Feet grind their face."
interaction_sound = null
require_target_mouth = TRUE
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
max_distance = 1
/datum/interaction/lewd/grindface/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/t_His = partner.p_their()
var/shoes = user.get_shoes()
if(user.is_fucking(partner, GRINDING_FACE_WITH_FEET))
if(shoes)
message = "[pick(list("grinds [u_His] [shoes] into <b>[partner]</b>'s face.",
"presses [u_His] footwear down hard on <b>[partner]</b>'s face.",
"rubs off the dirt from [u_His] [shoes] onto <b>[partner]</b>'s face."))]</span>"
else
message = "[pick(list("grinds [u_His] bare feet into <b>[partner]</b>'s face.",
"deviously covers <b>[partner]</b>'s mouth and nose with [u_His] bare feet.",
"runs the soles of [u_His] bare feet against <b>[partner]</b>'s lips."))]</span>"
else if(user.is_fucking(partner, GRINDING_MOUTH_WITH_FEET))
if(shoes)
message = "[pick(list("pulls [u_His] [shoes] out of <b>[partner]</b>'s mouth and puts them on [t_His] face.",
"slowly retracts [u_His] [shoes] from <b>[partner]</b>'s mouth, putting them on [t_His] face instead."))]</span>"
else
message = "[pick(list("pulls [u_His] bare feet out of <b>[partner]</b>'s mouth and rests them on [t_His] face instead.",
"retracts [u_His] bare feet from <b>[partner]</b>'s mouth and grinds them into [t_His] face instead."))]</span>"
user.set_is_fucking(partner, GRINDING_FACE_WITH_FEET, null)
else
if(shoes)
message = "[pick(list("plants [u_His] [shoes] ontop of <b>[partner]</b>'s face.",
"rests [u_His] [shoes] on <b>[partner]</b>'s face and presses down hard.",
"harshly places [u_His] [shoes] atop <b>[partner]</b>'s face."))]</span>"
else
message = "[pick(list("plants [u_His] bare feet ontop of <b>[partner]</b>'s face.",
"rests [u_His] feet on <b>[partner]</b>'s face, smothering them.",
"positions [u_His] bare feet atop <b>[partner]</b>'s face."))]</span>"
user.set_is_fucking(partner, GRINDING_FACE_WITH_FEET, null)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry2.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_dry4.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(LOW_LUST, null, user)
/datum/interaction/lewd/grindmouth
command = "grindmouth"
description = "Feet grind their mouth."
interaction_sound = null
require_target_mouth = TRUE
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
max_distance = 1
/datum/interaction/lewd/grindmouth/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/t_His = partner.p_their()
var/t_Him = partner.p_them()
var/t_He = partner.p_they()
var/t_S = partner.p_s()
var/shoes = user.get_shoes()
if(user.is_fucking(partner, GRINDING_MOUTH_WITH_FEET))
if(shoes)
message = "[pick(list("roughly shoves [u_His] [shoes] deeper into <b>[partner]</b>'s mouth.",
"harshly forces another inch of [u_His] [shoes] into <b>[partner]</b>'s mouth.",
"presses [u_His] weight down, [u_His] [shoes] prying deeper into <b>[partner]</b>'s mouth."))]</span>"
else
message = "[pick(list("wiggles [u_His] toes deep inside <b>[partner]</b>'s mouth.",
"crams [u_His] barefeet down deeper into <b>[partner]</b>'s mouth, making [t_Him] gag.",
"roughly grinds [u_His] feet on <b>[partner]</b>'s tongue."))]</span>"
else if(user.is_fucking(partner, GRINDING_FACE_WITH_FEET))
if(shoes)
message = "[pick(list("decides to force [u_His] [shoes] deep into <b>[partner]</b>'s mouth.",
"pressed the tip of [u_His] [shoes] against <b>[partner]</b>'s lips and shoves inwards."))]</span>"
else
message = "[pick(list("pries open <b>[partner]</b>'s mouth with [u_His] toes and shoves [u_His] bare foot in.",
"presses down [u_His] foot even harder, cramming [u_His] foot into <b>[partner]</b>'s mouth."))]</span>"
user.set_is_fucking(partner, GRINDING_MOUTH_WITH_FEET, null)
else
if(shoes)
message = "[pick(list("readies themselves and in one swift motion, shoves [u_His] [shoes] into <b>[partner]</b>'s mouth.",
"grinds the tip of [u_His] [shoes] against <b>[partner]</b>'s mouth before pushing themselves in."))]</span>"
else
message = "[pick(list("rubs [u_His] dirty bare feet across <b>[partner]</b>'s face before prying them into [t_His] muzzle.",
"forces [u_His] barefeet into <b>[partner]</b>'s mouth.",
"covers <b>[partner]</b>'s mouth and nose with [u_His] foot until [t_He] gasp[t_S] for breath, then shoves both feet inside before [t_He] can react."))]</span>"
user.set_is_fucking(partner, GRINDING_MOUTH_WITH_FEET, null)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg',
'modular_sand/sound/interactions/foot_wet3.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(LOW_LUST, null, user)
/datum/interaction/lewd/footjob
command = "footjob"
description = "Jerk them off with your foot."
interaction_sound = null
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/footjob/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = user.get_shoes(TRUE)
if(partner.is_fucking(src, CUM_TARGET_FEET))
message = "[pick("jerks \the <b>[partner]</b> off with [u_His] [shoes ? shoes : pick("foot", "sole")].",
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s shaft.",
"works [u_His] [shoes ? shoes : pick("foot", "sole")] up and down on \the <b>[partner]</b>'s cock.")]"
else
message = "[pick("[shoes ? "positions [u_His] [shoes] on" :"positions [u_His] foot on"] \the <b>[partner]</b>'s cock.",
"starts playing around with \the <b>[partner]</b>'s cock, using [u_His] [shoes ? shoes :"foot"].")]"
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
/datum/interaction/lewd/footjob/double
command = "footjob_double"
description = "Jerk them off with both of your feet."
require_user_num_feet = 2
/datum/interaction/lewd/footjob/double/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = user.get_shoes()
if(partner.is_fucking(user, CUM_TARGET_FEET))
message = "[pick("jerks \the <b>[partner]</b> off with [u_His] [shoes ? shoes : pick("feet", "soles")].",
"rubs [u_His] [shoes ? shoes : pick("feet", "soles")] on \the <b>[partner]</b>'s shaft.",
"rubs [shoes ? "[u_His] [shoes]" : "all of [u_His] toes"] on \the <b>[partner]</b>'s cock.",
"works [u_His] [shoes ? shoes : pick("feet", "soles")] up and down on \the <b>[partner]</b>'s cock.")]"
else
message = "[pick("[shoes ? "wraps [u_His] [shoes] around" : "wraps [u_His] [pick("feet", "soles")] around"] \the <b>[partner]</b>'s cock.",
"starts playing around with \the <b>[partner]</b>'s cock, using [u_His] [shoes ? shoes : "feet"].")]"
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
/datum/interaction/lewd/footjob/vagina
command = "footjob_vaginal"
description = "Rub their vagina with your foot."
require_target_vagina = REQUIRE_EXPOSED
require_target_penis = null
/datum/interaction/lewd/footjob/vagina/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = partner.get_shoes(TRUE)
if(partner.is_fucking(user, CUM_TARGET_FEET))
message = "[pick("rubs \the <b>[partner]</b> clit with [u_His] [shoes ? shoes : pick("foot", "sole")].",
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s coochie.",
"rubs [u_His] [shoes ? shoes : pick("foot", "sole", "toes")] on \the <b>[partner]</b>'s vagina.",
"rubs [u_His] foot up and down on \the <b>[partner]</b>'s pussy.")]"
else
message = "[pick("[shoes ? "positions [u_His] [shoes] on" : "positions [u_His] foot on"] \the <b>[partner]</b>'s pussy.",
"starts playing around with \the <b>[partner]</b>'s pussy, using [u_His] [shoes ? shoes : "foot"].")]"
partner.set_is_fucking(user, CUM_TARGET_FEET, partner.getorganslot(ORGAN_SLOT_VAGINA))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, user)
@@ -0,0 +1,29 @@
/datum/interaction/lewd/finger
command = "finger"
description = "Finger their pussy."
require_user_hands = TRUE
require_target_vagina = REQUIRE_EXPOSED
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/finger/display_interaction(mob/living/user, mob/living/partner)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [pick("fingers \the <b>[partner]</b>.",
"fingers \the <b>[partner]</b>'s pussy.",
"fingers \the <b>[partner]</b> hard.")]</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
partner.handle_post_sex(NORMAL_LUST, null, user)
/datum/interaction/lewd/fingerass
command = "fingerm"
description = "Finger their ass."
interaction_sound = null
require_user_hands = TRUE
require_target_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/fingerass/display_interaction(mob/living/user, mob/living/partner)
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers \the <b>[partner]</b>.",
"fingers \the <b>[partner]</b>'s asshole.",
"fingers \the <b>[partner]</b> hard.")]</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
partner.handle_post_sex(NORMAL_LUST, null, user)
@@ -0,0 +1,47 @@
/datum/interaction/lewd/frotting
command = "frotting"
description = "Rub your penis against theirs"
require_user_penis = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "frotted"
write_log_target = "was frotted by"
interaction_sound = null
/datum/interaction/lewd/frotting/display_interaction(mob/living/user, mob/living/partner)
var/message
var/t_His = user.p_their()
message = "rubs [t_His] penis against [partner]'s."
user.set_is_fucking(partner, CUM_TARGET_PENIS, user.getorganslot(ORGAN_SLOT_PENIS))
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner)
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, user)
/datum/interaction/lewd/tribadism
command = "tribadism"
description = "Grind your pussy against theirs."
interaction_sound = null
require_target_vagina = REQUIRE_EXPOSED
require_user_vagina = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/tribadism/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(partner.is_fucking(user, CUM_TARGET_VAGINA))
message = "[pick("grinds [u_His] pussy against \the <b>[partner]</b>'s cunt.",
"rubs [u_His] cunt against \the <b>[partner]</b>'s pussy.",
"thrusts against \the <b>[partner]</b>'s pussy.",
"humps \the <b>[partner]</b>, [u_His] pussies grinding against each other.")]"
else
message = "presses [u_His] pussy into \the <b>[partner]</b>'s own."
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_VAGINA))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg',
'modular_sand/sound/interactions/squelch2.ogg',
'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner)
@@ -0,0 +1,187 @@
/datum/interaction/lewd/fuck
command = "fuckvag"
description = "Fuck their pussy."
require_user_penis = REQUIRE_EXPOSED
require_target_vagina = REQUIRE_EXPOSED
write_log_user = "fucked"
write_log_target = "was fucked by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/fuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(user.is_fucking(partner, CUM_TARGET_VAGINA))
message = "[pick(
"pounds \the <b>[partner]</b>'s pussy.",
"shoves [u_His] dick deep into \the <b>[partner]</b>'s pussy",
"thrusts in and out of \the <b>[partner]</b>'s cunt.",
"goes balls deep into \the <b>[partner]</b>'s pussy over and over again.")]"
else
message = "slides [u_His] cock into \the <b>[partner]</b>'s pussy."
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)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, partner)
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, user)
/datum/interaction/lewd/fuck/anal
command = "fuckass"
description = "Fuck their ass."
require_target_vagina = null
require_target_anus = REQUIRE_EXPOSED
/datum/interaction/lewd/fuck/anal/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/t_His = partner.p_their()
if(user.is_fucking(partner, CUM_TARGET_ANUS))
message = "[pick(
"thrusts in and out of \the <b>[partner]</b>'s ass.",
"pounds \the <b>[partner]</b>'s ass.",
"slams [u_His] hips up against \the <b>[partner]</b>'s ass hard.",
"goes balls deep into \the <b>[partner]</b>'s ass over and over again.")]"
else
message = "[pick(
"works [u_His] cock into \the <b>[partner]</b>'s asshole.",
"grabs the base of [u_His] twitching cock and presses the tip into \the <b>[partner]</b>'s asshole.",
"shoves [u_His] dick deep inside of \the <b>[partner]</b>'s ass, making [t_His] rear jiggle.")]"
user.set_is_fucking(partner, CUM_TARGET_ANUS, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, partner)
partner.handle_post_sex(NORMAL_LUST, null, user)
/datum/interaction/lewd/breastfuck
command = "breastfuck"
description = "Fuck their breasts."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_breasts = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/breastfuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(user.is_fucking(partner, CUM_TARGET_BREASTS))
message = "[pick("fucks \the <b>[partner]</b>'s' breasts.",
"grinds [u_His] cock between \the <b>[partner]</b>'s boobs.",
"thrusts into \the <b>[partner]</b>'s tits.",
"grabs \the <b>[partner]</b>'s breasts together and presses [u_His] dick between them.")]"
else
message = "pushes \the <b>[partner]</b>'s breasts together and presses [u_His] dick between them."
user.set_is_fucking(partner, CUM_TARGET_BREASTS, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_BREASTS, partner)
/datum/interaction/lewd/footfuck
command = "footfuck"
description = "Rub your cock on their foot."
interaction_sound = null
require_target_num_feet = 1
require_target_feet = REQUIRE_ANY
require_user_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/footfuck/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = partner.get_shoes(TRUE)
if(user.is_fucking(partner, CUM_TARGET_FEET))
message = "[pick("fucks \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"rubs [u_His] dick on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"grinds [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
else
message = "[pick("positions [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"positions [u_His] cock on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot","sole")].",
"starts grinding [u_His] cock against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
/datum/interaction/lewd/footfuck/double
command = "footfuckdouble"
description = "Rub your cock between their feet."
require_target_num_feet = 2
/datum/interaction/lewd/footfuck/double/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = partner.get_shoes()
if(user.is_fucking(partner, CUM_TARGET_FEET))
message = "[pick("fucks \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
"rubs [u_His] dick between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
"thrusts [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].")]"
else
message = "[pick("positions [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
"starts grinding [u_His] cock against \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].",
"starts grinding [u_His] cock between \the <b>[partner]</b>'s [shoes ? shoes : pick("feet", "soles")].")]"
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
/datum/interaction/lewd/footfuck/vag
command = "footfuckvag"
description = "Rub your vagina on their foot."
interaction_sound = null
require_target_num_feet = 1
require_target_feet = REQUIRE_ANY
require_user_vagina = REQUIRE_EXPOSED
require_user_penis = REQUIRE_NONE
max_distance = 1
/datum/interaction/lewd/footfuck/vag/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/shoes = partner.get_shoes(TRUE)
if(user.is_fucking(partner, CUM_TARGET_FEET))
message = "[pick("grinds [u_His] pussy against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"rubs [u_His] clit on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"ruts on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
else
message = "[pick("positions [u_His] vagina on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].",
"positions [u_His] clit on \the <b>[partner]</b>'s [shoes ? shoes : pick("foot","sole")].",
"starts grinding [u_His] pussy against \the <b>[partner]</b>'s [shoes ? shoes : pick("foot", "sole")].")]"
user.set_is_fucking(partner, CUM_TARGET_FEET, user.getorganslot(ORGAN_SLOT_VAGINA))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/foot_dry1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_wet2.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, partner)
@@ -0,0 +1,27 @@
/datum/interaction/lewd/handjob
command = "handjob"
description = "Jerk them off."
interaction_sound = null
require_user_hands = TRUE
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/handjob/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(partner.is_fucking(user, CUM_TARGET_HAND))
message = "[pick("jerks \the <b>[partner]</b> off.",
"works \the <b>[partner]</b>'s shaft.",
"wanks \the <b>[partner]</b>'s cock hard.")]"
else
message = "[pick("wraps [u_His] hand around \the <b>[partner]</b>'s cock.",
"starts playing with \the <b>[partner]</b>'s cock")]"
partner.set_is_fucking(user, CUM_TARGET_HAND, partner.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
@@ -0,0 +1,22 @@
/datum/interaction/lewd/kiss
command = "deepkiss"
description = "Kiss them deeply."
require_user_mouth = TRUE
require_target_mouth = TRUE
write_log_user = "kissed"
write_log_target = "was kissed by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/kiss/post_interaction(mob/living/user, mob/living/partner)
. = ..()
if(user.get_lust() < 5)
user.set_lust(5)
if(partner.get_lust() < 5)
partner.set_lust(5)
/datum/interaction/lewd/kiss/display_interaction(mob/living/user, mob/living/partner)
if(user.get_lust() >= 3)
user.visible_message("<span class='lewd'>\The <b>[user]</b> gives an intense, lingering kiss to \the <b>[partner]</b>.</span>")
else
user.visible_message("<span class='lewd'>\The <b>[user]</b> kisses \the <b>[partner]</b> deeply.</span>")
@@ -0,0 +1,35 @@
/datum/interaction/lewd/rimjob
command = "rimjob"
description = "Lick their ass."
interaction_sound = null
require_user_mouth = TRUE
require_target_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/rimjob/display_interaction(mob/living/user, mob/living/partner)
user.visible_message("<span class='lewd'><b>\The [user]</b> licks \the <b>[partner]</b>'s asshole.</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
partner.handle_post_sex(NORMAL_LUST, null, user)
/datum/interaction/lewd/lickfeet
command = "lickfeet"
description = "Lick their feet."
interaction_sound = null
require_user_mouth = TRUE
require_target_feet = REQUIRE_ANY
require_target_num_feet = 1
max_distance = 1
/datum/interaction/lewd/lickfeet/display_interaction(mob/living/user, mob/living/partner)
var/message
var/shoes = partner.get_shoes()
if(shoes)
message = "licks \the <b>[partner]</b>'s [shoes]."
else
message = "licks \the <b>[partner]</b>'s [partner.has_feet() == 1 ? "foot" : "feet"]."
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(LOW_LUST, null, user)
@@ -0,0 +1,166 @@
/datum/interaction/lewd/mount
command = "mount"
description = "Mount with your pussy."
interaction_sound = null
require_user_vagina = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mount/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(partner.is_fucking(user, CUM_TARGET_VAGINA))
message = "[pick("rides \the <b>[partner]</b>'s dick.",
"forces <b>[partner]</b>'s cock on [u_His] pussy")]"
else
message = "slides [u_His] pussy onto \the <b>[partner]</b>'s cock."
partner.set_is_fucking(user, CUM_TARGET_VAGINA, partner.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_VAGINA, user)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, partner)
/datum/interaction/lewd/mountass
command = "mountm"
description = "Mount with your ass."
interaction_sound = null
require_user_anus = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mountass/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(partner.is_fucking(user, CUM_TARGET_ANUS))
message = "[pick("rides \the <b>[partner]</b>'s dick.",
"forces <b>[partner]</b>'s cock on [u_His] ass")]"
else
message = "lowers [u_His] ass onto \the <b>[partner]</b>'s cock."
partner.set_is_fucking(user, CUM_TARGET_ANUS, partner.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_ANUS, user)
user.handle_post_sex(NORMAL_LUST, null, partner)
/datum/interaction/lewd/mountface
command = "mountface"
description = "Ass to face."
interaction_sound = null
require_target_mouth = TRUE
require_user_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mountface/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
if(user.is_fucking(partner, GRINDING_FACE_WITH_ANUS))
message = "[pick("grinds [u_His] ass into \the <b>[partner]</b>'s face.",
"shoves [u_His] ass into \the <b>[partner]</b>'s face.")]"
else
message = "[pick(
"grabs the back of \the <b>[partner]</b>'s head and forces it into [u_His] asscheeks.",
"squats down and plants [u_His] ass right on \the <b>[partner]</b>'s face")]"
user.set_is_fucking(partner, GRINDING_FACE_WITH_ANUS, null)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/squelch1.ogg',
'modular_sand/sound/interactions/squelch2.ogg',
'modular_sand/sound/interactions/squelch3.ogg'), 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(LOW_LUST, null, partner)
/datum/interaction/lewd/thighs
command = "thigh_smother"
description = "Smother them using your penis."
max_distance = 1
require_user_penis = REQUIRE_EXPOSED
require_target_mouth = TRUE
interaction_sound = null
write_log_user = "thigh-trapped (penis)"
write_log_target = "was smothered (penis) by"
var/fucktarget = "penis"
/datum/interaction/lewd/thighs/vagina
command = "thigh_smother_vag"
description = "Smother them using your vagina."
require_user_penis = REQUIRE_NONE
require_user_vagina = REQUIRE_EXPOSED
write_log_user = "thigh-trapped (vagina)"
write_log_target = "was smothered (vagina) by"
fucktarget = "vagina"
/datum/interaction/lewd/thighs/display_interaction(mob/living/user, mob/living/partner)
var/message
var/obj/item/organ/genital/genital = null
var/lust_increase = 1
var/u_His = user.p_their()
var/t_His = partner.p_their()
var/t_Him = partner.p_them()
var/t_Hes = partner.p_theyre()
if(user.is_fucking(partner, THIGH_SMOTHERING))
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(user.has_vagina())
message = pick(list(
"presses [u_His] weight down onto \the <b>[partner]</b>'s face, blocking [t_His] vision completely.",
"rides \the <b>[partner]</b>'s face, grinding [u_His] wet pussy all over it."))
else
improv = TRUE
if("penis")
if(user.has_penis())
message = pick(list("presses [u_His] weight down onto \the <b>[partner]</b>'s face, blocking [t_His] vision completely.",
"forces [u_His] dick and nutsack into \the <b>[partner]</b>'s face as [t_Hes] stuck locked in between [u_His] thighs.",
"slips [u_His] cock into \the <b>[partner]</b>'s helpless mouth, keeping [u_His] shaft pressed hard into [t_His] face."))
else
improv = TRUE
if(improv)
message = "rubs [u_His] groin up and down \the <b>[partner]</b>'s face."
else
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(user.has_vagina())
message = pick(list(
"clambers over \the <b>[partner]</b>'s face and pins [t_Him] down with [u_His] thighs, [u_His] moist slit rubbing all over \the <b>[partner]</b>'s mouth and nose.",
"locks [u_His] legs around \the <b>[partner]</b>'s head before pulling it into [u_His] mound."))
else
improv = TRUE
if("penis")
if(user.has_penis())
message = pick(list(
"clambers over \the <b>[partner]</b>'s face and pins [t_Him] down with [u_His] thighs, then slowly inching closer and covering [t_His] eyes and nose with [u_His] leaking erection.",
"locks [u_His] legs around \the <b>[partner]</b>'s head before pulling it into [u_His] fat package, smothering [t_Him]."))
else
improv = TRUE
if(improv)
message = "deviously locks [u_His] legs around \the <b>[partner]</b>'s head and smothers it in [u_His] thighs."
else
switch(fucktarget)
if("vagina")
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
if("penis")
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
user.set_is_fucking(partner, THIGH_SMOTHERING, genital)
var/file = pick('modular_sand/sound/interactions/bj10.ogg',
'modular_sand/sound/interactions/bj3.ogg',
'modular_sand/sound/interactions/foot_wet1.ogg',
'modular_sand/sound/interactions/foot_dry3.ogg')
playlewdinteractionsound(get_turf(user), file, 70, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(lust_increase, THIGH_SMOTHERING, partner)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_MOUTH, partner)
@@ -0,0 +1,142 @@
/datum/interaction/lewd/nipsuck
command = "nipsuck"
description = "Suck their nipples."
require_target_topless = TRUE
require_user_mouth = TRUE
write_log_user = "sucked nipples"
write_log_target = "had their nipples sucked by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/nipsuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
if((user.a_intent == INTENT_HELP) || (user.a_intent == INTENT_DISARM))
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> gently sucks on \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> gently nibs \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> licks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,2 * modifier))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> bites \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> aggressively sucks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
if(user.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> sucks \the <b>[target]</b>'s [pick("nipple", "nipples")] intently.</span>",
"<span class='lewd'>\The <b>[user]</b> feasts \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> glomps \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
if(prob(5 + target.get_lust()))
if(target.a_intent == INTENT_HELP)
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as their chest gets molested.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as their breasts get molested.</span>",
"<span class='lewd'>\The <b>[target]</b> quivers in arousal as \the <b>[user]</b> delights themselves on their milk.</span>"))
if(target.get_lust() < 5)
target.set_lust(5)
if(target.a_intent == INTENT_DISARM)
if (target.restrained())
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> thrusts their bare chest forward into \the <b>[user]</b>'s mouth.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> thrust their bare breasts forward into \the <b>[user]</b>'s mouth.</span>"))
else
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their chest.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their breast.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>",
"<span class='lewd'>\The <b>[target]</b> rubs their breasts against \the <b>[user]</b>'s head.</span>"))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> grips \the <b>[user]</b>'s head tight.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails into \the <b>[user]</b>'s scalp.</span>",
"<span class='lewd'>\The <b>[target]</b> grabs and shoves \the <b>[user]</b>'s head away.</span>"))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> slaps \the <b>[user]</b> away.</span>",
"<span class='lewd'>\The <b>[target]</b> scratches <b>[user]</b>'s face.</span>",
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s face, drawing blood.</span>",
"<span class='lewd'>\The <b>[target]</b> elbows <b>[user]</b>'s mouth away.</span>"))
target.dir = get_dir(target, user)
user.dir = get_dir(user, target)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
return
@@ -0,0 +1,45 @@
/datum/interaction/lewd/nuts
command = "nut_face"
description = "Nuts to face."
interaction_sound = null
require_user_balls = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
write_log_user = "make-them-suck-their-nuts"
write_log_target = "was made to suck nuts by"
/datum/interaction/lewd/nuts/display_interaction(mob/living/user, mob/living/partner)
var/message
var/u_His = user.p_their()
var/t_His = partner.p_their()
var/lust_increase = 1
if(user.is_fucking(partner, NUTS_TO_FACE))
message = pick(list(
"grabs the back of <b>[partner]</b>'s head and pulls it into [u_His] crotch.",
"jams [u_His] nutsack right into <b>[partner]</b>'s face.",
"roughly grinds [u_His] fat nutsack into <b>[partner]</b>'s mouth.",
"pulls out [u_His] saliva-covered nuts from <b>[partner]</b>'s violated mouth and then wipes off the slime onto [t_His] face."))
else
message = pick(list("wedges a digit into the side of <b>[partner]</b>'s jaw and pries it open before using [u_His] other hand to shove [u_His] whole nutsack inside!", "stands with [u_His] groin inches away from [partner]'s face, then thrusting [u_His] hips forward and smothering [partner]'s whole face with [u_His] heavy ballsack."))
user.set_is_fucking(partner, NUTS_TO_FACE, user.getorganslot(ORGAN_SLOT_PENIS))
/*playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/nuts1.ogg',
'modular_sand/sound/interactions/nuts2.ogg',
'modular_sand/sound/interactions/nuts3.ogg',
'modular_sand/sound/interactions/nuts4.ogg'), 70, 1, -1)*/ //These files don't even exist but nobody noticed because double-quotes were used instead of single.
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, partner)
/datum/interaction/lewd/nut_smack
command = "smack_nuts"
description = "Smack their nuts."
interaction_sound = 'modular_sand/sound/interactions/slap.ogg'
simple_message = "USER slaps TARGET's nuts!"
require_target_balls = REQUIRE_EXPOSED
needs_physical_contact = TRUE
max_distance = 1
write_log_user = "slapped-nuts"
write_log_target = "had their nuts slapped by"
@@ -0,0 +1,127 @@
/datum/interaction/lewd/oral
command = "suckvag"
description = "Go down on them."
require_user_mouth = TRUE
require_target_vagina = REQUIRE_EXPOSED
write_log_user = "gave head to"
write_log_target = "was given head by"
interaction_sound = null
max_distance = 1
var/fucktarget = "vagina"
/datum/interaction/lewd/oral/blowjob
command = "suckcock"
description = "Suck them off."
require_target_vagina = null
require_target_penis = REQUIRE_EXPOSED
fucktarget = "penis"
/datum/interaction/lewd/oral/display_interaction(mob/living/user, mob/living/partner)
var/message
var/obj/item/organ/genital/genital = null
var/lust_increase = NORMAL_LUST
var/u_His = user.p_their()
var/u_He = user.p_they()
var/u_Were = user.p_theyre()
if(partner.is_fucking(user, CUM_TARGET_MOUTH))
if(prob(partner.get_sexual_potency()))
user.adjustOxyLoss(3)
message = "goes in deep on \the <b>[partner]</b>."
lust_increase += 5
else
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(partner.has_vagina())
message = pick(
"licks \the <b>[partner]</b>'s pussy.",
"runs [u_His] tongue up the shape of \the <b>[partner]</b>'s pussy.",
"traces \the <b>[partner]</b>'s slit with [u_His] tongue.",
"darts the tip of [u_His] tongue around \the <b>[partner]</b>'s clit.",
"laps slowly at \the <b>[partner]</b>.",
"kisses \the <b>[partner]</b>'s delicate folds.",
"tastes \the <b>[partner]</b>.",
)
else
improv = TRUE
if("penis")
if(partner.has_penis())
message = pick(
"sucks \the <b>[partner]</b>'s off.",
"runs [u_His] tongue up the shape of \the <b>[partner]</b>'s cock.",
"traces \the <b>[partner]</b>'s cock with [u_His] tongue.",
"darts the tip of [u_His] tongue around tip of \the <b>[partner]</b>'s cock.",
"laps slowly at \the <b>[partner]</b>'s shaft.",
"kisses the base of \the <b>[partner]</b>'s shaft.",
"takes \the <b>[partner]</b> deeper into [u_His] mouth.",
)
else
improv = TRUE
if(improv)
// get confused about how to do the sex
message = pick(
"licks \the <b>[partner]</b>.",
"looks a little unsure of where to lick \the <b>[partner]</b>.",
"runs [u_His] tongue between \the <b>[partner]</b>'s legs.",
"kisses \the <b>[partner]</b>'s thigh.",
"tries [u_His] best with \the <b>[partner]</b>.",
)
else
var/improv = FALSE
switch(fucktarget)
if("vagina")
if(partner.has_vagina())
message = pick(
"buries [u_His] face in \the <b>[partner]</b>'s pussy.",
"nuzzles \the <b>[partner]</b>'s wet sex.",
"finds [u_His] face caught between \the <b>[partner]</b>'s thighs.",
"kneels down between \the <b>[partner]</b>'s legs.",
"grips \the <b>[partner]</b>'s legs, pushing them apart.",
"sinks [u_His] face in between \the <b>[partner]</b>'s thighs.",
)
else
improv = TRUE
if("penis")
if(partner.has_penis())
message = pick(
"takes \the <b>[partner]</b>'s cock into [u_His] mouth.",
"wraps [u_His] lips around \the <b>[partner]</b>'s cock.",
"finds [u_His] face between \the <b>[partner]</b>'s thighs.",
"kneels down between \the <b>[partner]</b>'s legs.",
"grips \the <b>[partner]</b>'s legs, kissing at the tip of [u_His] cock.",
"goes down on \the <b>[partner]</b>.",
)
else
improv = TRUE
if(improv)
message = pick(
"begins to lick \the <b>[partner]</b>.",
"starts kissing \the <b>[partner]</b>'s thigh.",
"sinks down between \the <b>[partner]</b>'s thighs.",
"briefly flashes a puzzled look from between \the <b>[partner]</b>'s legs.",
"looks unsure of how to handle \the <b>[partner]</b>'s lack of genitalia.",
"seems like [u_He] [u_Were] expecting \the <b>[partner]</b> to have a cock or a pussy or ... something.",
)
genital = null
else
switch(fucktarget)
if("vagina")
genital = partner.getorganslot(ORGAN_SLOT_VAGINA)
if("penis")
genital = partner.getorganslot(ORGAN_SLOT_PENIS)
partner.set_is_fucking(user, CUM_TARGET_MOUTH, genital)
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bj1.ogg',
'modular_sand/sound/interactions/bj2.ogg',
'modular_sand/sound/interactions/bj3.ogg',
'modular_sand/sound/interactions/bj4.ogg',
'modular_sand/sound/interactions/bj5.ogg',
'modular_sand/sound/interactions/bj6.ogg',
'modular_sand/sound/interactions/bj7.ogg',
'modular_sand/sound/interactions/bj8.ogg',
'modular_sand/sound/interactions/bj9.ogg',
'modular_sand/sound/interactions/bj10.ogg',
'modular_sand/sound/interactions/bj11.ogg'), 50, 1, -1)
user.visible_message("<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
partner.handle_post_sex(lust_increase, CUM_TARGET_MOUTH, user)
@@ -0,0 +1,86 @@
/datum/interaction/lewd/titgrope_self
command = "titgrope_self"
description = "Grope your own breasts."
require_user_hands = TRUE
require_user_breasts = REQUIRE_ANY
user_is_target = TRUE
interaction_sound = null
max_distance = 0
write_log_user = "groped own breasts"
write_log_target = null
/datum/interaction/lewd/titgrope_self/display_interaction(mob/living/user)
var/message
var/t_His = user.p_their()
if(user.a_intent == INTENT_HARM)
message = "[pick("aggressively gropes [t_His] breast.",
"grabs [t_His] breasts.",
"tightly squeezes [t_His] breasts.",
"slaps at [t_His] breasts.",
"gropes [t_His] breasts roughly.")]"
else
message = "[pick("gently gropes [t_His] breast.",
"softly squeezes [t_His] breasts.",
"grips [t_His] breasts.",
"runs a few fingers over [t_His] breast.",
"delicately teases [t_His] nipple.",
"traces a touch across [t_His] breast.")]"
if(prob(5 + user.get_lust()))
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("shivers in arousal.",
"moans quietly.",
"breathes out a soft moan.",
"gasps.",
"shudders softly.",
"trembles as [t_His] hands run across bare skin.")]</span>")
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/squelch1.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
/datum/interaction/lewd/self_nipsuck
command = "self_nipsuck"
description = "Suck your own nips."
require_user_breasts = REQUIRE_EXPOSED
require_user_mouth = TRUE
user_is_target = TRUE
interaction_sound = null
max_distance = 0
write_log_user = "sucked their own nips"
write_log_target = null
/datum/interaction/lewd/self_nipsuck/display_interaction(mob/living/user, mob/living/target)
var/message
var/u_His = user.p_their()
var/obj/item/organ/genital/breasts/milkers = user.getorganslot(ORGAN_SLOT_BREASTS)
var/milktype = milkers?.fluid_id
var/modifier
var/list/lines
if(!milkers || !milktype)
return
var/milktext = initial(milktype)
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)]"
)
message = "<span class='lewd'>\The <b>[user]</b> [pick(lines)]</span>"
user.visible_message(message, ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
switch(milkers.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(milkers.size in milkers.breast_values)
modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY)
else
modifier = 1
user.reagents.add_reagent(milktype, rand(1,3 * modifier))
@@ -0,0 +1,41 @@
/datum/interaction/lewd/fingerass_self
command = "fingerm_self"
description = "Finger yourself."
interaction_sound = null
require_user_hands = TRUE
require_user_anus = REQUIRE_EXPOSED
user_is_target = TRUE
max_distance = 0
write_log_user = "fingered self"
write_log_target = null
/datum/interaction/lewd/fingerass_self/display_interaction(mob/living/user)
var/t_His = user.p_their()
var/t_Him = user.p_them()
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers [t_Him]self.",
"fingers [t_His] asshole.",
"fingers [t_Him]self hard.")]</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
/datum/interaction/lewd/finger_self
command = "finger_self"
description = "Finger your own pussy."
require_user_hands = TRUE
require_user_vagina = REQUIRE_EXPOSED
interaction_sound = null
user_is_target = TRUE
max_distance = 0
write_log_user = "fingered own pussy"
write_log_target = null
/datum/interaction/lewd/finger_self/display_interaction(mob/living/user)
var/t_His = user.p_their()
user.visible_message("<span class='lewd'><b>\The [user]</b> [pick("fingers [t_His] pussy deep.",
"fingers [t_His] pussy.",
"plays with [t_His] pussy.",
"fingers [t_His] own pussy hard.")]</span>", ignored_mobs = user.get_unconsenting())
playlewdinteractionsound(get_turf(user), 'modular_sand/sound/interactions/champ_fingering.ogg', 50, 1, -1)
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
@@ -0,0 +1,32 @@
/datum/interaction/lewd/jack
command = "jack"
description = "Jerk yourself off."
interaction_sound = null
require_user_hands = TRUE
require_user_penis = REQUIRE_EXPOSED
user_is_target = TRUE
max_distance = 0
write_log_user = "jerked off"
write_log_target = null
/datum/interaction/lewd/jack/display_interaction(mob/living/user)
var/message
var/t_His = user.p_their()
var/t_Him = user.p_them()
if(user.is_fucking(user, CUM_TARGET_HAND))
message = "[pick("jerks [t_Him]self off.",
"works [t_His] shaft.",
"strokes [t_His] penis.",
"wanks [t_His] cock hard.")]"
else
message = "[pick("wraps [t_His] hand around [t_His] cock.",
"starts to stroke [t_His] cock.",
"starts playing with [t_His] cock.")]"
user.set_is_fucking(user, CUM_TARGET_HAND, user.getorganslot(ORGAN_SLOT_PENIS))
playlewdinteractionsound(get_turf(user), pick('modular_sand/sound/interactions/bang1.ogg',
'modular_sand/sound/interactions/bang2.ogg',
'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1)
user.visible_message(message = "<span class='lewd'><b>\The [user]</b> [message]</span>", ignored_mobs = user.get_unconsenting())
user.handle_post_sex(NORMAL_LUST, CUM_TARGET_HAND, user)
@@ -1,594 +0,0 @@
/datum/interaction/lewd
var/list/blacklisted_mobs = list(/mob/living/simple_animal/pet,
/mob/living/simple_animal/cockroach,
/mob/living/simple_animal/babyKiwi,
/mob/living/simple_animal/butterfly,
/mob/living/simple_animal/chick,
/mob/living/simple_animal/chicken,
/mob/living/simple_animal/cow,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/kiwi,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/sloth,
/mob/living/simple_animal/pickle,
/mob/living/simple_animal/hostile/retaliate/goat)
/datum/interaction/lewd/kiss
command = "deepkiss"
description = "Kiss them deeply."
require_user_mouth = TRUE
require_target_mouth = TRUE
write_log_user = "kissed"
write_log_target = "was kissed by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/kiss/post_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
. = ..()
if(user.get_lust() < 5)
user.set_lust(5)
if(target.get_lust() < 5)
target.set_lust(5)
/datum/interaction/lewd/kiss/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
if(user.get_lust() >= 3)
user.visible_message("<span class='lewd'>\The <b>[user]</b> gives an intense, lingering kiss to \the <b>[target]</b>.</span>")
else
user.visible_message("<span class='lewd'>\The <b>[user]</b> kisses \the <b>[target]</b> deeply.</span>")
/datum/interaction/lewd/titgrope
command = "titgrope"
description = "Grope their breasts."
require_user_hands = TRUE
require_target_breasts = REQUIRE_ANY
write_log_user = "groped"
write_log_target = "was groped by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/titgrope/post_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
. = ..()
/datum/interaction/lewd/titgrope/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
if(user.a_intent == INTENT_HELP)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> gently gropes \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> softly squeezes \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> grips \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> runs a few fingers over \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> delicately teases \the <b>[target]</b>'s nipple.</span>",
"<span class='lewd'>\The <b>[user]</b> traces a touch across \the <b>[target]</b>'s breast.</span>"))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> aggressively gropes \the <b>[target]</b>'s breast.</span>",
"<span class='lewd'>\The <b>[user]</b> grabs \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> tightly squeezes \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> slaps at \the <b>[target]</b>'s breasts.</span>",
"<span class='lewd'>\The <b>[user]</b> gropes \the <b>[target]</b>'s breasts roughly.</span>"))
if(prob(5 + target.get_lust()))
if(target.a_intent == INTENT_HELP)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as hands run across bare skin.</span>"))
if(target.get_lust() < 5)
target.set_lust(5)
if(target.a_intent == INTENT_DISARM)
if (target.restrained())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from <b>[user]</b>'s roaming hand.</span>",
"<span class='lewd'>\The <b>[target]</b> thrusts bare breasts forward into <b>[user]</b>'s hands.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully bats at <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from <b>[user]</b>'s hand.</span>",
"<span class='lewd'>\The <b>[target]</b> guides <b>[user]</b>'s hand across bare breasts.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly laces a few fingers over <b>[user]</b>'s knuckles.</span>"))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> grips <b>[user]</b>'s wrist tight.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails into <b>[user]</b>'s arm.</span>",
"<span class='lewd'>\The <b>[target]</b> grabs <b>[user]</b>'s wrist for a second.</span>"))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> pushes <b>[user]</b> roughly away.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails angrily into <b>[user]</b>'s arm.</span>",
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s forearm, drawing blood.</span>",
"<span class='lewd'>\The <b>[target]</b> slaps <b>[user]</b>'s hand away.</span>"))
return
/datum/interaction/lewd/nipsuck
command = "nipsuck"
description = "Suck their nipples."
require_target_topless = TRUE
require_user_mouth = TRUE
write_log_user = "sucked nipples"
write_log_target = "had their nipples sucked by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/nipsuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
if((user.a_intent == INTENT_HELP) || (user.a_intent == INTENT_DISARM))
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> gently sucks on \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> gently nibs \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> licks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,2 * modifier))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> bites \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> aggressively sucks \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
if(user.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[user]</b> sucks \the <b>[target]</b>'s [pick("nipple", "nipples")] intently.</span>",
"<span class='lewd'>\The <b>[user]</b> feasts \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>",
"<span class='lewd'>\The <b>[user]</b> glomps \the <b>[target]</b>'s [pick("nipple", "nipples")].</span>"))
if(target.has_breasts(REQUIRE_EXPOSED))
var/modifier = 1
var/obj/item/organ/genital/breasts/B = target.getorganslot(ORGAN_SLOT_BREASTS)
switch(B.size)
if("c", "d", "e")
modifier = 2
if("f", "g", "h")
modifier = 3
else
if(B.size in B.breast_values)
modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY)
else
modifier = 1
if(B.fluid_id)
user.reagents.add_reagent(B.fluid_id, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
if(prob(5 + target.get_lust()))
if(target.a_intent == INTENT_HELP)
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as their chest gets molested.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> shivers in arousal.</span>",
"<span class='lewd'>\The <b>[target]</b> moans quietly.</span>",
"<span class='lewd'>\The <b>[target]</b> breathes out a soft moan.</span>",
"<span class='lewd'>\The <b>[target]</b> gasps.</span>",
"<span class='lewd'>\The <b>[target]</b> shudders softly.</span>",
"<span class='lewd'>\The <b>[target]</b> trembles as their breasts get molested.</span>",
"<span class='lewd'>\The <b>[target]</b> quivers in arousal as \the <b>[user]</b> delights themselves on their milk.</span>"))
if(target.get_lust() < 5)
target.set_lust(5)
if(target.a_intent == INTENT_DISARM)
if (target.restrained())
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> thrusts their bare chest forward into \the <b>[user]</b>'s mouth.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> twists playfully against the restraints.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> slides back from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> thrust their bare breasts forward into \the <b>[user]</b>'s mouth.</span>"))
else
if(!target.has_breasts())
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their chest.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>"))
else
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> playfully shoos away \the <b>[user]</b>'s head.</span>",
"<span class='lewd'>\The <b>[target]</b> squirms away from \the <b>[user]</b>'s mouth.</span>",
"<span class='lewd'>\The <b>[target]</b> holds \the <b>[user]</b>'s head against their breast.</span>",
"<span class='lewd'>\The <b>[target]</b> teasingly caresses \the <b>[user]</b>'s neck.</span>",
"<span class='lewd'>\The <b>[target]</b> rubs their breasts against \the <b>[user]</b>'s head.</span>"))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> grips \the <b>[user]</b>'s head tight.</span>",
"<span class='lewd'>\The <b>[target]</b> digs nails into \the <b>[user]</b>'s scalp.</span>",
"<span class='lewd'>\The <b>[target]</b> grabs and shoves \the <b>[user]</b>'s head away.</span>"))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("<span class='lewd'>\The <b>[target]</b> slaps \the <b>[user]</b> away.</span>",
"<span class='lewd'>\The <b>[target]</b> scratches <b>[user]</b>'s face.</span>",
"<span class='lewd'>\The <b>[target]</b> fiercely struggles against <b>[user]</b>.</span>",
"<span class='lewd'>\The <b>[target]</b> claws <b>[user]</b>'s face, drawing blood.</span>",
"<span class='lewd'>\The <b>[target]</b> elbows <b>[user]</b>'s mouth away.</span>"))
target.dir = get_dir(target, user)
user.dir = get_dir(user, target)
playlewdinteractionsound(user.loc, pick('modular_sand/sound/interactions/oral1.ogg',
'modular_sand/sound/interactions/oral2.ogg'), 70, 1, -1)
return
/datum/interaction/lewd/oral
command = "suckvag"
description = "Go down on them."
require_user_mouth = TRUE
require_target_vagina = REQUIRE_EXPOSED
write_log_user = "gave head to"
write_log_target = "was given head by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/oral/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_oral(target, "vagina")
/datum/interaction/lewd/oral/blowjob
command = "suckcock"
description = "Suck them off."
require_target_vagina = REQUIRE_NONE
require_target_penis = REQUIRE_EXPOSED
/datum/interaction/lewd/oral/blowjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_oral(target, "penis")
/datum/interaction/lewd/fuck
command = "fuckvag"
description = "Fuck their pussy."
require_user_penis = REQUIRE_EXPOSED
require_target_vagina = REQUIRE_EXPOSED
write_log_user = "fucked"
write_log_target = "was fucked by"
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/fuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_vaginal(target)
/datum/interaction/lewd/fuck/anal
command = "fuckass"
description = "Fuck their ass."
require_target_vagina = REQUIRE_NONE
require_target_anus = REQUIRE_EXPOSED
/datum/interaction/lewd/fuck/anal/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_anal(target)
/datum/interaction/lewd/finger
command = "finger"
description = "Finger their pussy."
require_user_hands = TRUE
require_target_vagina = REQUIRE_EXPOSED
interaction_sound = null
max_distance = 1
/datum/interaction/lewd/finger/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_fingering(target)
/datum/interaction/lewd/fingerass
command = "fingerm"
description = "Finger their ass."
interaction_sound = null
require_user_hands = TRUE
require_target_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/fingerass/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_fingerass(target)
/datum/interaction/lewd/facefuck
command = "facefuck"
description = "Fuck their mouth."
interaction_sound = null
require_target_mouth = TRUE
require_user_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/facefuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_facefuck(target)
/datum/interaction/lewd/throatfuck
command = "throatfuck"
description = "Fuck their throat. | Does oxy damage."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
/datum/interaction/lewd/throatfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_throatfuck(target)
/datum/interaction/lewd/handjob
command = "handjob"
description = "Jerk them off."
interaction_sound = null
require_user_hands = TRUE
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/handjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_handjob(target)
/datum/interaction/lewd/breastfuck
command = "breastfuck"
description = "Fuck their breasts."
interaction_sound = null
require_user_penis = REQUIRE_EXPOSED
require_target_breasts = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/breastfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_breastfuck(target)
/datum/interaction/lewd/mount
command = "mount"
description = "Mount with your pussy."
interaction_sound = null
require_user_vagina = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mount/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_mount(target)
/datum/interaction/lewd/mountass
command = "mountm"
description = "Mount with your ass."
interaction_sound = null
require_user_anus = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mountass/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_mountass(target)
/datum/interaction/lewd/tribadism
command = "tribadism"
description = "Grind your pussy against theirs."
interaction_sound = null
require_target_vagina = REQUIRE_EXPOSED
require_user_vagina = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/tribadism/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_tribadism(target)
/datum/interaction/lewd/rimjob
command = "rimjob"
description = "Lick their ass."
interaction_sound = null
require_user_mouth = TRUE
require_target_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/rimjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_rimjob(target)
/datum/interaction/lewd/mountface
command = "mountface"
description = "Ass to face."
interaction_sound = null
require_target_mouth = TRUE
require_user_anus = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/mountface/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_mountface(target)
/datum/interaction/lewd/lickfeet
command = "lickfeet"
description = "Lick their feet."
interaction_sound = null
require_user_mouth = TRUE
require_target_feet = REQUIRE_ANY
require_target_num_feet = 1
max_distance = 1
/datum/interaction/lewd/lickfeet/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_lickfeet(target)
/datum/interaction/lewd/grindface
command = "grindface"
description = "Feet grind their face."
interaction_sound = null
require_target_mouth = TRUE
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
max_distance = 1
/datum/interaction/lewd/grindface/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_grindface(target)
/datum/interaction/lewd/grindmouth
command = "grindmouth"
description = "Feet grind their mouth."
interaction_sound = null
require_target_mouth = TRUE
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
max_distance = 1
/datum/interaction/lewd/grindmouth/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_grindmouth(target)
/datum/interaction/lewd/footfuck
command = "footfuck"
description = "Rub your cock on their foot."
interaction_sound = null
require_target_num_feet = 1
require_target_feet = REQUIRE_ANY
require_user_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/footfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_footfuck(target)
/datum/interaction/lewd/footfuck/double
command = "footfuckdouble"
description = "Rub your cock between their feet."
require_target_num_feet = 2
/datum/interaction/lewd/footfuck/double/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_dfootfuck(target)
/datum/interaction/lewd/footjob
command = "footjob"
description = "Jerk them off with your foot."
interaction_sound = null
require_user_num_feet = 1
require_user_feet = REQUIRE_ANY
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
/datum/interaction/lewd/footjob/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_footjob(target)
/datum/interaction/lewd/footjob/double
command = "footjob_double"
description = "Jerk them off with both of your feet."
require_user_num_feet = 2
/datum/interaction/lewd/footjob/double/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_dfootjob(target)
/datum/interaction/lewd/footjob/vagina
command = "footjob_vaginal"
description = "Rub their vagina with your foot."
require_target_vagina = REQUIRE_EXPOSED
require_target_penis = REQUIRE_NONE
/datum/interaction/lewd/footjob/vagina/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_footjob_v(target)
/datum/interaction/lewd/thighs
command = "thigh_smother"
description = "Smother them."
max_distance = 1
require_user_bottomless = TRUE
require_target_mouth = TRUE
interaction_sound = null
write_log_user = "thigh-trapped"
write_log_target = "was smothered by"
/datum/interaction/lewd/thighs/display_interaction(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
user.thigh_smother(target)
/datum/interaction/lewd/nuts
command = "nut_face"
description = "Nuts to face."
interaction_sound = null
require_user_balls = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
write_log_user = "make-them-suck-their-nuts"
write_log_target = "was made to suck nuts by"
/datum/interaction/lewd/nuts/display_interaction(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
user.nut_face(target)
/datum/interaction/lewd/nut_smack
command = "smack_nuts"
description = "Smack their nuts."
interaction_sound = 'modular_sand/sound/interactions/slap.ogg'
simple_message = "USER slaps TARGET's nuts!"
require_target_balls = REQUIRE_EXPOSED
needs_physical_contact = TRUE
max_distance = 1
write_log_user = "slapped-nuts"
write_log_target = "had their nuts slapped by"
//Weird shit section
/datum/interaction/lewd/earfuck
command = "earfuck"
description = "Fuck their ear."
interaction_sound = null
simple_message = "USER penetrates TARGET's ear!"
require_user_penis = REQUIRE_EXPOSED
require_target_ears = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "earfucked"
write_log_target = "had their ear fucked by"
extreme = TRUE
/datum/interaction/lewd/earfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_earfuck(target)
/datum/interaction/lewd/earfuck/earsocketfuck
command = "earsocketfuck"
description = "Fuck their earsocket."
interaction_sound = null
simple_message = "USER penetrates TARGET's earsocket!"
require_user_penis = REQUIRE_EXPOSED
require_target_earsockets = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "earsocket fucked"
write_log_target = "had their earsocket fucked by"
extreme = TRUE
/datum/interaction/lewd/eyefuck
command = "eyefuck"
description = "Fuck their eye."
interaction_sound = null
simple_message = "USER penetrates TARGET's eye!"
require_user_penis = REQUIRE_EXPOSED
require_target_eyes = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "eyefucked"
write_log_target = "had their eye fucked by"
extreme = TRUE
/datum/interaction/lewd/eyefuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
user.do_eyefuck(target)
/datum/interaction/lewd/eyefuck/eyesocketfuck
command = "eyesocketfuck"
description = "Fuck their eyesocket."
interaction_sound = null
simple_message = "USER penetrates TARGET's eyesocket!"
require_user_penis = REQUIRE_EXPOSED
require_target_eyesockets = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "eyesocketfucked"
write_log_target = "had their eyesocket fucked by"
extreme = TRUE
//
@@ -1,99 +0,0 @@
/datum/interaction/lewd/frotting
command = "frotting"
description = "Rub your penis against theirs"
require_user_penis = REQUIRE_EXPOSED
require_target_penis = REQUIRE_EXPOSED
max_distance = 1
write_log_user = "frotted"
write_log_target = "was frotted by"
interaction_sound = null
/datum/interaction/lewd/frotting/display_interaction(mob/living/user, mob/living/target)
user.do_frot(target)
/datum/interaction/lewd/do_breastfeed
command = "do_breastfeed"
description = "Breastfeed them"
require_user_breasts = REQUIRE_EXPOSED
require_target_mouth = TRUE
max_distance = 1
write_log_user = "breastfed"
write_log_target = "was breastfed by"
interaction_sound = null
/datum/interaction/lewd/do_breastfeed/display_interaction(mob/living/user, mob/living/target)
user.do_breastfeed(target)
/**
* Self Interactions!
*/
/datum/interaction/lewd/jack
command = "jack"
description = "Jerk yourself off."
interaction_sound = null
require_user_hands = TRUE
require_user_penis = REQUIRE_EXPOSED
user_is_target = TRUE
max_distance = 0
write_log_user = "jerked off"
write_log_target = null
/datum/interaction/lewd/jack/display_interaction(mob/living/carbon/human/user)
user.do_jackoff(user)
/datum/interaction/lewd/fingerass_self
command = "fingerm_self"
description = "Finger yourself."
interaction_sound = null
require_user_hands = TRUE
require_user_anus = REQUIRE_EXPOSED
user_is_target = TRUE
max_distance = 0
write_log_user = "fingered self"
write_log_target = null
/datum/interaction/lewd/fingerass_self/display_interaction(mob/living/carbon/human/user)
user.do_fingerass_self(user)
/datum/interaction/lewd/finger_self
command = "finger_self"
description = "Finger your own pussy."
require_user_hands = TRUE
require_user_vagina = REQUIRE_EXPOSED
interaction_sound = null
user_is_target = TRUE
max_distance = 0
write_log_user = "fingered own pussy"
write_log_target = null
/datum/interaction/lewd/finger_self/display_interaction(mob/living/carbon/human/user)
user.do_fingering_self(user)
/datum/interaction/lewd/titgrope_self
command = "titgrope_self"
description = "Grope your own breasts."
require_user_hands = TRUE
require_user_breasts = REQUIRE_ANY
user_is_target = TRUE
interaction_sound = null
max_distance = 0
write_log_user = "groped own breasts"
write_log_target = null
/datum/interaction/lewd/titgrope_self/display_interaction(mob/living/carbon/human/user)
user.do_titgrope_self(user)
/datum/interaction/lewd/self_nipsuck
command = "self_nipsuck"
description = "Suck your own nips."
require_user_breasts = REQUIRE_EXPOSED
require_user_mouth = TRUE
user_is_target = TRUE
interaction_sound = null
max_distance = 0
write_log_user = "sucked their own nips"
write_log_target = null
/datum/interaction/lewd/self_nipsuck/display_interaction(mob/living/user, mob/living/target)
user.do_breastfeed(user)
@@ -514,7 +514,7 @@
user.cleartimer = addtimer(CALLBACK(user, /mob/living/proc/clear_lewd_datum), 300, TIMER_STOPPABLE)
return ..()
/mob/living/list_interaction_attributes(var/mob/living/LM)
/mob/living/list_interaction_attributes(mob/living/LM)
var/dat = ..()
if(get_refraction_dif())
dat += "...are sexually exhausted for the time being."
@@ -548,10 +548,13 @@
else
dat += "...have covered eyes."
//
if(is_topless() && is_bottomless())
// check those loops only once, thanks
var/is_topless = is_topless()
var/is_bottomless = is_bottomless()
if(is_topless && is_bottomless)
dat += "...are naked."
else
if((is_topless() && !is_bottomless()) || (!is_topless() && is_bottomless()))
if((is_topless && !is_bottomless) || (!is_topless && is_bottomless))
dat += "...are partially clothed."
else
dat += "...are clothed."
@@ -1,27 +0,0 @@
/**
* Seriously this is the worst way to do this,
* warn me if there's ANY reason i would ever
* use this. Humans have GENITALS, ACTUAL ORGANS,
* we don't need to check booleans!
* If this does not get an use sometime,
* i want this file gone.
*/
/*
/datum/species
var/has_genitals = TRUE //if this goes to 2, blame coders
var/has_anus = TRUE //same with this
var/has_breasts = FALSE
/datum/species/proc/has_penis(mob/living/carbon/human/H)
return has_genitals && H.has_penis
/datum/species/proc/has_vagina(mob/living/carbon/human/H)
return has_genitals && H.has_vagina
/datum/species/proc/has_anus(mob/living/carbon/human/H)
return has_anus
/datum/species/proc/has_breasts(mob/living/carbon/human/H)
return has_breasts
*/
+18 -4
View File
@@ -3879,12 +3879,26 @@
#include "modular_sand\code\datums\interactions\interaction_interface.dm"
#include "modular_sand\code\datums\interactions\interaction_mob.dm"
#include "modular_sand\code\datums\interactions\lewd\_lewd.dm"
#include "modular_sand\code\datums\interactions\lewd\_lewd_extra.dm"
#include "modular_sand\code\datums\interactions\lewd\lewd_datums.dm"
#include "modular_sand\code\datums\interactions\lewd\lewd_datums_extra.dm"
#include "modular_sand\code\datums\interactions\lewd\lewd_interactions.dm"
#include "modular_sand\code\datums\interactions\lewd\lewd_species.dm"
#include "modular_sand\code\datums\interactions\lewd\objects.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\breasts.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\facefuck.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\feet.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\finger.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\frotting.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\fuck.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\handjob.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\kiss.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\lick.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\mount.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\nipsuck.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\nuts.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\oral.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\cursed\earfuck.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\cursed\eyefuck.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\self\breasts.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\self\finger.dm"
#include "modular_sand\code\datums\interactions\lewd\interactions\self\jack.dm"
#include "modular_sand\code\datums\mood_events\generic_negative_events.dm"
#include "modular_sand\code\datums\mood_events\needs_events.dm"
#include "modular_sand\code\datums\mutations\combined.dm"