/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("\The [user] gives an intense, lingering kiss to \the [target].")
else
user.visible_message("\The [user] kisses \the [target] deeply.")
/datum/interaction/lewd/titgrope
command = "titgrope"
description = "Grope their breasts."
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("\The [user] gently gropes \the [target]'s breast.",
"\The [user] softly squeezes \the [target]'s breasts.",
"\The [user] grips \the [target]'s breasts.",
"\The [user] runs a few fingers over \the [target]'s breast.",
"\The [user] delicately teases \the [target]'s nipple.",
"\The [user] traces a touch across \the [target]'s breast."))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("\The [user] aggressively gropes \the [target]'s breast.",
"\The [user] grabs \the [target]'s breasts.",
"\The [user] tightly squeezes \the [target]'s breasts.",
"\The [user] slaps at \the [target]'s breasts.",
"\The [user] gropes \the [target]'s breasts roughly."))
if(prob(5 + target.get_lust()))
if(target.a_intent == INTENT_HELP)
user.visible_message(
pick("\The [target] shivers in arousal.",
"\The [target] moans quietly.",
"\The [target] breathes out a soft moan.",
"\The [target] gasps.",
"\The [target] shudders softly.",
"\The [target] trembles as hands run across bare skin."))
if(target.get_lust() < 5)
target.set_lust(5)
if(target.a_intent == INTENT_DISARM)
if (target.restrained())
user.visible_message(
pick("\The [target] twists playfully against the restraints.",
"\The [target] squirms away from [user]'s hand.",
"\The [target] slides back from [user]'s roaming hand.",
"\The [target] thrusts bare breasts forward into [user]'s hands."))
else
user.visible_message(
pick("\The [target] playfully bats at [user]'s hand.",
"\The [target] squirms away from [user]'s hand.",
"\The [target] guides [user]'s hand across bare breasts.",
"\The [target] teasingly laces a few fingers over [user]'s knuckles."))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("\The [target] grips [user]'s wrist tight.",
"\The [target] digs nails into [user]'s arm.",
"\The [target] grabs [user]'s wrist for a second."))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("\The [target] pushes [user] roughly away.",
"\The [target] digs nails angrily into [user]'s arm.",
"\The [target] fiercely struggles against [user].",
"\The [target] claws [user]'s forearm, drawing blood.",
"\The [target] slaps [user]'s hand away."))
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("\The [user] gently sucks on \the [target]'s [pick("nipple", "nipples")].",
"\The [user] gently nibs \the [target]'s [pick("nipple", "nipples")].",
"\The [user] licks \the [target]'s [pick("nipple", "nipples")]."))
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
if("i")
modifier = 4
if("j")
modifier = 5
else
modifier = 1
target.reagents.add_reagent(/datum/reagent/consumable/milk, rand(1,2 * modifier))
if(user.a_intent == INTENT_HARM)
user.visible_message(
pick("\The [user] bites \the [target]'s [pick("nipple", "nipples")].",
"\The [user] aggressively sucks \the [target]'s [pick("nipple", "nipples")]."))
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
if("i")
modifier = 4
if("j")
modifier = 5
else
modifier = 1
target.reagents.add_reagent(/datum/reagent/consumable/milk, rand(1,3 * modifier)) //aggressive sucking leads to high rewards
if(user.a_intent == INTENT_GRAB)
user.visible_message(
pick("\The [user] sucks \the [target]'s [pick("nipple", "nipples")] intently.",
"\The [user] feasts \the [target]'s [pick("nipple", "nipples")].",
"\The [user] glomps \the [target]'s [pick("nipple", "nipples")]."))
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
if("i")
modifier = 4
if("j")
modifier = 5
else
modifier = 1
target.reagents.add_reagent(/datum/reagent/consumable/milk, 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("\The [target] shivers in arousal.",
"\The [target] moans quietly.",
"\The [target] breathes out a soft moan.",
"\The [target] gasps.",
"\The [target] shudders softly.",
"\The [target] trembles as their chest gets molested."))
else
user.visible_message(
pick("\The [target] shivers in arousal.",
"\The [target] moans quietly.",
"\The [target] breathes out a soft moan.",
"\The [target] gasps.",
"\The [target] shudders softly.",
"\The [target] trembles as their breasts get molested.",
"\The [target] quivers in arousal as \the [user] delights themselves on their milk."))
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("\The [target] twists playfully against the restraints.",
"\The [target] squirms away from \the [user]'s mouth.",
"\The [target] slides back from \the [user]'s mouth.",
"\The [target] thrusts their bare chest forward into \the [user]'s mouth."))
else
user.visible_message(
pick("\The [target] twists playfully against the restraints.",
"\The [target] squirms away from \the [user]'s mouth.",
"\The [target] slides back from \the [user]'s mouth.",
"\The [target] thrust their bare breasts forward into \the [user]'s mouth."))
else
if(!target.has_breasts())
user.visible_message(
pick("\The [target] playfully shoos away \the [user]'s head.",
"\The [target] squirms away from \the [user]'s mouth.",
"\The [target] holds \the [user]'s head against their chest.",
"\The [target] teasingly caresses \the [user]'s neck."))
else
user.visible_message(
pick("\The [target] playfully shoos away \the [user]'s head.",
"\The [target] squirms away from \the [user]'s mouth.",
"\The [target] holds \the [user]'s head against their breast.",
"\The [target] teasingly caresses \the [user]'s neck.",
"\The [target] rubs their breasts against \the [user]'s head."))
if(target.get_lust() < 10)
target.add_lust(1)
if(target.a_intent == INTENT_GRAB)
user.visible_message(
pick("\The [target] grips \the [user]'s head tight.",
"\The [target] digs nails into \the [user]'s scalp.",
"\The [target] grabs and shoves \the [user]'s head away."))
if(target.a_intent == INTENT_HARM)
user.adjustBruteLoss(1)
user.visible_message(
pick("\The [target] slaps \the [user] away.",
"\The [target] scratches [user]'s face.",
"\The [target] fiercely struggles against [user].",
"\The [target] claws [user]'s face, drawing blood.",
"\The [target] elbows [user]'s mouth away."))
target.dir = get_dir(target, user)
user.dir = get_dir(user, target)
playlewdinteractionsound(user.loc, pick('sandcode/sound/interactions/oral1.ogg',
'sandcode/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
user_not_tired = TRUE
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
target_not_tired = TRUE
/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
user_not_tired = TRUE
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
user_not_tired = TRUE
/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 = REQUIRE_ANY
require_target_vagina = REQUIRE_EXPOSED
interaction_sound = null
user_not_tired = TRUE
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 = REQUIRE_ANY
require_target_anus = REQUIRE_EXPOSED
user_not_tired = TRUE
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
user_not_tired = 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
user_not_tired = 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
target_not_tired = TRUE
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
user_not_tired = TRUE
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
user_not_tired = TRUE
target_not_tired = TRUE
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
user_not_tired = TRUE
target_not_tired = TRUE
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
user_not_tired = TRUE
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
user_not_tired = TRUE
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
user_not_tired = TRUE
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
user_not_tired = TRUE
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
target_not_tired = TRUE
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
user_not_tired = TRUE
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 = 'sandcode/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
//